# 前言
为了优化性能,提高我们游戏在 PS4 上的运行效率,这几天项目主程一直在测试。包括测试单独将主角导出,然后使用 Assetbandle 进行加载的方式。不过有一个问题就是:主角的依赖了很多很多 “不明物体”。一个个找起来,甚至都不知掉怎么引用过来的了。
于是昨天对我说,我对 Unity 的编辑器挺熟,希望做一个树形引用结构的显示工具。
比如有 A 物体需要依赖 B, 然后 B 又会依赖 C,C->D..... 如此层层依赖,按照树形结构来看,才是最合适的。
虽然快要离开了,不过这方面确实是我所擅长,看起来貌似也不是很麻烦,于是就吭吭哧哧开始了。
# 分析及实现
既然是树形结构,那么想来递归应当是最合适的了,在下最先想到就是这个。
那么就没啥好说的了,首先就是建立一个类,用于递归存放数据,这儿我就把它叫做 “RefItem”。
public class RefItem | |
{ | |
public Object _object; | |
public string _path; | |
public bool _fold; | |
public List<RefItem> _refList = new List<RefItem>(); | |
public void InitRef(Object o) | |
{ | |
_object = o; | |
_path = AssetDatabase.GetAssetPath(o); | |
string[] paths = AssetDatabase.GetDependencies(_path, false); | |
for (int i = 0; i < paths.Length; i++) | |
{ | |
RefItem item = new RefItem(); | |
item.InitRef(AssetDatabase.LoadAssetAtPath(paths[i], typeof(Object))); | |
_refList.Add(item); | |
} | |
} | |
} |
很简单的一个类不是?
主要保存下物体引用,路径(便于显示),再加上一个下一级引用列表就好了。——_fold 主要是 UI 界面使用俩判断折叠的,可略。
然后,我们使用一个 Unity 自带的编辑器方法 "AssetDatabase.GetDependencies" 获取单个物体的直接引用,一级一级下去就好了。递归就是上面 InitRef 方法实现。
然后顶级只需要 New 一个 RefItem,传入一个 Object 作为初始物体,这个链表级的类就会被填充完成.......
啊.... 不想解释了!反正我知道就算详细解释了也没人看,自己估计看都不用看...... 而使用的人.... 都直接使用了还关心这个?算了,传到 GitHub 上去算了吧。
(那么,你看见这句话了吗?)
# 使用
那么,简单介绍一下使用方式吧。
对着需要查找引用的物体,点击鼠标右键 ->FindRefernces 即可。
如图:
除此之外,在菜单上的 Tools->Open Refernces Find Window 也可以直接打开该界面... 就是这样。
我放在 Github 上的场景,添加了一个示例,右键 Example 中的 Object 文件,便可以查看到如下引用:
另外,菜单上还有几个选项,比如查找模式和显示模式等。
显示模式主要影响显示排版,而查找模式.... 则是因为刚开始误会了主程的意思,多做出来的一个功能:显示引用文件的目录结构。
因为考虑到有时候没准也有用,所以就留着了。
# 源码
Github 地址: https://github.com/CWHISME/UnityReferencesTree