AssetStudio 完整教程:3 步从 AssetBundle 快速提取纹理、模型与音频
2026/9/23 9:32:36 网站建设 项目流程

AssetStudio 完整教程:3 步从 AssetBundle 快速提取纹理、模型与音频

【免费下载链接】AssetStudioAssetStudio is a tool for exploring, extracting and exporting assets and assetbundles.项目地址: https://gitcode.com/gh_mirrors/as/AssetStudio

AssetStudio 是一款开源的 Unity 资源提取工具,它能读取 AssetBundle 这类二进制文件,把里面的纹理、模型、音频导出成可直接使用的格式。本文带你走一遍它的识别、解包与引用查找机制,并给出常见报错的排查办法。

它解决什么问题

Unity 游戏打包后,模型、贴图、音频都封在 AssetBundle 二进制文件里,用 PC 上的工具打不开。AssetStudio 把这些文件读进来,还原内部资源,再导出成 png、obj、wav 等格式。它覆盖 Unity 3.4 到 2022.1 的文件格式,常用于场景还原、素材替换,或者单纯分析一个游戏的资源构成。

先上手:打开与导出的最短路径

  1. 想从源码构建,先执行git clone https://gitcode.com/gh_mirrors/as/AssetStudio,再用 Visual Studio 2022 打开解决方案;只用现成发行包的话跳过这一步。
  2. 打开图形界面,用 File → Load file(或 Load folder)选中 bundle,文件直接拖进窗口也可以。
  3. 资源会出现在左侧资产列表和右侧场景树里,选中即可预览;用 Export 菜单批量导出。做 Unity 模型导出时,在场景树选中模型走 Model 菜单。
  4. 文件太大、加载吃内存时,先用 File → Extract file 把 bundle 解成普通文件再加载。

它如何"认出"文件

问题:你丢进来的文件可能是 bundle,可能是解包后的序列化文件,也可能套着压缩壳。不先弄清它是什么,就没法往下解析。

机制:看文件开头的"指纹",也就是几个固定字节(行内叫魔数)。判断顺序是写死的:

  1. 读开头的字符串签名。UnityWeb、UnityRaw、UnityArchive、UnityFS 四种之一,就是 AssetBundle;UnityWebData1.0 是老版网页数据文件。
  2. 不匹配就看前 2 字节,0x1F 0x8B 是 gzip。
  3. 再看偏移 0x20 处的 6 字节,是 brotli 字样就按 Brotli 压缩处理。
  4. 接着校验序列化头:把文件头声明的"文件大小"和实际长度对一遍,相等且数据偏移合法,就是序列化资源文件。
  5. 最后看前 4 字节,0x50 0x4B 开头的两种组合是 zip;都不中,就当原始资源文件。

识别逻辑集中在 AssetStudio/FileReader.cs,判断骨架如下:

var signature = this.ReadStringToNull(20); if (signature 是 UnityFS/UnityWeb/UnityRaw/UnityArchive) return FileType.BundleFile; if (前 2 字节 == 0x1F 0x8B) return FileType.GZipFile; if (0x20 处 6 字节 == "brotli") return FileType.BrotliFile; if (头部声明大小 == 真实大小) return FileType.AssetsFile; return 前 4 字节是 zip 魔数 ? FileType.ZipFile : FileType.ResourceFile;

效果:一旦判成压缩文件,先解压、再从头识别一遍,这个过程可以递归。zip 里套 bundle、bundle 里再套 bundle,走的都是这同一道入口。

拆包:Bundle 与 Web 文件内部发生了什么

整个 AssetBundle 解析只有一条主线:文件头 → 数据块 → 文件列表

  • 文件头:签名、版本号,外加一组标志位,用什么压缩方式就藏在标志位里。
  • 数据块:正文按块存放,每块记下压缩后大小和解压后大小。逐块读出、按标志位解压,再顺序写进一条连续的数据流。
  • 文件列表:数据流开头就是目录,每个文件只记一个偏移和大小,工具照着位置从数据流里切出独立的文件流。
压缩方式标志值处理方式
无压缩0按字节原样拷贝
LZMA1调用内置 7z 模块解压
LZ4 / LZ4HC2 / 3走 LZ4 解码器,解出字节数对不上直接报错

标志值是 LZHAM 时会抛"Unsupported compression type",这种包的 bundle 读不了,不用硬试。

Web 文件简单得多:头部只记了头长度,文件前段是一张"偏移 + 长度 + 路径"清单,照着清单 seek 到位、拷贝字节即可,全程不解压。

对比项Bundle 文件Web 文件
文件头签名 + 版本 + 标志位签名 + 头长度
数据区压缩块,逐块解压明文数据,按偏移直读
文件列表从块信息中解析"偏移 + 长度 + 路径"清单

解出的子文件还会被重新识别一遍,子文件若本身是 bundle 或 web 文件就继续递归,多层嵌套就是这样一层层剥开的。

找引用:资源之间如何相互指向

问题:材质引用一张纹理,纹理却可能住在另一个文件里。AssetStudio 怎么把它找回来?

机制分两层。第一层在每个序列化文件头部存着外部依赖清单(FileIdentifier),条目核心就是文件名。加载时工具拿着清单去找:先看当前文件同目录,找不到再递归子目录;找到的排进加载队列,没找到的记个账,免得反复空搜。

第二层是引用本体 PPtr,只有两个数:

  • m_FileID:目标在哪个外部文件,0 表示当前文件,大于 0 对应外部清单里的位置。
  • m_PathID:目标对象在那个文件里的编号。

像一个遥控器:一个键选文件,一个键选对象。

public bool TryGet(out T result) { // FileID == 0 指向当前文件,> 0 指向外部文件 if (!TryGetAssetsFile(out var sourceFile)) return false; // 用 PathID 去目标文件的对象表里取对象 if (sourceFile.ObjectsDic.TryGetValue(m_PathID, out var obj) && obj is T t) { result = t; return true; } return false; }

以"材质 → 纹理"这条链为例:Material 对象里有 PPtr<Texture> 成员,TryGet 成功后拿到 Texture2D,这张图就能跟材质一起导出。另外,某个外部文件第一次被定位后,"文件名 → 下标"的对应关系会写进缓存,之后同名的引用直接命中,不再遍历文件列表。

大文件为何不爆内存

挑三个关键机制。

  1. 缓冲池。LZ4 解压需要两个临时大字节数组。工具不每次新建,而是从一个共享数组池里"借"(BigArrayPool 上限 64MB、预分配 3 个),用完立刻"还"。好比图书馆借书:同一批书反复流通,不必每回都印新书,垃圾回收器要清的废弃物也变少了。
  2. 流式处理。数据边读边写入流,不把整个文件压在内存里。FileReader 本身只是流的包装,文件加载完就关流,内存随之释放。
  3. 落盘。所有数据块解压后的大小之和若逼近 2GB 上限,就建一个临时文件来装(标记为关闭即删除);单个子文件超 2GB 时则写进解包目录。文件再大,内存峰值也被控制在可承受范围。

常见坑与排查思路

  • 识别失败:文件被判成原始资源文件,或 bundle 加载即报错。多半是文件不完整,或用了不支持的压缩方式。看日志里的具体错误行,先用 Extract 流程走一遍再说。
  • 依赖缺失:预览里某些资源是空的。说明它依赖的外部文件没在你选的目录里。把相关 bundle 放同一目录(或整目录加载),再查日志确认外部文件有没有 Loading 记录。
  • 版本号被剥离:提示 Unity 版本被剥离、需要手动指定。在选项里设置 SpecifyUnityVersion 再加载。
  • 嵌套过深:bundle 套 bundle、文件过大。先 Extract 解包再加载,内存和递归深度都更容易控制。

收尾

AssetStudio 的完整流程可以浓缩成四步:认指纹、拆压缩、找引用、写临时文件。先看魔数定类型,再拆 bundle 得到文件流,然后用 FileIdentifier 加 PPtr 定位到具体对象,最后把超大数据落到磁盘。把这四步看明白,AssetBundle 的解析逻辑和大部分报错行为就不再神秘了。

【免费下载链接】AssetStudioAssetStudio is a tool for exploring, extracting and exporting assets and assetbundles.项目地址: https://gitcode.com/gh_mirrors/as/AssetStudio

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询