本次测试包含对AssetDatabase.GetDependencies和EditorUtility.CollectDependencies这两个获取资源的依赖资源的 API 的测试,以及对于meta残留对打AssetBundle的影响。
输入资源路径,例如Assets/Material/demo.mat,以路径形式返回该资源依赖的资源列表,例如Assets/Texture/demo.jpg。
这个 API 返回的结果是“错误”的,也就是带残留的。比如某个材质,原本的shader引用了4个纹理,然后切换其shader为新的shader使之只引用一个纹理,这时AssetDatabase.GetDependencies返回的结果还是4个纹理。
输入资源对象(UnityEngine.Object),以对象数组的形式返回该资源依赖的资源列表。
这个 API 返回的结果是正确的,只包含当前真正引用的对象。如果材质的meta中有残留的纹理引用也不会影响结果。
实际测试的结果是,meta残留不会影响打包生成的AssetBundle文件。但是如果使用了新的Unity AssetBundle系统,那么打包生成的Manifest里面记录的依赖是错的。
使用AssetDatabase.GetDependencies可以检测出来meta残留的资源引用,而EditorUtility.CollectDependencies得到的是真实引用的资源。
如果有meta残留,则Unity5新的打包系统生成的AssetBundle文件是对的,但是记录依赖性的Manifest文件是错的的。
目前 FF 项目组使用的打包机制不受meta残留的影响。但是写工具把meta残留刷对也没有坏处。
解决了许久的困惑,补充一下,将文件写回可以简单地用:AssetDatabase.ForceReserializeAssets 全局写回