开了一个系列来记录下在开发过程中遇到的问题。
这里面有些是 Unity 自身的问题,只要使用 Unity 来开发项目都会遇到,有些是使用 Utage 时才会遇到。
目前 Utage 有多种资源加载方式,完整版加载方式可参考 Utage 文档里的 AdvEngineStarter StrageType
- Local 使用 Resources 加载
- StreamingAssets 使用 StreamingAssets 加载
这里主要说的是这 2 种资源加载方式和打包(Build)时遇到的问题。
初期开发时最方便的加载方式 Resources
Utage 的 Sample 示例就是使用的 Resouces 方式加载,整个开发过程都很简单:
- 放需要用到的资源到 Resources 里指定的文件夹。
- 写好项目配置文件。
之后,就可以在演出脚本里使用定义好的 Label 来显示图片等资源了。
方便归方便,随着项目使用的资源文件数量变多,项目变的复杂之后,会遇到下面几个问题。
- Resources 文件在 Build 的时候超过 4GB 会无法打包。Bug: 4GB limit to Textures in standalone build
- 打包时间很长。(项目资源数量多的时候,Build 一次耗费 30分钟以上时间。)
- 打包之后加载图片的时候,有些图片加载失败显示花屏。
这些问题都会导致自己开发了游戏,但是发布的时候却遇到了问题,一般会再开发后期需要进行测试的时候发现,于是开始寻找解决方案。
经过搜索之后发现在 Unity Tutorial 的 Assets, Resources and AssetBundles 中,Chapter3 的 Resources 里有写到
3.1. Best Practices for the Resources System
Don't use it.
好的,Unity Official 在最佳实践教程里面说 不要使用 Resources。
我们经过专业训练,就算再好笑,我们都不会笑。(哈哈哈哈哈哈)
Unity 在挖了一个坑之后,必然会给你指引去使用另一个新的坑,Resources 使用起来有问题,那不如去试试 StreamingAssets?
后期开发,发布时使用 StreamingAssets
Utage 在官方教程里有一篇文章介绍如何使用 StreamingAssets 来减小 app 大小的。传送门:StreamigAssets を使ってアプリサイズ削減
使用 StreamingAssets 的优点就是解决了上面的使用 Resources 时出现的问题。
- 解决了在使用 Resources build 时 .resS 文件大小超过 4GB 时无法 build 问题。
在 Build 的时候 Unity 会把 StreamingAssets 文件夹里的所有文件拷贝到最终包里面,所以不会出现使用 Resources 的时候,明明 Resources 只有 1.x GB 大小的素材,打包出来之后 .resS 文件体积变的超大。
- 打包时间很短。
能做到每次打包时间在 1分钟内,具体时间视电脑配置而定,CPU 和 SSD 性能最影响打包时间。
StreamingAssets 里的素材,不会像使用 Resources 的时候每次 build 都会将 Resources 里的素材进行 compress 等耗时操作。
加载图片时出现花屏这个问题,使用 StreamingAssets 方式没出现。
也许是 Unity 在 Build 时压缩 Texture 生成 .resS 文件的时候 出现错误导致的,也有可能是其它问题,具体原因时什么,我也不清楚。
开始吐槽的分割线
使用 Resources 时出现的问题解决了,那用 StreamingAssets 岂不是很完美?世上哪有这么好的事情,下面来说说使用 StreamingAssets 时出现的问题。
- Build AssetBundle 很耗时。
第一次 Build 的时候,会给每个资源添加 AssetBundleName,对资源进行 Compress 等操作整个过程非常耗时。
后面 Build 可以选择只将未命名的资源 Rename AssetBundleName,会快点。
- 开发过程变的更加繁琐
每次导入资源之后,都需要 Build AssetBundle 之后,才能启动游戏来验证资源是否更新了。
那么,我应该使用什么方式来管理加载资源?
当然是自己权衡利弊,自己选择适合该项目的方式啦。
Resources 很方便,但出现无法解决的 build 问题之后,可以试试 StreamingAssets。
StreamingAssets 使用时出现了问题,如果是时间和开发机器配置性能的问题,那都不是问题。顶配 + NVMe SSD 会给你带来更好的开发体验的。
如果是 AssetBundle 的视频不能播放,那 Untiy 官方都没啥 workaround,可以试试第三方插件?
也许 Unity 新推荐的使用 Addressable Assets System 也可以试试?不过这个 Utage 虽然有给 Sample package,但后面一句又一句的请自力扩张,让我不敢用到项目上。(你太菜了。)