MonoBehaviour 看不了 — 缺程序集还是 Il2Cpp
现象
Asset List 里能看到 MonoBehaviour 条目,但选中后预览面板显示"Assembly not found" 或弹窗让你选程序集目录。选了之后还是报错:反序列化结果是空的、或者字段全是乱码值。
先判断是哪种 Unity 后端
解压游戏包,看 assets/bin/Data/ 目录下:
| 后端 | 目录结构 |
|---|---|
| Mono | 有 Managed/ 文件夹,里面一堆 .dll;游戏根目录或 lib/ 下有 libmono.so |
| IL2CPP | 没有 Managed/ 文件夹;有 global-metadata.dat + libil2cpp.so(或 GameAssembly.dll) |
Mono 后端:找 Managed 目录
AssetStudio 第一次选中 MonoBehaviour 时弹窗让你选程序集目录——选 Managed/ 就行。Managed 目录里包含:
Assembly-CSharp.dll(游戏自身写的脚本);- 各种第三方插件 DLL;
- Unity 引擎自身 DLL(
UnityEngine.dll、UnityEngine.UI.dll等)。
AssetStudio 扫描这个目录,找到 MonoBehaviour 的类型定义(字段名、字段类型、嵌套结构),然后按 TypeTree 反序列化二进制数据。
Mono 后端常见问题
- Managed 目录不在 APK 里 → 有些 Unity 项目做了程序集剥离(IL2CPP 化),即使打包时选了 Mono 后端。这种情况等于你面对的是 Il2Cpp;
- DLL 版本对不上 → 必须用这个游戏版本对应的 Managed 目录,别混用其他游戏的;
- 嵌套 DLL 没找到 → 游戏可能把 DLL 放在别的子目录里(比如
Managed/Plugins/),手动选完整游戏根目录试试。
IL2CPP 后端:先跑 Il2CppDumper
Il2Cpp 后端没有 Managed 目录——C# 代码提前编译成原生机器码了。AssetStudio 找不到任何 DLL,也就无法反序列化 MonoBehaviour。
完整流程:
- 准备两个文件:
libil2cpp.so(安卓)或GameAssembly.dll(Windows);global-metadata.dat(在assets/bin/Data/Managed/下,Il2Cpp 后端也有这个路径但里面只有一个文件);
- 跑 Il2CppDumper:
Il2CppDumper.exe libil2cpp.so global-metadata.dat
- 拿输出的 DummyDll 目录:这是 fake DLL 包;
- 喂给 AssetStudio:弹窗选程序集目录时选 DummyDll。
Il2CppDumper 也是 Perfare 写的,跟 AssetStudio 配套。详细步骤见 Il2Cpp Dumper 配合 那一节。
Il2Cpp 后端常见问题
- Il2CppDumper 跑不起来:Unity 版本太新 → 换最新版 Il2CppDumper;
- global-metadata.dat 被加密:部分厂商加了 metadata 加密 → Il2CppDumper 打不开 → 说明这个游戏对 MonoBehaviour 也做了保护,AssetStudio 解不了;
- AssetStudio 喂了 dummy dll 还是报错:dummy dll 是另一个版本游戏生成的 → 每个游戏版本的 IL2CPP 产物都不一样,必须用对应版本的 Il2CppDumper 产物。
还不行?
MonoBehaviour 是 Unity 里最依赖额外条件的资源类型。如果 Managed / dummy dll 都喂对了还是解析失败:
- 检查 Unity 版本对不对——不同 Unity 版本 TypeTree 有差异;
- 游戏是 UnityCN 加密吗——加密的话 MonoBehaviour 二进制本身可能被混淆了;
- 游戏是最新 Unity 6 打包吗——Il2CppDumper 和 AssetStudioMod 可能都还没完全适配。