在 Godot 中实现类 Unity 的 AssetBundle 逻辑

技术 · 04-10 · 380 人浏览

我们知道,根据 Unity 官方的介绍,AssetBundle 是将资源使用 Unity 提供的一种用于存储资源的压缩格式打包后的集合,现在市面上绝大部分的网游,比如《原神》《终末地》《赛马娘》《蔚蓝档案》之类的是用了 Unity 的游戏,都是使用了 AssetBundle 来实现资源分发了。

那么鉴于团结引擎(Unity中国)官方不断作妖,开发者开始转向 Godot 之类的开源引擎的前提下,能不能为 Godot 实现一个类似 AssetBundle 的逻辑呢?

其实就是自己项目要用罢了

Godot 现有的方案

Godot 官方虽然没有提供 AssetBundle ,但是提供了一种动态载入资源的方式——PCK包加载:
即在游戏过程中,可以通过ProjectSettings.load_resource_pack函数,动态加载导出为.pck后缀或.zip后缀的补丁包,来讲游戏数据载入到文件系统中,来实现类似于热更新的效果。

但是这个方案存在局限:

  1. 分包困难。虽然常说 Unity 的 AssetBundle 的分包很麻烦,需要开发者自行处理来避免单包过大巴拉巴拉的……但是pck包的局限性更大,它在包含某一资源的同时,必须包含这个资源所引用的其他资源,导致各pck包直接很容易重合。
  2. 必须带个pck后缀(话术这真的算缺点吗)
  3. 无法加载 class 和 Autoload单例 脚本。

魔改引擎

事已至此,我出手了。

不过要说明,一切修改都基于 Godot 的PCK逻辑上,原则上跳不出PCK的局限性

1.首先,我们需要确定一下这个类AB包的打包方式

我的想法是,在编辑器中增加一个类似于导出……的对话框,在其中进行 AssetBundle 的工作。
然后再将 Manifest 和真正的 Bundle 包拆分开来,先生成 Manifest,再根据生成出来的 Manifest 来打包 Bundle。
2026-04-10T18:42:36.png

但是这样就会出现一个问题——怎么生成 Manifest?

2. 拆分资源的方式

AssetBundle 需要开发者手动分包,那既然都使用 Godot 的PCK的基底了,能不能利用一下它的局限性呢?
于是,你说……根据依赖关系,进行打包怎么样?

已知,假如有五个资源:A、B、C、D、E

A引用了C,而C又引用了E
而B只引用了D

那么我们打包C,就一定会把E也打包进去
但是B没有被A、C或者E引用,所以并不会被打包进去

那么为什么不能从最上层出发,将引用到的所有资源打包进一个pck呢?
这样,不就正好能处理拆包问题了吗?

于是,我启动了
Claude Code

AI 太好用了你知道吗

过程

  • 我们需要让 Claude 帮我们创建一个 AssetBundle 类,用来让游戏内的 GDScript 脚本可以调用相关代码来加载我们的伪AB包。
  • 随后,让它再来写一个编辑器的 Plugin,实现两个对话框:AssetBundle编辑、Manifest编辑,并将第一个对话框的入口绑定在工具栏上。
  • 具体的功能实现也很简单,将上文提到的拆分方式描述给它就行了。

结果

总之巴拉巴拉
反正就是懒得写了
在花费了亿点小钱,以及亿点时间后,
最后获得了一个
2026-04-10T18:47:18.png
2026-04-10T18:47:29.png
2026-04-10T18:47:37.png

最后获得的项目结构~就是:
2026-04-10T18:47:55.png
也是很有那味了好吧。

Godot
Theme Jasmine by Kent Liao