Bootstrap

Unity 架构师如何做资源管理

1: Unity 资源管理需求分析

作为架构师,在开始动手之前,先分析清楚需求,你才能设计出合理的方案,我们来分析一下Unity资源管理都有哪些需求,把需求想清楚了,设计是自然而然的事情。

Unity资源管理主要需求:

   1:为开发与正式发布提供资源的加载/卸载;

   2:方便远程更新资源。

   3:带资源与不带资源发布游戏包要非常方便。

   4:做好版本,平台,渠道的资源管理。

2: Unity资源管理的技术方案

我们先回顾一下Unity的一些资源管理方案,分析一下各自的优缺点。

   (1): 传统的Resources 方案以被淘汰。

这个方案满足代码资源加载与卸载,但是不方便在更新资源,更新资源还要用AssetsBundle, 两套东西结合起来也很麻烦。而且不方便打空包,Resources要求将所有资源放到Resources文件夹下,而且Resources文件夹下的资源都会被打包进去,这样不方便打空包,一般Resource方案现在在企业里面已经不是使用了。

(2) 基于纯AssetsBundle的方案。

  现在越来越多的游戏采用纯AssetsBundle来做资源管理, 我们来看看如何使用纯AssetsBundle来做资源管理。

   A: 代码如何加载资源

 先加载AssetsBundle, 然后再从AssetsBundle里面读取资源出来。这种方式确实能读取到资源,但是有一个很严重的问题,那就是开发的时候,每次都要对资源打ab包,每次多加一个资源的时候要多打一次ab包,这样,其实用起来是不方便的。所以我们想了个办法,通过条件编译,加一个预定义开关,如果是编辑器调试模式,那么我们直接使用AssetsDataBase.load来加载资源,不用打ab包,如果是发布模式,才从Ab包里面读取资源。这样开发的时候不用管ab包,打包发布的时候来做ab包即可。

B: AssetsBundle资源包放哪里呢?

  AssetsBundle资源包非常灵活,既可以放远程服务器,又可以放本地,接下来我们一起来看下AssetsBundle资源包如何存放,如何更新。

   打包的时候,如果你想打入到安装包里面去,那么我们可以把Ab资源包放StreammingAssets目录下,打包进去。加载的时候,使用UnityWebRequest加载StreammingAssets目录下的ab包。如果打空包, 那么StreammingAssets不放任何资源包就可以了。AssetsBundle更新的时候, 先根据版本判断,下载最新的AssetsBundle到私有可写目录下(每个应用,在操作系统上都有自己的一个可写的私有目录)。

 C: 如何使用更新AssetsBundle包

下载AssetsBundle到app私有目录以后, 编写一个加载AssetsBundle的接口,这个函数里面,先去私有目录下找, 是否有对应的AssetsBundle,如果有,就从私有目录加载,如果没有,就从本地的StreammingAssets路径下加载。这样就能保证,每次优先从私有下载目录下加载AssetsBundle资源包。

D: 资源包要分平台与渠道。

  我们知道不同的平台(win64, x86, Mac, iOS Android) 要打不同的资源包,所以我们一般会扩展编辑器,统一一个窗口来管理与打包AssetsBundle资源包。打包界面,如图:

每次打包的时候,你知道打的是哪个平台,哪个渠道哪个版本的资源包,输出的时候也分平台分渠道。

E: 非常方便的指定哪些资源要导入到哪个ab包。

  我们把资源分类放好以后, 打ab包的时候,要新建ab包的名字,指定哪些资源要打入ab包,这个过程,如果用手动的话,肯定会很麻烦,而且容易出错。我们总结一下,一般我们的资源都是按照逻辑,分类放好的,所以一个文件夹或子文件夹的资源,可以打到一个ab包,有了这些以后,我们就做一个自动化指定资源包的编辑器扩展。要打包的文件或文件夹,创建一个数据库文件出来,打包的时候,遍历这些数据库文件,根据文件路径,将路径下的资源打入资源包里面。如图:

(3)基于Addressable 的资源管理。

Unity 自己推出了基于Addressable的资源管理,本质上和我们上面的AssetsBundle系统类似,有兴趣的同学可以关注一下这个模式的资源管理的发展。

资源管理与更新,是Unity架构师的重中之重,希望大家能有收获。

;