在Unity中管理AssetBundles资产引用

如果使用资产包,则可能会牺牲在编辑器中拖放资产的可能性,并学会了使用字符串代替引用资产。 在本文中,我将解释为缓解此问题而采用的解决方案。

尽管由于其不可靠的文档和工具而经常被人们忽略,但是AssetBundles还是很棒的,原因有以下几个:

  • 通过允许您将资产拆分为包并仅下载播放器设备上所需的资源,它们可以减小构建大小
  • 它们对于手机游戏以及其他平台都非常有价值,因为它们可以快速轻松地更新您的资产,而无需将新版本推向商店(Steam,Google Play等)。
  • 它们通过释放“资源”文件夹中的空间来减少“ EnterPlayMode”时间

这个概念很简单:

  1. 您用捆绑名称标记资产
  2. 然后将具有相同捆绑名称的所有资产打包在一起,从而创建……捆绑!
  3. 不必使用Resource.Load()加载资产,而是必须首先加载捆绑软件,然后从加载的捆绑软件中获取资产

捆绑包是远程存储的(即,存储在简单的HTTP服务器上),并且它们都有版本号。 加载捆绑软件时,系统将首先检查本地是否已加载(存储在本地存储中)以及本地版本是否与远程版本匹配。 否则,将下载新的捆绑软件。

我花了一些时间来建立有效的流程,并且一些工具对我有很大帮助:

  • Sad Panda Studio AssetBundleManager比Unity更好更整洁,现在支持Async / Await。 即使在编辑器中进行测试,也可以轻松加载捆绑软件
  • 必须使用Unity的AssetBundleBrowser来设置和检查编辑器中的包

这是来自City Invaders中BundleManager的一小段代码(很抱歉那里的单例模式):

为了从两全其美中受益,我开始考虑一个特定的对象引用类,该类将在编辑器中保留指向资产的链接,并将其替换为资产的名称和捆绑包名称。

在运行时,我将使用前面提到的BundleManager加载实际资产。 和瞧!

这是我用于此目的的代码。 请注意,文件的一部分仅针对编辑器(UNITY_EDITOR)进行编译。 您可能还会注意到,AssetReference getter正在调用Setter方法来强制刷新资产引用名称和捆绑软件名称。

免责声明:因为我很懒,并且我学会了讨厌Unity的编辑器代码,所以本示例将使用Odin(但不使用Odin的序列化)。 我可能会使用自定义编辑器/ propertydrawer编写一个示例(剧透:我不会再见了)

我对我们的解决方案感到非常满意,目前为止它已经很好地达到了目的。 我很想知道其他人可能发现可以很好地处理资产捆绑的解决方案。 我坚信这种实现方式可以做得更好,并且考虑到当今几乎所有移动游戏都必须使用资产捆绑包,因此我认为Unity应该默认提供它。

我要感谢Sirenix团队整理了我的代码并帮助我弄清了Odin的可能性。


Pierrick Bignet Lone Stone 的联合创始人兼首席执行官 Lone Stone目前正在法国南特招聘网络和Unity开发人员。 该工作室专门研究Javascript,并使用ReactJS,VueJS,Angular,Node和Typescript。 欢迎与我们联系。