尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

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

AssetStudio 完整教程:3 步从 AssetBundle 快速提取纹理、模型与音频 AssetStudio 完整教程3 步从 AssetBundle 快速提取纹理、模型与音频【免费下载链接】AssetStudioAssetStudio is a tool for exploring, extracting and exporting assets and assetbundles.项目地址: https://gitcode.com/gh_mirrors/as/AssetStudioAssetStudio 是一款开源的 Unity 资源提取工具它能读取 AssetBundle 这类二进制文件把里面的纹理、模型、音频导出成可直接使用的格式。本文带你走一遍它的识别、解包与引用查找机制并给出常见报错的排查办法。它解决什么问题Unity 游戏打包后模型、贴图、音频都封在 AssetBundle 二进制文件里用 PC 上的工具打不开。AssetStudio 把这些文件读进来还原内部资源再导出成 png、obj、wav 等格式。它覆盖 Unity 3.4 到 2022.1 的文件格式常用于场景还原、素材替换或者单纯分析一个游戏的资源构成。先上手打开与导出的最短路径想从源码构建先执行git clone https://gitcode.com/gh_mirrors/as/AssetStudio再用 Visual Studio 2022 打开解决方案只用现成发行包的话跳过这一步。打开图形界面用 File → Load file或 Load folder选中 bundle文件直接拖进窗口也可以。资源会出现在左侧资产列表和右侧场景树里选中即可预览用 Export 菜单批量导出。做 Unity 模型导出时在场景树选中模型走 Model 菜单。文件太大、加载吃内存时先用 File → Extract file 把 bundle 解成普通文件再加载。它如何认出文件问题你丢进来的文件可能是 bundle可能是解包后的序列化文件也可能套着压缩壳。不先弄清它是什么就没法往下解析。机制看文件开头的指纹也就是几个固定字节行内叫魔数。判断顺序是写死的读开头的字符串签名。UnityWeb、UnityRaw、UnityArchive、UnityFS 四种之一就是 AssetBundleUnityWebData1.0 是老版网页数据文件。不匹配就看前 2 字节0x1F 0x8B 是 gzip。再看偏移 0x20 处的 6 字节是 brotli 字样就按 Brotli 压缩处理。接着校验序列化头把文件头声明的文件大小和实际长度对一遍相等且数据偏移合法就是序列化资源文件。最后看前 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 对象里有 PPtrTexture 成员TryGet 成功后拿到 Texture2D这张图就能跟材质一起导出。另外某个外部文件第一次被定位后文件名 → 下标的对应关系会写进缓存之后同名的引用直接命中不再遍历文件列表。大文件为何不爆内存挑三个关键机制。缓冲池。LZ4 解压需要两个临时大字节数组。工具不每次新建而是从一个共享数组池里借BigArrayPool 上限 64MB、预分配 3 个用完立刻还。好比图书馆借书同一批书反复流通不必每回都印新书垃圾回收器要清的废弃物也变少了。流式处理。数据边读边写入流不把整个文件压在内存里。FileReader 本身只是流的包装文件加载完就关流内存随之释放。落盘。所有数据块解压后的大小之和若逼近 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),仅供参考
返回列表