Unity游戏里面的场景、模型、图片等资源,是如何管理和加载的?
这就是本文要讲的资源管理方式——bundle打包和加载。
图片
Unity游戏资源管理有很多方式:
(1)简单游戏比如demo,可以直接在scene场景中引用住相关资源,然后打出真机包即可。
(2)场景静态引用资源过多会导致loding变慢,为了实现动态加载,加快场景加载速度,可以把资源放到Resources目录下。
(3)但这样还不行,因为没法实现热更新。实际项目大多使用的是AssetBundle,即AB打包方式。
热更新后面再展开讲,本文主要介绍下bundle打包和加载方案。
市面上有不同的AB打包方案和策略,这主要取决于游戏具体情况,包括游戏资源规模、游戏类型等。大致讲下几种方案的优缺点:
(1)直接打包prefab和scene。
优点是不用关心资源依赖关系,直接对prefab或scene打包即可,unity会自动把其依赖资源都打进同一个包里。缺点是造成资源冗余,包体变大。
(2)收集prefab和scene的依赖资源,先对依赖资源打包,再对prefab和scene打包,同时维护依赖关系,加载时要用到。
而对依赖资源打包又有不同的策略:比如将依赖资源和prefab/scene打到同一个包;将每个依赖资源单独打成一个个散列包;将被两个以上其他资源依赖的公共资源单独打一个包......
优点是可以定制适合游戏项目的依赖资源打包策略,可以避免资源冗余,减小包体;缺点是当依赖关系异常复杂时,可能会疯,比如场景A的依赖prefab A1-A100,prefab A1-A100各自又依赖一堆资源,且互相存在资源重叠......而且在加载Bundle时可能会引起内存峰值爆炸。
(3)各个项目的黑科技方案,模拟Unity的资源管理。篇幅有限,且属于进阶内容,本文就不深入讲了,有兴趣的可以关注公众号私聊或加微信。
这里来看一下Unity的资源打包和加载实现Demo例子。
Demo需求:一个场景,3个shader,使用AB方式打包,并加载到安卓真机显示。
(1)打包
首先,我们总共打2个AB包:shader单独打一个AB包,场景单独打一个AB包。Unity的打包API是BuildPipeline.BuildAssetBundles,打包代码如下:
图片
然后就可以点击进行打包
图片
打包结束之后,可以看到以下bundle,除了生成shaderbundle和scenebundle,还自动生成了与目录同名的AB,以及每个bundle对应的manifest文件。
图片
其中AB.manifest记录了本次打包的所有bundle资源及其依赖关系,该文件可用于加载。可以看到scenebundle依赖shaderbundle。
图片
其他两个manifest文件则是只用于编辑器打包调试辅助,包含每个bundle包含的asset资源、依赖的其他bundle资源。
图片图片
(2)加载
游戏启动之后显示一个UI界面,自动加载shader资源。同时提供一个按钮,点击之后加载场景。界面逻辑代码如下:
图片
加载场景,应该先加载其依赖资源。上面我们知道场景依赖shader,所以这里就跳过收集依赖关系的逻辑了。
先加载shader资源,这里使用的是AssetBundle.LoadFromFileAsync这个Unity API。
图片
然后加载场景资源。
图片
(3)工程构建
最后打出apk真机包,可以使用编辑器构造。
图片
最后生成如下apk包。即可安装到真机。
图片
最终结果如下:真机启动游戏,显示界面。
图片
点击按钮,加载场景。完成。
图片
本节内容就介绍到这里,有问题欢迎留言或私聊~~~
欢迎关注我的微信公众号【unity大话东游】,更多的unity技术类和渲染类文章等着你哦!