Skip to content

Commit da6e4d5

Browse files
author
BlackSpiral15
committed
Implemented as EditorWindow
also some localization added to
1 parent e0ed398 commit da6e4d5

File tree

10 files changed

+388
-240
lines changed

10 files changed

+388
-240
lines changed

Assets/DeadScriptsSearcher/Examples/DemoBroken.unity

Lines changed: 2 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1985,7 +1985,7 @@ Transform:
19851985
m_LocalScale: {x: 1, y: 1, z: 1}
19861986
m_Children: []
19871987
m_Father: {fileID: 0}
1988-
m_RootOrder: 5
1988+
m_RootOrder: 4
19891989
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
19901990
--- !u!1 &437272557
19911991
GameObject:
@@ -36319,7 +36319,7 @@ Transform:
3631936319
- {fileID: 1375377432}
3632036320
- {fileID: 1468140336}
3632136321
m_Father: {fileID: 0}
36322-
m_RootOrder: 6
36322+
m_RootOrder: 5
3632336323
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
3632436324
--- !u!1 &1564660553
3632536325
GameObject:
@@ -43415,72 +43415,3 @@ PrefabInstance:
4341543415
objectReference: {fileID: 0}
4341643416
m_RemovedComponents: []
4341743417
m_SourcePrefab: {fileID: 100100000, guid: 9a9eb0b1603513046812dafd763485d5, type: 3}
43418-
--- !u!1001 &8398905860060401118
43419-
PrefabInstance:
43420-
m_ObjectHideFlags: 0
43421-
serializedVersion: 2
43422-
m_Modification:
43423-
m_TransformParent: {fileID: 0}
43424-
m_Modifications:
43425-
- target: {fileID: 3031108712041742833, guid: d4d03528d4ec4044daefa16fdd8b79b4,
43426-
type: 3}
43427-
propertyPath: m_LocalPosition.x
43428-
value: 0
43429-
objectReference: {fileID: 0}
43430-
- target: {fileID: 3031108712041742833, guid: d4d03528d4ec4044daefa16fdd8b79b4,
43431-
type: 3}
43432-
propertyPath: m_LocalPosition.y
43433-
value: 0
43434-
objectReference: {fileID: 0}
43435-
- target: {fileID: 3031108712041742833, guid: d4d03528d4ec4044daefa16fdd8b79b4,
43436-
type: 3}
43437-
propertyPath: m_LocalPosition.z
43438-
value: 0
43439-
objectReference: {fileID: 0}
43440-
- target: {fileID: 3031108712041742833, guid: d4d03528d4ec4044daefa16fdd8b79b4,
43441-
type: 3}
43442-
propertyPath: m_LocalRotation.x
43443-
value: 0
43444-
objectReference: {fileID: 0}
43445-
- target: {fileID: 3031108712041742833, guid: d4d03528d4ec4044daefa16fdd8b79b4,
43446-
type: 3}
43447-
propertyPath: m_LocalRotation.y
43448-
value: 0
43449-
objectReference: {fileID: 0}
43450-
- target: {fileID: 3031108712041742833, guid: d4d03528d4ec4044daefa16fdd8b79b4,
43451-
type: 3}
43452-
propertyPath: m_LocalRotation.z
43453-
value: 0
43454-
objectReference: {fileID: 0}
43455-
- target: {fileID: 3031108712041742833, guid: d4d03528d4ec4044daefa16fdd8b79b4,
43456-
type: 3}
43457-
propertyPath: m_LocalRotation.w
43458-
value: 1
43459-
objectReference: {fileID: 0}
43460-
- target: {fileID: 3031108712041742833, guid: d4d03528d4ec4044daefa16fdd8b79b4,
43461-
type: 3}
43462-
propertyPath: m_RootOrder
43463-
value: 0
43464-
objectReference: {fileID: 0}
43465-
- target: {fileID: 3031108712041742833, guid: d4d03528d4ec4044daefa16fdd8b79b4,
43466-
type: 3}
43467-
propertyPath: m_LocalEulerAnglesHint.x
43468-
value: 0
43469-
objectReference: {fileID: 0}
43470-
- target: {fileID: 3031108712041742833, guid: d4d03528d4ec4044daefa16fdd8b79b4,
43471-
type: 3}
43472-
propertyPath: m_LocalEulerAnglesHint.y
43473-
value: 0
43474-
objectReference: {fileID: 0}
43475-
- target: {fileID: 3031108712041742833, guid: d4d03528d4ec4044daefa16fdd8b79b4,
43476-
type: 3}
43477-
propertyPath: m_LocalEulerAnglesHint.z
43478-
value: 0
43479-
objectReference: {fileID: 0}
43480-
- target: {fileID: 7544126905296030144, guid: d4d03528d4ec4044daefa16fdd8b79b4,
43481-
type: 3}
43482-
propertyPath: m_Name
43483-
value: DeadScripts
43484-
objectReference: {fileID: 0}
43485-
m_RemovedComponents: []
43486-
m_SourcePrefab: {fileID: 100100000, guid: d4d03528d4ec4044daefa16fdd8b79b4, type: 3}

Assets/DeadScriptsSearcher/Prefab.meta

Lines changed: 0 additions & 8 deletions
This file was deleted.

Assets/DeadScriptsSearcher/Prefab/DeadScripts.prefab

Lines changed: 0 additions & 45 deletions
This file was deleted.

Assets/DeadScriptsSearcher/Prefab/DeadScripts.prefab.meta

Lines changed: 0 additions & 7 deletions
This file was deleted.

Assets/DeadScriptsSearcher/Scripts/DeadScripts.cs

Lines changed: 39 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,20 @@
66
using UnityEditor;
77
namespace Spiral.EditorTools.DeadScriptsSearcher
88
{
9-
public class DeadScripts : MonoBehaviour
9+
public struct DeadGUID
10+
{
11+
public string guid;
12+
public List<ObjectID> oids;
13+
}
14+
15+
public class DeadScripts
1016
{
1117
public bool debug = true;
1218

13-
public List<ObjectID> deadIDs { get; private set; } = new List<ObjectID>();
19+
public List<ObjectID> deadOIDs { get; private set; } = new List<ObjectID>();
20+
public List<DeadGUID> deadGUIDs { get; private set; } = new List<DeadGUID>();
21+
22+
1423
private SceneFile sceneFile = null;
1524

1625
public bool sceneFileLoaded
@@ -27,13 +36,7 @@ public bool sceneFileLoaded
2736

2837
public void SelectDeads()
2938
{
30-
List<GameObject> selectObjects = new List<GameObject>();
31-
for (int i = 0; i < deadIDs.Count; i++)
32-
{
33-
if (deadIDs[i].gameObject == null) continue;
34-
selectObjects.Add(deadIDs[i].gameObject);
35-
}
36-
Selection.objects = selectObjects.ToArray();
39+
ObjectID.Select(deadOIDs);
3740
}
3841

3942
public void UpdateDeadList()
@@ -43,8 +46,8 @@ public void UpdateDeadList()
4346
int count = objects.Count;
4447

4548
// Чистим лист объектов с мёртвыми скриптами
46-
if (deadIDs == null) deadIDs = new List<ObjectID>();
47-
else if (deadIDs.Count != 0) deadIDs.Clear();
49+
if (deadOIDs == null) deadOIDs = new List<ObjectID>();
50+
else if (deadOIDs.Count != 0) deadOIDs.Clear();
4851

4952
// Идём по списку
5053
for (int i = 0; i < count; i++)
@@ -56,11 +59,11 @@ public void UpdateDeadList()
5659

5760
// если на объекте есть мёртвые скрипты - добавляем ObjectID в список
5861
ObjectID objectID = new ObjectID(go, debug);
59-
deadIDs.Add(objectID);
62+
deadOIDs.Add(objectID);
6063
}
6164

6265
// если не найдены
63-
if (deadIDs.Count == 0)
66+
if (deadOIDs.Count == 0)
6467
{
6568
Debug.Log($"<color=green>Everything is okay :)</color>");
6669
}
@@ -75,13 +78,11 @@ public void SearchForDeads()
7578
sceneFile = new SceneFile();
7679

7780
// шерстим гиды мёртвых
78-
List<string> deadGUIDs = new List<string>();
79-
List<int> deadCounts = new List<int>();
80-
81-
for (int i = 0; i < deadIDs.Count; i++)
81+
deadGUIDs = new List<DeadGUID>();
82+
for (int i = 0; i < deadOIDs.Count; i++)
8283
{
8384
// какой объект мы сейчас инспектируем
84-
ObjectID oid = deadIDs[i];
85+
ObjectID oid = deadOIDs[i];
8586

8687
// пытаемся взять список компонентных GID'ов для данного объекта
8788
List<ulong> componentGIDs = sceneFile.GetCGIDs(oid, debug);
@@ -111,105 +112,34 @@ public void SearchForDeads()
111112
string guid = sceneFile.GetGUID(gid, debug);
112113

113114
if (string.IsNullOrEmpty(guid)) // GUID не был найден
114-
continue;
115+
continue;
115116

116-
if (deadGUIDs.Contains(guid)) // такой GUID уже зарегистрирован в списке мёртвых GUID'ов
117+
int guidIDX = deadGUIDs.FindIndex(x => x.guid == guid);
118+
if (guidIDX >= 0)
117119
{
118-
int idx = deadGUIDs.FindIndex(x => x == guid);
119-
deadCounts[idx] += 1;
120-
continue;
120+
deadGUIDs[guidIDX].oids.Add(oid);
121+
}
122+
else
123+
{
124+
DeadGUID deadGUID = new DeadGUID
125+
{
126+
guid = guid,
127+
oids = new List<ObjectID>()
128+
};
129+
deadGUID.oids.Add(oid);
130+
deadGUIDs.Add(deadGUID);
121131
}
122-
123-
deadGUIDs.Add(guid);
124-
deadCounts.Add(1);
125132
}
126133
}
127134

128-
// Этот участок кода сработает независимо от того, включен DEBUG или нет!
129-
for (int i = 0; i < deadGUIDs.Count; i++)
135+
if (debug)
130136
{
131-
Debug.Log($"Dead GUID <b>#{i}</b>: <i><color=red>{deadGUIDs[i]}</color></i> (Scripts Broken: {deadCounts[i]})");
132-
}
133-
}
134-
}
135-
136-
[CustomEditor(typeof(DeadScripts))]
137-
public class DeadScriptsEditor : Editor
138-
{
139-
private DeadScripts deadmono = null;
140-
141-
private void OnEnable()
142-
{
143-
deadmono = serializedObject.targetObject as DeadScripts;
144-
}
145-
146-
private void DrawDebugMode()
147-
{
148-
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
149-
EditorGUILayout.LabelField("Режим отладки:", EditorStyles.miniBoldLabel);
150-
deadmono.debug = EditorGUILayout.Toggle("Включить режим отладки", deadmono.debug);
151-
EditorGUILayout.HelpBox("Режим отладки будет выводить в консоль все действия, что может " +
152-
"существенно замедлить осмотр сцен с большим количеством объектов;",
153-
MessageType.Warning);
154-
EditorGUILayout.EndVertical();
155-
}
156-
157-
private void DrawSimpleMode()
158-
{
159-
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
160-
EditorGUILayout.LabelField("Только объекты:", EditorStyles.boldLabel);
161-
if (GUILayout.Button("Найти и выделить"))
162-
{
163-
deadmono.UpdateDeadList();
164-
deadmono.SelectDeads();
165-
}
166-
EditorGUILayout.HelpBox("При нажатии выполняется попытка найти и выделить все " +
167-
"объекты с битыми скриптами, находящиеся на сцене",
168-
MessageType.None);
169-
EditorGUILayout.EndVertical();
170-
}
171-
172-
private void DrawBoxSceneState()
173-
{
174-
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
175-
EditorGUILayout.LabelField("Проверка файла сцены:", EditorStyles.boldLabel);
176-
177-
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
178-
179-
EditorGUILayout.BeginHorizontal(GUI.skin.box);
180-
GUIStyle styleSceneIsDirty = new GUIStyle(EditorStyles.boldLabel);
181-
string sceneIsDirty = deadmono.isDirty ? "СЦЕНА БЫЛА ИЗМЕНЕНА!" : "СЦЕНА СОХРАНЕНА";
182-
styleSceneIsDirty.normal.textColor = deadmono.isDirty ? new Color(0.8f, 0.0f, 0.0f) : Color.gray;
183-
EditorGUILayout.LabelField(sceneIsDirty, styleSceneIsDirty);
184-
EditorGUILayout.EndHorizontal();
185-
EditorGUILayout.HelpBox("Убедитесь, что сцена была сохранена, поскольку поиск будет идти по файлу сцены.\n" +
186-
"Для сцен с большим количеством объектов поиск может идти медленно!",
187-
MessageType.Warning);
188-
EditorGUILayout.EndVertical();
189-
190-
if (GUILayout.Button("Показать мёртвые GUID"))
191-
{
192-
deadmono.SearchForDeads();
137+
for (int i = 0; i < deadGUIDs.Count; i++)
138+
{
139+
Debug.Log($"Dead GUID <b>#{i}</b>: <i><color=red>{deadGUIDs[i]}</color></i> " +
140+
$"(Scripts Broken: {deadGUIDs[i].oids.Count})");
141+
}
193142
}
194-
EditorGUILayout.HelpBox("Поиск идёт по файлу сцены, сопоставляя объекты с битыми скриптами " +
195-
"с их записями в файле. Все результаты будут выведены в консоль. " +
196-
"Обратите внимание, что из поиска исключаются скрипты, " +
197-
"не являющиеся MonoBehaviour, а также дочерние объекты в составе префабов!",
198-
MessageType.None);
199-
200-
EditorGUILayout.EndVertical();
201-
}
202-
203-
public override void OnInspectorGUI()
204-
{
205-
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
206-
EditorGUILayout.LabelField("ПОИСК МЁРТВЫХ СКРИПТОВ:", EditorStyles.boldLabel);
207-
208-
DrawDebugMode();
209-
DrawSimpleMode();
210-
DrawBoxSceneState();
211-
212-
EditorGUILayout.EndVertical();
213143
}
214144
}
215145
}

0 commit comments

Comments
 (0)