Пример #1
0
        private void ShowDeadGUIDs()
        {
            GUILayoutOption labelOption = GUILayout.Height(20);

            SpiralEditor.BeginPanel(strFoundGUIDs + $"{DeadScripts.deadGUIDs.Count}", true, labelOption);

            if (DeadScripts.deadGUIDs.Count != 0)
            {
                EditorGUI.indentLevel += 1;
                foldoutDeads           = EditorGUILayout.Foldout(foldoutDeads,
                                                                 strShowList,
                                                                 true, SpiralStyles.foldoutNormal);
                EditorGUI.indentLevel -= 1;
            }
            else
            {
                foldoutDeads = false;
            }

            if (foldoutDeads)
            {
                for (int i = 0; i < DeadScripts.deadGUIDs.Count; i++)
                {
                    ComponentGUID dead = DeadScripts.deadGUIDs[i];
                    DrawDeadGUIDEntry(dead);
                }
            }
            SpiralEditor.EndPanel();
        }
        public static void SearchForDeads()
        {
            UpdateDeadList();
            deadGUIDs = new List <ComponentGUID>();

            int count = deadOIDs.Count; // список deadOIDs сформирован функцией UpdateDeadList()

            for (int i = 0; i < count; i++)
            {
                EditorUtility.DisplayProgressBar(strProgressBar_ObjectsFound + $"{count}",
                                                 strProgressBar_InspectedObject + $"{i} / {count}",
                                                 i * 1f / count);
                ObjectID oid = deadOIDs[i];

                // идём по всем компонентам, т.к. у нас списки листов по индексам ассоциированы
                // TODO: возможно, имеет смысл оптимизировать всё, что ниже
                for (int g = 0; g < oid.componentFileIDs.Count; g++)
                {
                    if (oid.componentLiveStatus[g])
                    {
                        continue;                             // пропускаем живые компоненты
                    }
                    string guid = oid.componentGUIDs[g];
                    if (string.IsNullOrEmpty(guid))
                    {
                        continue;                             // пропускаем компоненты из префабов и/или по другим причинам не имеющих GUID
                    }
                    // создаём учётку для этого компонента
                    ulong         fileID     = oid.componentFileIDs[g];
                    ComponentData deadFileID = new ComponentData(fileID, sceneFile);

                    // проверяем, есть ли уже учётка с таким GUID или нет
                    // не путайте GID- и GUID- учётки: первая описывает конкретный экземпляр скрипта,
                    // а вторая - группу скриптов, имеющих одинаковый GUID
                    int guidIDX = deadGUIDs.FindIndex(x => x.guid == guid);
                    if (guidIDX >= 0) // добавляем мёртвый компонент и его объект к уже существующей учётке
                    {
                        deadGUIDs[guidIDX].oids.Add(oid);
                        deadGUIDs[guidIDX].gids.Add(deadFileID);
                    }
                    else // создаём новую GUID-учётку
                    {
                        ComponentGUID deadGUID = new ComponentGUID(guid, true);
                        deadGUIDs.Add(deadGUID);
                        deadGUID.oids.Add(oid);
                        deadGUID.gids.Add(deadFileID);
                    }
                }
            }
            EditorUtility.ClearProgressBar();
            if (isDebugMode)
            {
                for (int i = 0; i < deadGUIDs.Count; i++)
                {
                    Debug.Log($"Dead GUID <b>#{i}</b>: <i><color=red>{deadGUIDs[i]}</color></i> " +
                              $"(Scripts Broken: {deadGUIDs[i].oids.Count})");
                }
            }
        }
Пример #3
0
        private void DrawDeadGUIDEntry(ComponentGUID dead)
        {
            GUILayoutOption labelOption = GUILayout.Height(20);

            SpiralEditor.BeginPanel(GroupType.Vertical);

            EditorGUILayout.SelectableLabel($"GUID: {dead.guid}", GUILayout.MinWidth(250), labelOption);

            string strDeadCount = strDeadObjectsCount + $" {dead.oids.Count}";

            dead.showInfo = EditorGUILayout.Foldout(dead.showInfo, strDeadCount);
            if (dead.showInfo)
            {
                for (int i = 0; i < dead.gids.Count; i++)
                {
                    var dgid   = dead.gids[i];
                    var dgidID = dgid.fileID;

                    string strGID        = $"{dgidID}";
                    string strButtonName = $"#{i} MonoBehaviour ID: {strGID}";
                    if (EditorGUILayout.DropdownButton(new GUIContent(strButtonName), FocusType.Passive))
                    {
                        dgid.showInfo = !dgid.showInfo;
                    }
                    if (dgid.showInfo)
                    {
                        SpiralEditor.BeginPanel(GroupType.Vertical);
                        EditorGUILayout.SelectableLabel(strGID);
                        if (SpiralEditor.Button(strSelectObject))
                        {
                            Selection.objects = new Object[1] {
                                dead.oids[i].gameObject
                            };
                        }
                        GUI.enabled = false;
                        EditorGUILayout.TextArea(dgid.fileEntry);
                        GUI.enabled = true;
                        EditorGUILayout.Space();
                        SpiralEditor.EndPanel();
                    }
                }
            }

            if (SpiralEditor.Button(strSelectObjects))
            {
                ObjectID.Select(dead.oids);
            }

            EditorGUILayout.EndVertical();
        }