Skip to content

Instantly share code, notes, and snippets.

@QXSoftware
Last active March 25, 2024 14:59
Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save QXSoftware/35a07738f481245d08b948ead3743a4b to your computer and use it in GitHub Desktop.
Save QXSoftware/35a07738f481245d08b948ead3743a4b to your computer and use it in GitHub Desktop.
资源依赖正确性测试

资源依赖正确性测试

本次测试包含对AssetDatabase.GetDependenciesEditorUtility.CollectDependencies这两个获取资源的依赖资源的 API 的测试,以及对于meta残留对打AssetBundle的影响。

AssetDatabase.GetDependencies

输入资源路径,例如Assets/Material/demo.mat,以路径形式返回该资源依赖的资源列表,例如Assets/Texture/demo.jpg

这个 API 返回的结果是“错误”的,也就是带残留的。比如某个材质,原本的shader引用了4个纹理,然后切换其shader为新的shader使之只引用一个纹理,这时AssetDatabase.GetDependencies返回的结果还是4个纹理。

EditorUtility.CollectDependencies

输入资源对象(UnityEngine.Object),以对象数组的形式返回该资源依赖的资源列表。

这个 API 返回的结果是正确的,只包含当前真正引用的对象。如果材质的meta中有残留的纹理引用也不会影响结果。

AssetBundle 打包结果

实际测试的结果是,meta残留不会影响打包生成的AssetBundle文件。但是如果使用了新的Unity AssetBundle系统,那么打包生成的Manifest里面记录的依赖是错的。

总结

使用AssetDatabase.GetDependencies可以检测出来meta残留的资源引用,而EditorUtility.CollectDependencies得到的是真实引用的资源。

如果有meta残留,则Unity5新的打包系统生成的AssetBundle文件是对的,但是记录依赖性的Manifest文件是错的的。

目前 FF 项目组使用的打包机制不受meta残留的影响。但是写工具把meta残留刷对也没有坏处。

@ifshuaishuai
Copy link

解决了许久的困惑,补充一下,将文件写回可以简单地用:AssetDatabase.ForceReserializeAssets 全局写回

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment