Unity 清理资源
文章目录
定义使用
有很多种方式使用资源,首先要了解都有哪些方式,才能更好地对症下药清理资源。
Unity 引用
本质是 guid fileid type 的三元组,通过这三个值可以在项目中唯一地找到一个资源。
资源引用
Unity 序列化资源之间的互相引用
- Prefab
- Scene
- Animator
- Terrain
- 等等
项目设置
ProjectSettings 目录下的资源对其他资源的引用
- Build Settings
- Player Settings
- Graphics Settings
- Scene Settings
特殊目录
不同的目录有不同的功能:
- Resources
- StreamingAssets
- Plugins/Android
- Plugins/iOS
Resources 目录下的所有内容都会打到包里。
Unity - Manual: The Resources folder
StreamingAssets 目录下的文件都会原封不动地打包到最终的包中。如果使用 AssetBundle 时,建议只将 AssetBundle 文件拷贝到此目录中,不要携带 .manifest
文件,减少文件的数量,这样可以加快启动速度。
Unity - Manual: Streaming Assets
Plugins 目录下的平台目录都有特别的作用,基本上是把平台使用的库文件放在输出的包中。
路径
在使用项目自定义的资源管理功能时,往往都会使用路径来管理资源。
项目内的资源管理可能会通过几种方式加载资源:AssetBundle、文件。也就是项目的资源管理会通过路径的方式引用各种资源。
同时也会使用 Unity 的特殊目录来放置一部分首包中使用的文件。
用到的资源
用到的资源就是指通过上面的各种方式用到的资源。
主观想用的
就是需要用到的资源。这里是指必须用到且必不可少的资源。
主观不想用的
虽然是用到的资源,但是主观认为并不是必要的,需要清理与删除。
这种资源往往需要手动检查,比如制作的特效需要减少使用纹理的数量,这需要特效师根据需求与表现找到一个平衡点进行资源整理。
用不到的资源
完全没用到的资源
就是单纯没用到的资源,然后出于项目的整洁程度考虑,需要删除这些资源。
Unity Asset Store 中有不少相关的工具可以直接使用,在使用时尽量提前测试下插件与 Unity 版本的兼容性,如果有问题的话可以换个工具或找找旧版本。
- Maintainer | 实用工具 工具 | Unity Asset Store
- Asset Hunter PRO | 实用工具 工具 | Unity Asset Store
- [Unity插件] Unity资源清理工具Asset Cleaner - 简书
- unity 自动删除未引用的Assets下的资源 - Jason_c - 博客园
逻辑上用不到的
这些资源可能由于各种原因留在项目里,但是并未使用或者是不需要了,那么需要手动找出并清理。
- Build Scenes
- Resources 目录中的资源
- StreamingAssets 目录中的文件
Unity 特有残留
例如 Unity 为支持材质切换不同 Shader 后切换回原 Shader,可以继续显示出原来 Shader 中指定的纹理,就会将 Shader 使用的纹理属性及其引用全部序列化到材质文件中,是使用过 Shader 所有属性的并集。美术在制作完成后往往会忘记清理材质中多余的纹理,这会导致冗余。
具体网上已经有很多相关文章介绍,使用 Unity 冗余资源 之类的关键词进行搜索:
AssetBundle 冗余
如果打包 AssetBundle 时未正确处理好依赖项,导致部分资源重复打包,那么就会导致 AssetBundle 体积变大。
Unity 内置资源冗余
Unity 5.x AssetBundle零冗余解决方案 - UWA Blog
项目资源冗余
项目内的资源有可能在 AssetBundle 规划时未完全做到零冗余,导致不同的 AssetBundle 中会含有同一资源的多个副本。
一般都是由于资源的依赖层级过于复杂导致的,这里需要在 AssetBundle 打包规划中处理清楚所有的依赖项。
反向引用查找
需要查找资源所有依赖工具,并且能显示出依赖关系。
推荐使用 blueberryzzz/ReferenceFinder 查找某个目录下的所有被引用项,可以右键点击要查找的目录,在弹出的菜单中选择搜索。
具体的使用方法可以参考:Unity 查找资源引用工具 - 狂飙
优化策略
清理资源,最终还是要数据说话。要在清理开始前与结束后做好统计,明确哪些地方体积要缩小,缩小到什么程度。
例如:首包 apk ipa 体积、运行时下载的 AssetBundle 体积等等。
大致的策略:
- 明确目标
- 了解问题是什么,如何清理资源
- 清理资源
- 检查目标
整个过程反复迭代,可以将大任务一点一点拆分成小任务,应用上面的循环,最终达到需要的结果。
包体优化
创建 Unity 空工程进行打包,保存生成的日志与产物。
浏览日志内容,了解整个打包过程中的日志输出分别是干什么的,以便后续和项目打包日志做对比。
浏览打包的结果(apk、ipa 其实是 zip 压缩文件),使用压缩软件解压后查看所有文件,了解大概布局。