6
6
using UnityEditor ;
7
7
namespace Spiral . EditorTools . DeadScriptsSearcher
8
8
{
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
10
16
{
11
17
public bool debug = true ;
12
18
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
+
14
23
private SceneFile sceneFile = null ;
15
24
16
25
public bool sceneFileLoaded
@@ -27,13 +36,7 @@ public bool sceneFileLoaded
27
36
28
37
public void SelectDeads ( )
29
38
{
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 ) ;
37
40
}
38
41
39
42
public void UpdateDeadList ( )
@@ -43,8 +46,8 @@ public void UpdateDeadList()
43
46
int count = objects . Count ;
44
47
45
48
// Чистим лист объектов с мёртвыми скриптами
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 ( ) ;
48
51
49
52
// Идём по списку
50
53
for ( int i = 0 ; i < count ; i ++ )
@@ -56,11 +59,11 @@ public void UpdateDeadList()
56
59
57
60
// если на объекте есть мёртвые скрипты - добавляем ObjectID в список
58
61
ObjectID objectID = new ObjectID ( go , debug ) ;
59
- deadIDs . Add ( objectID ) ;
62
+ deadOIDs . Add ( objectID ) ;
60
63
}
61
64
62
65
// если не найдены
63
- if ( deadIDs . Count == 0 )
66
+ if ( deadOIDs . Count == 0 )
64
67
{
65
68
Debug . Log ( $ "<color=green>Everything is okay :)</color>") ;
66
69
}
@@ -75,13 +78,11 @@ public void SearchForDeads()
75
78
sceneFile = new SceneFile ( ) ;
76
79
77
80
// шерстим гиды мёртвых
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 ++ )
82
83
{
83
84
// какой объект мы сейчас инспектируем
84
- ObjectID oid = deadIDs [ i ] ;
85
+ ObjectID oid = deadOIDs [ i ] ;
85
86
86
87
// пытаемся взять список компонентных GID'ов для данного объекта
87
88
List < ulong > componentGIDs = sceneFile . GetCGIDs ( oid , debug ) ;
@@ -111,105 +112,34 @@ public void SearchForDeads()
111
112
string guid = sceneFile . GetGUID ( gid , debug ) ;
112
113
113
114
if ( string . IsNullOrEmpty ( guid ) ) // GUID не был найден
114
- continue ;
115
+ continue ;
115
116
116
- if ( deadGUIDs . Contains ( guid ) ) // такой GUID уже зарегистрирован в списке мёртвых GUID'ов
117
+ int guidIDX = deadGUIDs . FindIndex ( x => x . guid == guid ) ;
118
+ if ( guidIDX >= 0 )
117
119
{
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 ) ;
121
131
}
122
-
123
- deadGUIDs . Add ( guid ) ;
124
- deadCounts . Add ( 1 ) ;
125
132
}
126
133
}
127
134
128
- // Этот участок кода сработает независимо от того, включен DEBUG или нет!
129
- for ( int i = 0 ; i < deadGUIDs . Count ; i ++ )
135
+ if ( debug )
130
136
{
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
+ }
193
142
}
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 ( ) ;
213
143
}
214
144
}
215
145
}
0 commit comments