Unity游戏里面的场景、模型、图片等资源,是如何管理和加载的?

这就是本文要讲的资源管理方式——bundle打包和加载。

Demo示例——Bundle打包和加载-LMLPHP图片

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,打包代码如下:

Demo示例——Bundle打包和加载-LMLPHP图片

然后就可以点击进行打包

Demo示例——Bundle打包和加载-LMLPHP图片

打包结束之后,可以看到以下bundle,除了生成shaderbundle和scenebundle,还自动生成了与目录同名的AB,以及每个bundle对应的manifest文件。

Demo示例——Bundle打包和加载-LMLPHP图片

其中AB.manifest记录了本次打包的所有bundle资源及其依赖关系,该文件可用于加载。可以看到scenebundle依赖shaderbundle。

Demo示例——Bundle打包和加载-LMLPHP图片

其他两个manifest文件则是只用于编辑器打包调试辅助,包含每个bundle包含的asset资源、依赖的其他bundle资源。

Demo示例——Bundle打包和加载-LMLPHP图片Demo示例——Bundle打包和加载-LMLPHP图片

(2)加载

游戏启动之后显示一个UI界面,自动加载shader资源。同时提供一个按钮,点击之后加载场景。界面逻辑代码如下:

Demo示例——Bundle打包和加载-LMLPHP图片

加载场景,应该先加载其依赖资源。上面我们知道场景依赖shader,所以这里就跳过收集依赖关系的逻辑了。

先加载shader资源,这里使用的是AssetBundle.LoadFromFileAsync这个Unity API。

Demo示例——Bundle打包和加载-LMLPHP图片

然后加载场景资源。

Demo示例——Bundle打包和加载-LMLPHP图片

(3)工程构建

最后打出apk真机包,可以使用编辑器构造。

Demo示例——Bundle打包和加载-LMLPHP图片

最后生成如下apk包。即可安装到真机。

Demo示例——Bundle打包和加载-LMLPHP图片

最终结果如下:真机启动游戏,显示界面。

Demo示例——Bundle打包和加载-LMLPHP图片

点击按钮,加载场景。完成。

Demo示例——Bundle打包和加载-LMLPHP图片

本节内容就介绍到这里,有问题欢迎留言或私聊~~~

欢迎关注我的微信公众号【unity大话东游】,更多的unity技术类和渲染类文章等着你哦!

Demo示例——Bundle打包和加载-LMLPHP

04-01 01:10