assetstudio 中文文档 下载 App

MonoBehaviour JSON 导出 — 程序集目录选择、Mono vs Il2Cpp 两种后端

MonoBehaviour 是什么

MonoBehaviour 是 Unity 的脚本挂载组件——开发者写的 C# 脚本挂载到 GameObject 上时,每个挂载实例的字段数据以二进制序列化存储在 AssetBundle 里。比如角色的血量、名字、阵营、当前状态这些游戏逻辑数据,很多都存在 MonoBehaviour 里。

AssetStudio 能把这些二进制数据反序列化成可读的 JSON——但有前提条件。

前提条件:你得给它对应的程序集

AssetStudio 反序列化 MonoBehaviour 需要知道字段名和类型。这些信息不在 AssetBundle 里——它们在编译后的 C# DLL 里。

第一次选中 MonoBehaviour 时会弹窗让你选程序集目录。不同 Unity 打包后端,找 DLL 的方法不一样。

Mono 后端(找 Managed 目录)

这是 Unity 早期默认的打包后端。打包后的结构里有一个 Managed 文件夹,里面放着所有 C# 程序集 DLL:

游戏根目录/
├── Managed/
│   ├── Assembly-CSharp.dll      ← 游戏自身脚本
│   ├── UnityEngine.dll
│   ├── UnityEngine.UI.dll
│   └── ...
├── libmono.so
└── assets/bin/Data/

AssetStudio 弹窗里直接选 Managed 目录就行。它会自动扫描里面所有 DLL,找到 MonoBehaviour 的类型定义,然后反序列化二进制数据。

IL2CPP 后端(需要先生成 dummy dll)

这是 Unity 现在的推荐后端。它把 C# 代码提前编译成原生机器码(libil2cpp.so),Managed 目录不存在。AssetStudio 找不到任何 DLL,也就无法反序列化 MonoBehaviour。

解决方法:先用 Il2CppDumper(Perfare 另一个开源项目,跟 AssetStudio 配套的)生成一份 dummy dll,再把 dummy dll 目录喂给 AssetStudio。完整流程见下一节。

选对目录后

程序集目录选对了,AssetStudio 就会:

  1. 扫描 DLL 找到 MonoBehaviour 对应的 C# 类型;
  2. 按 TypeTree + 反射还原字段名、类型和值;
  3. 在右侧 Dump 面板里显示 JSON 结构。

之后就可以:

常见问题

弹窗里选了 DLL 目录但还是解析失败

检查几点:

  1. DLL 版本对不对——必须跟 AssetBundle 对应的游戏版本一致;
  2. Unity 版本对不对——不同 Unity 版本生成的 DLL 格式略有差异;
  3. 是不是真的 Mono 后端——先确认游戏包里有没有 Managed 目录,没有就是 Il2Cpp。

Il2Cpp 游戏直接喂了 Managed 目录(不存在)

那肯定解析不出来。Il2Cpp 后端 Managed 目录不存在,你必须先跑 Il2CppDumper 生成 dummy dll。

部分 MonoBehaviour 解析成功、部分失败

游戏里可能混用了多种打包方式,或者某个 MonoBehaviour 类型引用了外部 DLL(比如插件),那个 DLL 没放进你选的目录里。把游戏目录下所有 DLL 都放进去试试。

从 JSON 里能看到什么

Dump 出来的 JSON 结构大致长这样:

{
  "m_Name": "Enemy_001",
  "m_ClassID": 114,
  "HP": 500,
  "MaxHP": 500,
  "Attack": 45,
  "Defense": 20,
  "Position": {"x": 12.5, "y": 0.0, "z": -8.3},
  "isBoss": false
}

具体字段取决于开发者写的脚本里有哪些公开字段。这些数据对于做 Mod(改数值)、逆向(看游戏逻辑)非常有用。