• Demo示例——Bundle打包和加载


    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技术类和渲染类文章等着你哦!

  • 相关阅读:
    【数据结构】单链表
    Qt6_贪吃蛇Greedy Snake
    怎样去优化JAVA中的实现代码
    Mac git查看分支以及切换分支
    基于Android studio开发一款垃圾分类知识宣传APP
    ArcGIS绘制地球
    如何上传一个已有的Android项目到Gerrit
    Python从入门到精通秘籍八
    Python:Tornado框架之获取get和post的传参
    关于错误javax.net.ssl.SSLException: Received close_notify during handshake
  • 原文地址:https://www.cnblogs.com/unitydahuadongyong/p/16084663.html