定义使用

有很多种方式使用资源,首先要了解都有哪些方式,才能更好地对症下药清理资源。

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 版本的兼容性,如果有问题的话可以换个工具或找找旧版本。

逻辑上用不到的

这些资源可能由于各种原因留在项目里,但是并未使用或者是不需要了,那么需要手动找出并清理。

  • 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 体积等等。

大致的策略:

  1. 明确目标
  2. 了解问题是什么,如何清理资源
  3. 清理资源
  4. 检查目标

整个过程反复迭代,可以将大任务一点一点拆分成小任务,应用上面的循环,最终达到需要的结果。

包体优化

创建 Unity 空工程进行打包,保存生成的日志与产物。

浏览日志内容,了解整个打包过程中的日志输出分别是干什么的,以便后续和项目打包日志做对比。

浏览打包的结果(apk、ipa 其实是 zip 压缩文件),使用压缩软件解压后查看所有文件,了解大概布局。