# 前言

为了优化性能,提高我们游戏在 PS4 上的运行效率,这几天项目主程一直在测试。包括测试单独将主角导出,然后使用 Assetbandle 进行加载的方式。不过有一个问题就是:主角的依赖了很多很多 “不明物体”。一个个找起来,甚至都不知掉怎么引用过来的了。
于是昨天对我说,我对 Unity 的编辑器挺熟,希望做一个树形引用结构的显示工具。

比如有 A 物体需要依赖 B, 然后 B 又会依赖 C,C->D..... 如此层层依赖,按照树形结构来看,才是最合适的。

虽然快要离开了,不过这方面确实是我所擅长,看起来貌似也不是很麻烦,于是就吭吭哧哧开始了。

# 分析及实现

既然是树形结构,那么想来递归应当是最合适的了,在下最先想到就是这个。
那么就没啥好说的了,首先就是建立一个类,用于递归存放数据,这儿我就把它叫做 “RefItem”。

s
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