我是靠谱客的博主 洁净小鸭子,这篇文章主要介绍【Unity Editor】使用AssetDatabase.GetDependencies查看/搜索所有资源引用详情(升级版),现在分享给大家,希望可以做个参考。
实现功能:
1. 查找引用方
查看某个文件引用的所有资源
2. 查找被引用方
查看某个资源的被引用关系
3. 引用关系列表
查看所有资源的引用关系,可以按名字搜索,查看引用详情
4. 被引用关系列表
查看所有资源的被引用关系,按文件后缀名分类,可以按名字搜索,查看被引用详情
5. 直接/递归引用
可以选择只查看直接引用(直接依赖关系),也可以查看递归引用(间接依赖关系)
功能代码:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.IO; using System.Linq; public class AssetDependenciesTool : EditorWindow { //--- 固定数据 --- private readonly Color listItemColor = new Color(0.9f,0.9f,0.9f,1); private readonly string[] displayBarArray = new string[] { "查找引用方","查找被引用方","引用关系","被引用关系" }; //--- 初始数据 --- //Prefab/Scene的引用资源 private Dictionary<string,string[]> prefabDependDic = new Dictionary<string,string[]>(); //被Prefab/Scene引用的资源 private Dictionary<string,string[]> assetRelatedDic = new Dictionary<string,string[]>(); //Prefab/Scene的名字 private string[] prefabNameArray; //资源类型、名字 private string[] assetExtentArray; private Dictionary<string,string[]> assetExtentNameDic; //--- 变化数据 --- //==================== private static bool recursiveFind = false; [MenuItem("MyTools/资源引用关系/查看直接引用",priority = EditorCommon.assetDependPriority)] public static void FindAssetsDependencies1() { recursiveFind = false; GetWindow<AssetDependenciesTool>(true,"查找资源引用关系-直接引用"); } [MenuItem("MyTools/资源引用关系/查看递归引用",priority = EditorCommon.assetDependPriority)] public static void FindAssetsDependencies2() { recursiveFind = true; GetWindow<AssetDependenciesTool>(true,"查找资源引用关系-递归引用"); } private void OnEnable() { FindAllPrefabDependencies(ref prefabDependDic,ref assetRelatedDic,out prefabNameArray,out assetExtentArray,out assetExtentNameDic); } private int displayIndex = 0; private void OnGUI() { EditorGUILayout.BeginVertical("box"); EditorGUILayout.LabelField("资源引用方数量 : " + prefabDependDic.Count); EditorGUILayout.LabelField("资源被引用方数量 : " + assetRelatedDic.Count); EditorGUILayout.LabelField("所统计的资源引用关系,不包含代码动态加载"); EditorGUILayout.EndVertical(); displayIndex = GUILayout.Toolbar(displayIndex,displayBarArray); switch(displayIndex) { case 0: OnGUI_FindPrefab(); break; case 1: OnGUI_FindAssets(); break; case 2: OnGUI_AllPrefab(); break; case 3: OnGUI_AllAssets(); break; default: break; } } //查找某个Prefab/Scene引用的所有资源 Object selectPrefabObject; PrefabDependItem selectPrefabDependItem; private void OnGUI_FindPrefab() { EditorGUILayout.BeginHorizontal(); selectPrefabObject = EditorGUILayout.ObjectField("引用资源:",selectPrefabObject,typeof(Object),true,GUILayout.Width(600)); if(GUILayout.Button("分析引用详情",GUILayout.Width(100))) { if(selectPrefabObject != null) { string prefabPath = AssetDatabase.GetAssetPath(selectPrefabObject); prefabDependDic.TryGetValue(prefabPath,out var depPathArray); selectPrefabDependItem = new PrefabDependItem(prefabPath,depPathArray); } } EditorGUILayout.EndHorizontal(); OnGUI_PrefabDetial(ref selectPrefabDependItem); } //查找某个资源被哪些Prefab/Scene引用 Object selectAssetObject; AssetRelatedItem selectAssetRelatedItem; private void OnGUI_FindAssets() { EditorGUILayout.BeginHorizontal(); selectAssetObject = EditorGUILayout.ObjectField("被引用资源:",selectAssetObject,typeof(Object),true,GUILayout.Width(600)); if(GUILayout.Button("分析被引用详情",GUILayout.Width(100))) { if(selectAssetObject != null) { string assetPath = AssetDatabase.GetAssetPath(selectAssetObject); assetRelatedDic.TryGetValue(assetPath,out var depPathArray); selectAssetRelatedItem = new AssetRelatedItem(assetPath,depPathArray); } } EditorGUILayout.EndHorizontal(); OnGUI_AssetDetial(ref selectAssetRelatedItem); } int showPageIndex1 = 0; string searchPrefabNameSign; bool isSearchPrefabName; Vector2 scrollViewPos03; Vector2 scrollViewPos031; PrefabDependItem previewPrefabDependItem; private void OnGUI_AllPrefab() { EditorGUILayout.BeginHorizontal("box"); EditorGUILayout.LabelField("搜索关键字(仅搜索当前页!!!):",GUILayout.Width(200)); searchPrefabNameSign = EditorGUILayout.TextField(searchPrefabNameSign,GUILayout.Width(200)); isSearchPrefabName = !string.IsNullOrEmpty(searchPrefabNameSign); EditorGUILayout.EndHorizontal(); scrollViewPos03 = EditorGUILayout.BeginScrollView(scrollViewPos03); for(int i = showPageIndex1; i < showPageIndex1 + 100; i++) { if(i >= prefabNameArray.Length) break; string prefabPath = prefabNameArray[i]; if(isSearchPrefabName && !prefabPath.Contains(searchPrefabNameSign)) continue; EditorGUILayout.BeginHorizontal("box"); EditorGUILayout.LabelField($"{i}. 资源文件名: {prefabPath}"); EditorGUILayout.LabelField($"引用数量: { prefabDependDic[prefabPath].Length}",GUILayout.Width(200)); if(GUILayout.Button("查看引用详情",GUILayout.Width(100))) { prefabDependDic.TryGetValue(prefabPath,out var depPathArray); previewPrefabDependItem = new PrefabDependItem(prefabPath,depPathArray); } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); OnGUI_PrefabDetial(ref previewPrefabDependItem); EditorGUILayout.BeginHorizontal(); if(GUILayout.Button("首页",GUILayout.Width(100))) { showPageIndex1 = 0; } if(GUILayout.Button("上一页",GUILayout.Width(100))) { showPageIndex1 -= 100; if(showPageIndex1 < 0) showPageIndex1 = 0; } EditorGUILayout.LabelField($"{showPageIndex1}/{prefabNameArray.Length}",GUILayout.Width(100)); if(GUILayout.Button("下一页",GUILayout.Width(100))) { if((showPageIndex1 + 100) < prefabNameArray.Length) showPageIndex1 += 100; } if(GUILayout.Button("尾页",GUILayout.Width(100))) { showPageIndex1 = prefabNameArray.Length / 100 * 100; } EditorGUILayout.EndHorizontal(); } int showPageIndex2 = 0; int selectExtentIndex = -1; string searchAssetNameSign; bool isSearchAssetName; Vector2 scrollViewPos04; Vector2 scrollViewPos041; AssetRelatedItem previewAssetRelatedItem; private void OnGUI_AllAssets() { selectExtentIndex = EditorGUILayout.Popup("查找资源类型 : ",selectExtentIndex,assetExtentArray,GUILayout.MaxWidth(300)); if(selectExtentIndex < 0 || selectExtentIndex >= assetExtentArray.Length) return; EditorGUILayout.BeginHorizontal("box"); EditorGUILayout.LabelField("搜索关键字(仅搜索当前页!!!):",GUILayout.Width(200)); searchAssetNameSign = EditorGUILayout.TextField(searchAssetNameSign,GUILayout.Width(200)); isSearchAssetName = !string.IsNullOrEmpty(searchAssetNameSign); EditorGUILayout.EndHorizontal(); scrollViewPos04 = EditorGUILayout.BeginScrollView(scrollViewPos04); var nameArray = assetExtentNameDic[assetExtentArray[selectExtentIndex]]; for(int i = showPageIndex2; i < showPageIndex2 + 100; i++) { if(i >= nameArray.Length) break; string assetPath = nameArray[i]; if(isSearchAssetName && !assetPath.Contains(searchAssetNameSign)) continue; EditorGUILayout.BeginHorizontal("box"); EditorGUILayout.LabelField($"{i}. 资源文件名: {assetPath}"); EditorGUILayout.LabelField($"被引用次数: { assetRelatedDic[assetPath].Length}",GUILayout.Width(200)); if(GUILayout.Button("查看引用详情",GUILayout.Width(100))) { assetRelatedDic.TryGetValue(assetPath,out var depPathArray); previewAssetRelatedItem = new AssetRelatedItem(assetPath,depPathArray); } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); OnGUI_AssetDetial(ref previewAssetRelatedItem); EditorGUILayout.BeginHorizontal(); if(GUILayout.Button("首页",GUILayout.Width(100))) { showPageIndex2 = 0; } if(GUILayout.Button("上一页",GUILayout.Width(100))) { showPageIndex2 -= 100; if(showPageIndex2 < 0) showPageIndex2 = 0; } EditorGUILayout.LabelField($"{showPageIndex2}/{nameArray.Length}",GUILayout.Width(100)); if(GUILayout.Button("下一页",GUILayout.Width(100))) { if((showPageIndex2 + 100) < nameArray.Length) showPageIndex2 += 100; } if(GUILayout.Button("尾页",GUILayout.Width(100))) { showPageIndex2 = nameArray.Length / 100 * 100; } EditorGUILayout.EndHorizontal(); } private void OnGUI_PrefabDetial(ref PrefabDependItem prefabDependItem) { EditorGUILayout.Space(5); if(prefabDependItem != null) { EditorGUILayout.BeginVertical("box"); if(GUILayout.Button("关闭引用详情",GUILayout.Width(100))) { prefabDependItem = null; } EditorGUILayout.Space(2); scrollViewPos031 = EditorGUILayout.BeginScrollView(scrollViewPos031,GUILayout.Height(500)); EditorGUILayout.ObjectField("引用方:",prefabDependItem.prefabObject,typeof(Object),true,GUILayout.Width(400)); EditorGUILayout.Space(5); EditorGUILayout.LabelField("被引用方列表:"); for(int i = 0; i < prefabDependItem.dependObjectArray.Length; i++) { EditorGUILayout.Space(2); EditorGUILayout.ObjectField($"({i}) 被引用方:",prefabDependItem.dependObjectArray[i],typeof(Object),true,GUILayout.Width(400)); } EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); } EditorGUILayout.Space(5); } private void OnGUI_AssetDetial(ref AssetRelatedItem assetRelatedItem) { EditorGUILayout.Space(5); if(assetRelatedItem != null) { EditorGUILayout.BeginVertical("box"); if(GUILayout.Button("关闭引用详情",GUILayout.Width(100))) { assetRelatedItem = null; } EditorGUILayout.Space(2); scrollViewPos041 = EditorGUILayout.BeginScrollView(scrollViewPos041,GUILayout.Height(500)); EditorGUILayout.ObjectField("被引用方:",assetRelatedItem.assetObject,typeof(Object),true,GUILayout.Width(400)); EditorGUILayout.Space(5); EditorGUILayout.LabelField("引用方列表:"); for(int i = 0; i < assetRelatedItem.relatedObjectArray.Length; i++) { EditorGUILayout.Space(2); EditorGUILayout.ObjectField($"({i}) 引用方:",assetRelatedItem.relatedObjectArray[i],typeof(Object),true,GUILayout.Width(400)); } EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); } EditorGUILayout.Space(5); } //========== //准备初始数据 private void FindAllPrefabDependencies(ref Dictionary<string,string[]> _prefabDependDic,ref Dictionary<string,string[]> _assetRelatedDic,out string[] _prefabNameArray,out string[] _assetExtentArray,out Dictionary<string,string[]> _assetExtentNameDic) { EditorUtility.DisplayProgressBar("读取项目所有资源","读取所有资源",0); //string[] allFilePathArray = Directory.GetFiles(Application.dataPath,"*.*",SearchOption.AllDirectories); string[] allFilePathArray = AssetDatabase.GetAllAssetPaths(); EditorUtility.ClearProgressBar(); //---------- _prefabDependDic.Clear(); EditorUtility.DisplayProgressBar("获取资源引用关系","遍历所有资源",0); for(int i = 0; i < allFilePathArray.Length; i++) { if(i % 100 == 0) { //间隔刷新UI提示框 if(EditorUtility.DisplayCancelableProgressBar("获取资源引用关系",$"遍历所有文件 : {i}/{allFilePathArray.Length}",(float)i / allFilePathArray.Length)) break; } _prefabDependDic[allFilePathArray[i]] = AssetDatabase.GetDependencies(allFilePathArray[i],recursiveFind); } EditorUtility.DisplayProgressBar("读取项目所有资源","资源引用排序",0); _prefabDependDic = _prefabDependDic.OrderBy(item => item.Value.Length).ToDictionary(item => item.Key,item => item.Value); EditorUtility.ClearProgressBar(); //---------- EditorUtility.DisplayProgressBar("反向解析引用关系","遍历所有资源",0); Dictionary<string,List<string>> tempAssetDic = new Dictionary<string,List<string>>(); for(int i = 0; i < allFilePathArray.Length; i++) { if(i % 200 == 0) { //间隔刷新UI提示框 if(EditorUtility.DisplayCancelableProgressBar("反向解析引用关系",$"遍历所有文件 : {i}/{allFilePathArray.Length}",(float)i / allFilePathArray.Length)) break; } if(!tempAssetDic.TryGetValue(allFilePathArray[i],out var relList)) { relList = tempAssetDic[allFilePathArray[i]] = new List<string>(); } foreach(var item in _prefabDependDic) { if(item.Value.Contains(allFilePathArray[i])) { relList.Add(item.Key); } } } EditorUtility.DisplayProgressBar("反向解析引用关系","资源引用排序",0); _assetRelatedDic.Clear(); foreach(var item in tempAssetDic) { _assetRelatedDic[item.Key] = item.Value.ToArray(); } _assetRelatedDic = _assetRelatedDic.OrderBy(item => item.Value.Length).ToDictionary(item => item.Key,item => item.Value); EditorUtility.ClearProgressBar(); //---------- EditorUtility.DisplayProgressBar("读取引用资源类型","获取所有引用文件类型",0); var tempExtentDic = new Dictionary<string,List<string>>(); foreach(var assetName in _assetRelatedDic.Keys) { string assetExtent = Path.GetExtension(assetName); if(!tempExtentDic.TryGetValue(assetExtent,out var nameList)) { nameList = tempExtentDic[assetExtent] = new List<string>(); } nameList.Add(assetName); } _assetExtentNameDic = new Dictionary<string,string[]>(tempExtentDic.Count); foreach(var item in tempExtentDic) { _assetExtentNameDic[item.Key] = item.Value.ToArray(); } _assetExtentArray = tempExtentDic.Keys.ToArray(); _prefabNameArray = _prefabDependDic.Keys.ToArray(); EditorUtility.ClearProgressBar(); } //========== //查找某个Prefab/Scene引用的所有资源 public class PrefabDependItem { private string prefabPath; private string[] dependPathArray; public Object prefabObject; public Object[] dependObjectArray; public PrefabDependItem(string _prefabPath,string[] _dependPathArray) { prefabPath = _prefabPath; dependPathArray = _dependPathArray; LoadDependObjects(); } private void LoadDependObjects() { prefabObject = AssetDatabase.LoadAssetAtPath<Object>(prefabPath); if(dependPathArray == null || dependPathArray.Length == 0) { dependObjectArray = new Object[0]; return; } dependObjectArray = new Object[dependPathArray.Length]; for(int i = 0; i < dependPathArray.Length; i++) { if(EditorUtility.DisplayCancelableProgressBar("加载引用该资源的Prefab|Scene",$"加载进度 : {i}/{dependPathArray.Length}",(float)i / dependPathArray.Length)) { EditorUtility.ClearProgressBar(); return; } Object tempObj = AssetDatabase.LoadAssetAtPath<Object>(dependPathArray[i]); dependObjectArray[i] = tempObj; } EditorUtility.ClearProgressBar(); } } //查找某个资源被哪些Prefab/Scene引用 public class AssetRelatedItem { private string assetPath; private string[] relatedPathArray; public Object assetObject; public Object[] relatedObjectArray; public AssetRelatedItem(string _assetPath,string[] _relatedPathArray) { assetPath = _assetPath; relatedPathArray = _relatedPathArray; LoadRelatedObjects(); } private void LoadRelatedObjects() { assetObject = AssetDatabase.LoadAssetAtPath<Object>(assetPath); if(relatedPathArray == null || relatedPathArray.Length == 0) { relatedObjectArray = new Object[0]; return; } relatedObjectArray = new Object[relatedPathArray.Length]; for(int i = 0; i < relatedPathArray.Length; i++) { if(EditorUtility.DisplayCancelableProgressBar("加载引用该资源的Prefab|Scene",$"加载进度 : {i}/{relatedPathArray.Length}",(float)i / relatedPathArray.Length)) { EditorUtility.ClearProgressBar(); return; } Object tempObj = AssetDatabase.LoadAssetAtPath<Object>(relatedPathArray[i]); relatedObjectArray[i] = tempObj; } EditorUtility.ClearProgressBar(); } } }
旧版实现:
【UnityEditor】使用AssetDatabase.GetDependencies分析资源引用关系
最后
以上就是洁净小鸭子最近收集整理的关于【Unity Editor】使用AssetDatabase.GetDependencies查看/搜索所有资源引用详情(升级版)的全部内容,更多相关【Unity内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复