这篇文章梳理了我现在所理解的Unity的AssetBundle、自动更新的流程和知识点。
一、关于AssetBundle
如果不是为了自动更新的话,其实完全可以避免掉AssetBundle,全部资源放到Resources目录下或者在Scene中直接引用。这样可以避免掉很多坑。但是考虑到手游的自动更新,AssetBundle就非常有必要了。它相当于一个小的资源包,提供了在游戏完整包之外额外加载资源的能力。但是由于Unity内部资源加载和资源依赖引用的黑科技,Unity所提供的打包和使用AssetBundle的接口都非常蹩脚。关于AssetBundle基础使用和坑,我之前写文章分享过(http://blog.csdn.net/langresser_king/article/details/44208585),这里会对部分知识点进行修正,以及进行拾遗补缺。
1、关于资源规划。
如果项目资源非常大的情况下,可以把资源独立一个项目专门用于资源导出。这样程序在开发和调试的时候不会因为项目资源过大造成启动慢、卡顿的情况。程序的资源加载顺序分开发和实际发布版本两种情况,开发模式下应该优先加载Resources目录下的资源,如果没有的话,再加载AssetBundle的资源,这样如果有资源需要修改或者测试的话,直接把对应的资源拷贝到Resources目录下就可以了,不一定需要打包才能测试。而实际发布的版本则相反,优先加载AssetBundle,如果没有的话再加载Resources目录下的资源,这样可以保证自动更新的逻辑。
之前我有考虑统一打包成AssetBundle然后放到StreamingAssets目录下,这样统一都用AssetBundle的逻辑来处理资源。后来发现其实没有太大必要。只要我们资源规划是合理的,那么无论是配置中,还是逻辑代码中是完全可以兼容Resources.Load和AssetBundle的加载方式的。而且就我现在的理解来看,Resources.Load的加载速度要比AssetBundle要快,因为AssetBundle是压缩的,而Resources.Load是未压缩的(当然这意味者iOS游戏安装后实际占用的文件大小会几倍于安装包,Android的游戏安装并不会解压apk包,所以不受影响)。
上一段的结论尚未验证,我在Editor下测试了一下AssetBundle和Resource.Load的加载速度,反而是AssetBundle要快。实际结论如何要在手机平台上测试过才能确定。
在我的规划中,所有带动画的、需要绑定脚本的、需要设置包围盒的模型都要创建prefab,然后给这个prefab设置AssetBundle的名字(即导出这个AssetBundle)。如果存在同一个模型可以替换多个纹理的情况(一种简单的换装),那么所有的纹理都要导出。除此之外的模型可以直接导出。
总结一下AssetBundle的步骤就是,给需要的模型创建Prefab,设置AssetBundle的导出名字,导出AssetBundle

本文详述了Unity中AssetBundle的使用和自动更新的流程。通过资源规划、AssetBundle的创建、加载策略和自动更新机制,阐述了在手游自动更新场景下AssetBundle的重要性。并分享了设置AssetBundle导出名字、加载优化以及处理shader丢失问题的方法。

3238

被折叠的 条评论
为什么被折叠?



