前段时间美术准备把项目中的PSD都替换成PNG或JPG,然后提了个需求:希望把依赖查找的结果,可视化显示出来。
项目里有个反向查找依赖的工具(找一个资源被哪些资源引用了),当时做的时候,是把查找结果以Log的形式输出到Console了。美术要替换贴图的话需要一个个点Log,然后再选中要修改的Material替换贴图。
现在他们想要的是,把结果集中显示出来,可以直接编辑修改。其实这个功能就是Assets/Select Dependencies实现的效果。

有先例就好办,反编译看下Select Dependencies是用了什么方法显示的,拿来直接用就好了。然而事情没这么简单,翻了几十个Editor文件也没找到Select Dependencies菜单的位置Orz…。幸好最后看到几个ProejctXXX文件,在里面找到了接口。
话不多说,一波反射搞定。
public static class ProjectTool{ private static Dynamic _util;// private static Dynamic _staticBrowser;
static ProjectTool() {
_util = new Dynamic(typeof(ProjectWindowUtil));// _staticBrowser = assemblies.GetType("UnityEditor.ProjectBrowser");
} /// <summary>
/// Project中筛选显示指定的资源
/// TwoColumns模式下,会将资源集中到一起;
/// OneColumn模式下,仅选中资源。
/// </summary>
/// <param name="instanceIds">要显示的资源id,通过ObjectGetInstanceID()获取</param>
public static void FilterShowAssets(int[] instanceIds) { object obj = _util.CallPrivateStaticMethod("GetProjectBrowserIfExists"); if (null != obj)
{
Dynamic browser = new Dynamic(obj); if ((int) browser.PrivateInstanceField("m_ViewMode") == 1)
{
browser.CallPrivateInstanceMethod("ShowObjectsInList", instanceIds); return;
}
}
Selection.instanceIDs = instanceIds;// _staticBrowser.CallPrivateStaticMethod("ShowSelectedObjectsInLastInteractedProjectBrowser");
}
}小注:反射步骤主要用到了一个Dynamic类,它是我借鉴 .Net 4.0的dynamic类型魔改的。作用是,稍微简化反射的代码量。
作者:_Walker__
链接:https://www.jianshu.com/p/f56ebfb3d138

随时随地看视频