FishPlayer

一个喜欢摸鱼的废物

0%

查询MonoBehaviour在工程中的引用

以前弄过一个在项目中查找Asset引用的。虽然很泛用,但跑起来非常的慢。
其实我们实际使用的时候,我们会经常做某一种搜索(比如查找脚本在预制体上的引用)。对于这种需要使用的特定条件的查找,单独做一个小工具可能效率会更高。

本来还在烦恼怎么做,导师很快就做好了,跑起来很快。他告诉我,秘诀是 GetComponent。

思路

代码不方便直接贴出来,但还是想分享(记录)一下几个关键的步骤和思路~

选择脚本

我们需要在编辑器上用一个 field 去放我们想要搜寻的脚本。
但是没办法是用在泛型类上。需要指定实际的类型。

Interface也可以查,放心用!

1
2
3
4
5
6
7
8

targetScript = EditorGUILayout.ObjectField(m_targetScript, typeof(MonoScript), false) as MonoScript;

/*
class SomeMono<TData> : MonoBehaviour
doesnt work on this case, the result will be null
*/
Type targetType = m_targetScript.GetClass();

获取预制体

从我们选择的目录下获取所有的prefab,相信Unity,这一步不会很慢的。

1
2
3
4
5
6
7

// we can also set the folderPath to save our time :D

var paths = AssetDatabase.FindAssets($"t: prefab", new[] { folderPath });
GameObject[] toCheck = new GameObject[paths.Length];
for (int i = 0; i < paths.Length; i++)
toCheck[i] = AssetDatabase.LoadAssetAtPath<GameObject>(AssetDatabase.GUIDToAssetPath(paths[i]));

查询引用

1
2
3
4
5

Type targetType;
GameObject prefab;
var components = prefab.GetComponents(targetType);
// if components is not empty, then you get your stuff :D

总结

如果要说学到了什么的话,大概是做工具前要搞明白它的使用情景,不能太脱节Tw.T