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})"); } } }
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(); }