聊到热更就必须先了解AssetBundle.
1.AssetBundle是什么呢?
AssetBundles 是有 Unity 编辑器在编辑环境中(enit-time)创建的一些列的文件,这些文件可以被用在项目的运行环境中(run-time)。 AssetBundles 可以包括的资源文件有模型文件(models)、材质(materials)、纹理(textures)和场景(scenes)。AssetBundles 不能包含脚本文件。具体来说,一个 AssetBundle 就是把一系列的资源文件或者场景文件以某种方式紧密保存的一个文件。这个 AssetBundle 文件可以被单独加载到可执行的应用程序中。AssetBundles 可以由被 Unity 构建的游戏或者应用按需加载使用。这允许对像模型、纹理、音频、甚至是整个的游戏场景这样的资源进行流式加载和异步加载。AssetBundles 可以预缓存(pre-cached)和存储在本地,这样在运行时就可以立即加载它们。但是 AssetBundles 技术的主要的目的是在需要的时候能够从远端的服务器上按需请求特定的资源,并加载到游戏中。AssetBundles 可以包含 Unity 可以识别的任何类型的资源,包括自定义的二进制数据。唯一的例外是,脚本资源是不被允许的。 |
2.AssetBundle 和 Reousrces 的区别呢?
其实Resources.Load()本质和AssetBundle相差不大,只不过是从一个缺省打进程序包里面的AssetBundle里加载资源。然而我们知道一旦游戏打包出来之后Resources文件夹就不存在了,而其中的资源也被打包到程序里面看不到了。所以要实现资源的热更不能采用这个方法。而且Resource这种方式为了保证Prefabs的依赖完整性会导致共同包含的依赖项重复,会大大增加游戏资源包的大小。而且AssetBundle支持动态下载替换,是Unity Web Caching License唯一可以缓存的内容。 |
3.使用AssetBundle实现资源热更的流程?
a. 打包AssetBundle。 b. 上传到服务器server。 c. 运行游戏时候自动判断版本号,如果不同就从服务器上下载新的AssetBundle包替换本地AB包。 d. 解析加载AssetBundle.完成资源热更。 |
4.AssetBundle的使用性平台与跨平台性
Standalone | WebPlaye | IOS | Android | |
Standalone | √ | √ | √ | √ |
WebPlayer | √ | √ | ||
IOS | √ | |||
Android | √ |
5.AssetBundle使用的相关准则
a.AssetBundle式需要整体下载和缓存的。 b.AssetBundles是不需要整体加载到应用程序中,可以只加载其中某些资源。 c.在AssetBundles中的资源对其他资源有依赖关系。 d.在AssetBundles中的资源可以同其他资源具有相同的依赖关系。 e.AssetBundle应为每个目标平台单独构建相应的包。 |
6.AssetBundle依赖关系介绍
什么是依赖关系?比如说如果你的一个模型有某个材质,当你把这个模型和材质都打包了之后,这个模型就是依赖这个材质的。也就是说你Load这个模型之前需要先将材质Load进来否则就会丢失材质。越是复杂的Prefab那么发生的依赖关系也就越多,如果不处理好就会导致素材丢失等情况。所以,我们需要对资源严格进行划分。不过在Unity5.x推出了新的AssetBundle系统,它会帮我们处理这些依赖关系项。 |
7.AssetBundle的组织
一个项目中肯定不止一个AssetBundle包,而每个AB包可能不止一个asset。而如何取组织资源文件,也就是把哪些资源打包到一起,哪些分开是值得商议的。每一个 AssetBundle 都有一些技术开销。AssetBundles 是一些封装资源的文件。这种封装会增大了 AssetBundle 的整体大小,尽管这种大小的增加不会太明显,而且是可测量的。当组织 AssetBundles 时,是更多的小的 AssetBundles 还是更少的大的 AssetBundles 呢?这是需要我们根据自己的项目的实际情况来好好权衡的。更多的小的 AssetBundles 会面临更多的跟踪和创建相关的开销,太少的 AssetBundles 会使单个AssetBundle 本身的大小变大,也会导致它们可能包含一些冗余的数据。 |
8.结语
AssetBundles 是一些包含模型、材质、纹理和场景等资源的文件。AssetBundle 是由 Unity 编辑器在编辑期间串接创建出来的,可以被应用程序在运行期间使用的。AssetBundles 是设计用来按需从本地或者服务器加载资源的。 |
对于如何在项目中对资源进行AssetBundle打包和解析,请阅读下接下来的两篇文章:
Unity资源热更之AssetBundle(2)———旧版本AssetBundle
Unity资源热更之AssetBundle(3)———新版本AssetBundle