AssetRipper 使用指南:如何从 Unity 游戏文件中提取和分析资源
【免费下载链接】AssetRipperGUI application to analyze game files项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper
AssetRipper 是一款图形界面的 Unity 游戏文件分析工具,支持从 Unity 3.5.0 到 6000.5.X 版本的游戏文件,可以把 AssetBundle、资源文件里的模型、纹理、音频、脚本等内容提取出来,也能反编译 C# 脚本、重建 Unity 工程。它的目标用户是游戏开发者、逆向分析人员和学习 Unity 文件结构的技术人员。下面按"它做什么 → 怎么做 → 适合谁 → 为什么能行 → 出错怎么办"的顺序讲清楚。
能力范围一览
先说清楚它能吃进什么、吐出什么,避免预期落差。
| 维度 | 支持情况 |
|---|---|
| Unity 版本 | 3.5.0 至 6000.5.X(不同版本的解析质量略有差异) |
| 输入文件 | 单个资源文件、AssetBundle、游戏的 Data 目录、.dll程序集文件夹,均可同时拖入 |
| 提取的资源类型 | 网格(Mesh)、纹理、Sprite、音频、地形、Shader、场景、Prefab、文本资源等 |
| 脚本处理 | 反编译 C# 程序集,支持选择脚本内容级别(Mono 全量方法 / IL2Cpp 占位方法)和 C# 语言版本 |
| 输出形式 | 按类型的散装文件(PNG、WAV/OGG、FBX 等),或直接重建一个可用 Unity 打开的工程 |
| 运行平台 | Windows(x64/Arm64)、macOS(x64/Arm64)、Linux(x64/Arm64) |
官方文档列出的典型用途包括:
- 找出游戏里被意外打包进去的依赖资源;
- 把资源转换回 Unity 引擎原生格式;
- 定位构建中未能内联或裁剪的代码;
- 发现会导致游戏运行问题的失效资源引用。
许可证为 GNU GPL v3.0,源码仓库根目录可见 LICENSE.md。
动手走一遍:从一个 AssetBundle 到可用资源
下面演示一个真实任务:把一个 AssetBundle 里的纹理、网格和音频导出成普通文件。以 macOS 为例,Windows 和 Linux 的操作逻辑相同(解压后直接运行可执行文件)。
第一步:拿到程序并启动
从 docs/articles/Downloads.md 列出的发布渠道获取对应平台的压缩包(如AssetRipper_mac_arm64.zip),解压后得到主程序文件和若干.dylib/.dll依赖库。macOS 首次运行可能遇到两个拦路虎,docs/articles/RunningOnMac.md 有完整截图步骤:
Permission denied:在程序目录终端执行chmod +x AssetRipper.GUI.Free再运行;- 系统安全弹窗:到"系统设置 → 安全性与隐私 → 通用"里点"仍要允许"。
之后双击主程序即可打开 GUI 窗口,菜单栏有 File、Export、Language、About 四项。
第二步:确认导出配置
首次打开的欢迎页就是配置区,每一项都直接决定输出结果:
按任务需要调整这几项:
- Mesh Export Format:默认 Native,是 Unity 编辑器内可用的健壮格式,之后可用 Unity 包转成其他格式。想直接拿到 FBX 等格式需另做转换;
- Image Export Format:默认 PNG,影响所有导出图片;
- Sprite Export Format:Unity 格式只能在 Unity 内查看,想在外部软件看图就换其他选项;
- Audio Export Format:默认按 FSB 内嵌内容导出,多数是 WAV,部分是 OGG;
- Script Content Level:默认 Level 2,Mono 游戏导出完整方法体,IL2Cpp 游戏导出占位方法(因为 IL2Cpp 游戏的方法体在机器码里,C# 侧拿不到)。
第三步:拖入文件并等待解析
把 AssetBundle 文件(或整个游戏文件夹、Data 目录)直接拖进窗口。程序会解析文件、识别 Unity 版本和脚本后端。如果你把游戏用的.dll程序集和 bundle 放进同一个文件夹一起拖入,日志出现这一行说明程序集被正确关联:
Import : Files use the 'Mono' scripting backend.显示Unknown则说明程序集没被识别,脚本部分会缺失(原因和解法见下文"遇到问题怎么办")。
第四步:执行导出
点菜单栏的Export,选择输出目录,等待进度走完。输出目录里会按资源类型分文件夹:PNG 纹理、WAV/OGG 音频、网格文件、Shader、场景定义等。如果目标是重建 Unity 工程,导出选项里选工程形式,得到的是可直接被 Unity 打开的项目结构(Assets、ProjectSettings等),而不是散文件。
整个流程的输入输出可以概括为:拖入(bundle 或游戏目录 + 程序集)→ 自动识别 Unity 版本 → 按配置导出(散资源或完整工程)。
它适合谁,各自怎么用
不按"场景"堆词,按你的实际工作流分三类:
游戏开发者(排查自己项目的构建产物)最直接的用法是把构建出的游戏文件拖进来,检查哪些依赖资源被误打包(包体积膨胀)、哪些 MonoBehaviour 引用已经失效、哪些代码没被 IL 链接器裁剪掉。官方文档明确把这列为首要用途。
逆向分析 / Mod 人员用 bundle + Managed 目录(或 IL2Cpp 游戏先用 Cpp2IL 之类的工具生成的程序集)一起导入,拿到资源本体和反编译后的 C# 代码;配合 Level 2 脚本内容级别区分 Mono 与 IL2Cpp 游戏的可分析深度。
学习者拿一个 Unity 版本和 AssetRipper 支持版本一致的游戏,用 docs/articles/Requirements.md 里建议的方式(安装不低于游戏版本的 Unity 编辑器)把导出的工程导入 Unity,可以直观看到场景、Prefab、动画状态机等结构是如何组织和序列化的。
背后原理:它是怎么解析的
不用看源码也能建立几个关键认知:
- 序列化文件解析:Unity 的资源文件和 bundle 本质上是自定义二进制格式,核心是"类型树 + 对象数据"。AssetRipper 维护了从 3.5 到 6000.5 各版本的类型定义,先解析文件头确认版本,再按该版本的类型树逐对象反序列化,这就是"支持质量随版本略有差异"的来源——新版本号可能还没有完整的类型定义。
- 引用重建:对象之间靠全局唯一 ID(path id)互相引用。解析时建立 ID 到对象的映射,导出场景、Prefab、MonoBehaviour 时沿着引用链还原依赖关系,失效引用(指向已删除对象)也因此能被检测出来。
- 脚本处理分两条路:Mono 后端游戏的方法体就在 C# 程序集里,直接反编译即可;IL2Cpp 后端把代码编译成机器码,C# 程序集只剩签名,所以脚本只能导出占位方法体,方法内容需要另外的还原工具。
- 导出是模板化的:每种资源类型对应一个导出器(纹理写 PNG、音频解码、网格转 FBX/原生格式、Shader 保留源码),工程导出则用 YAML 序列化重建
.meta文件和场景结构,保证 Unity 能原样读回。
这些环节对应的代码目录见下一节,想深挖哪一步就去读哪一块。
遇到问题怎么办
按官方 docs/articles/CommonIssues.md 的高频问题整理,统一按"现象 → 原因 → 解法":
现象:导出的 bundle 里没有 Mono 脚本原因:bundle 本身一般不存 Mono 脚本,它们只存在于 C# 程序集(.dll)里。 解法:把游戏所有程序集放进一个文件夹,和 bundle 一起拖入 AssetRipper;成功标志是日志出现Monoscripting backend。IL2Cpp 游戏则需先有反编译生成的程序集。
现象:日志报Could not add pe assembly to name dictionary!原因:Managed 目录(含子目录)里存在两个程序集内部名相同(不是文件名相同)。 解法:对照反编译器里的程序集名找出重复项,移走多余的副本。
现象:读取时大量报错,且用的是被修改过的程序集原因:公共化(publicize)、移除特性、改动方法体都会改变 MonoBehaviour 字段的反序列化行为。 解法:使用未修改的原始程序集;带 Il2CppInterop 的 Mod 程序集不适用于本工具。
现象:Linux 上报Too many open files原因:系统的文件描述符上限过低。 解法:运行前在同一终端执行ulimit -n 1048576;需要永久生效则修改/etc/security/limits.conf。
现象:macOS 双击没反应或报权限/安全错误原因:可执行位缺失或 Gatekeeper 拦截。 解法:见 docs/articles/RunningOnMac.md,分别用chmod +x和系统设置里的"仍要允许"处理。
源码导读
C# 代码,按 .NET 10 构建(docs/articles/Requirements.md)。核心目录:
- Source/AssetRipper.Processing/:导入后的主处理流程,场景、Prefab、动画、Animator 等的后处理;
- Source/AssetRipper.IO.Files/:底层文件读取,含 Bundle、序列化文件、压缩流的解析;
- Source/AssetRipper.SerializationLogic/:字段级反序列化逻辑,MonoBehaviour 数据还原在这里;
- Source/AssetRipper.AssemblyDumper/:程序集反编译与脚本代码还原;
- Source/AssetRipper.Export/ 及 Source/AssetRipper.Export.UnityProjects/、Source/AssetRipper.Export.PrimaryContent/:两类导出管线(重建工程 / 散资源);
- Source/AssetRipper.Export.Modules.Models/、Source/AssetRipper.Export.Modules.Textures/、Source/AssetRipper.Export.Modules.Audio/:网格(GLB)、纹理、音频的具体转换实现;
- Source/AssetRipper.GUI.Web/:你看到的界面(基于 Web 前端的服务端渲染页面);
- Source/AssetRipper.Configuration/:配置项的定义与持久化。
下一步建议
- 先拿一个自己熟悉的 Unity 项目(而非别人的商业游戏)拖进去试,熟悉"识别版本 → 配置 → 导出"的完整链路;
- 把导出配置里每一项都改一遍,观察输出差异,建立"选项 → 结果"的直觉;
- 排查问题时先看日志里的 Unity 版本和脚本后端两行信息,再对照 docs/articles/CommonIssues.md 定位;
- 想理解某个资源是怎么被解析的,从上表"源码导读"找到对应目录读起。
最后提醒:AssetRipper 提取的资源仍受原版权保护,请仅在拥有合法权限、遵守版权法规的前提下使用提取或导出的内容。
【免费下载链接】AssetRipperGUI application to analyze game files项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考