序 为什么需要AssetBundle?

说到 unity 的ab,通常会想到热更新,在当前游戏开发以手游为主的大环境下,热更新又是许多手游必不可少的需求。手游的热更新需要分两个部分,一是代码的热更新,二是资源的热更新,而要想实现资源的热更新,则就必须使用Unity的 AssetBundle 系统。但如果没有热更新需求,那是不是就不用使用 AssetBundle 了呢?答案当然是否定的。

首先说一下传统的 Resources.Load 加载资源的缺陷,要想使用 Resources.Load 进行加载资源,需要把资源放在 Resources 文件夹下,但这个文件夹在打包的时候会被放入包体,而在移动平台下,对单个应用包体的大小是有限制的,超过了就出不了包。Android 是限制2G,而 iOS 是限制4G,尽管 Android 可以通过OBB 分包的形式将资源分离出来突破2G的限制,但绝大多数内容分发平台都不支持,而且安装一个 .apk 还要额外再安装 .obb 也太麻烦了。但 数据持久化路径 也就是 Application.persistentDataPath 或者又叫做 沙盒路径,对存储的大小是没有限制的,这个路径是在 app 安装后产生,因此我们可以将资源构建成 AssetBundle,在app安装后下载到这个路径下使用,这样就突破了应用大小的限制并且用户也只用安装一次。

那么如果资源大小没有超过2G也不需要热更新,或者干脆开发PC端游戏,是不是就可以用 Resources.Load 加载资源了呢?如果硬用的话,可以是可以但用户体验非常糟糕。Unity开发的游戏在启动的时候,会初始化Resources资源的索引表,Resources 下的资源越多,这个过程就越慢,慢到难以忍受!因此为了游戏的启动速度,也是需要使用 AssetBundle 的。

综上所述,如果想要好好开发一款游戏,AssetBundle 必不可少。

91焦先生

2022/07/18