☰
AssetStudio 实战:从 AB 包批量导出贴图、模型与文本的完整指南
2026/10/7 2:53:50 网站建设 项目流程

简介:AssetStudio是一款面向游戏开发与资源调试人员的AB包解析工具,可帮助用户解压并查看游戏或应用中打包的资源内容,解决资源提取、分析与转换的实际需求。资源包共87个文件,以70个dll动态链接库为核心,辅以json配置、exe可执行程序、config配置文件及lib、dylib等类型,压缩包约13.68MB,解压即可运行,无需复杂配置。工具同时提供CLI命令行与GUI图形界面两种操作方式,并集成OpenTK图形库、SixLabors图像与字体处理库、Newtonsoft.Json解析库及ZstdSharp压缩算法支持,可完成图形资源查看、图像字体转换、JSON数据处理与Zstandard压缩解压等任务。目前已有595人学习下载,适合需要批量解析AB包、提取素材或研究资源打包机制的中高级开发者参考使用。

1. AssetStudio 到底解决什么问题:从一堆 .ab 文件到能看的贴图

手里拿到一个游戏的安装目录,Android/data/xxx/files下面躺着几百个.ab文件,双击打不开,改后缀也没用,这时候 AssetStudio 就是那把能撬开它的螺丝刀。它做的事情很具体:读取 Unity 打包出来的 AssetBundle(俗称 AB 包),把里面的 Texture2D、Mesh、AudioClip、TextAsset、AnimationClip 这些对象还原成 PNG、OBJ、WAV、TXT 等能直接查看和二次处理的格式。做游戏逆向、美术资源复用、本地化文本提取、模型二次创作的人,基本都会经过这个工具。它不依赖 Unity 编辑器,也不需要你懂 C# 反射,图形界面点几下就能导出,命令行版本还能塞进批处理里跑。这一章先把「它是什么、能干什么、谁该用」讲清楚,后面几章再拆怎么装、怎么导、参数怎么调、哪里会翻车。

2. 环境准备与最小可跑通流程:把 AssetStudio 跑起来并导出第一张贴图

2.1 选哪个版本:原版、开源分支与移植版的区别

AssetStudio 最早是 Perfare 用 C# 写的 Windows 桌面工具,后来作者归档,社区里出现了几个活跃分支。常见的有基于 .NET Framework 的原版、迁移到 .NET 6/8 的跨平台分支,以及一些针对特定 Unity 版本做过兼容补丁的移植版。选版本的核心判断依据是你的目标 AB 包是用哪个 Unity 版本打的,以及你本机是什么系统。

版本类型运行环境适合场景注意点
原版 .NET FrameworkWindows + .NET 4.7.2老游戏、Unity 5.x~2019新 Unity 版本可能报错
.NET 6/8 跨平台分支Win/Linux/macOS新游戏、批量脚本需要装对应运行时
社区移植版视分支而定特定加密或压缩变体来源杂,先看 issue

我一般会先拿目标游戏里最小的一个.ab文件做试探,能正常列出对象再上批量。如果一打开就抛EndOfStreamException,大概率是 Unity 版本不匹配或者包被加密了,换分支比死磕参数更快。

2.2 最小跑通流程:加载文件夹、筛选类型、导出贴图

图形界面的操作路径很短,但每一步都有坑。下面按顺序走一遍。

第一步,启动 AssetStudio,菜单File → Load Folder,选中包含.ab文件的目录。它会递归扫描,扫描期间状态栏会显示读到了多少个文件。如果目录里混了非 AB 文件,它会跳过,不用手动清理。

第二步,左侧Asset List里会出现所有解析出来的对象,按类型分组。想只看贴图,点Filter Type → Texture2D。这时候列表里就是所有能导出的图片对象。

第三步,选中要导出的条目,右键Export → Selected Assets,或者直接Export → All Assets导全部。导出目录里会按类型分文件夹,贴图默认存成 PNG。

如果只想快速验证工具能不能用,可以只导一张贴图,看 PNG 能不能正常打开、尺寸对不对。这一步过了,说明解析链路是通的。

2.3 命令行批量导出:把重复劳动交给脚本

图形界面适合试探,批量就得靠命令行。AssetStudio 的 CLI 版本参数不多,但组合起来够用。下面是一个典型的批量导出命令。

# AssetStudioCLI 批量导出示例 # -i 输入目录,-o 输出目录,--types 指定导出类型 AssetStudioCLI \ -i /data/game/ab_packs \ -o /data/export/output \ --types Texture2D,Mesh,TextAsset \ --image-format png \ --mesh-format obj \ --log-file /data/export/run.log

逻辑说明:-i指向 AB 包所在目录,工具会递归扫描;-o是导出根目录,内部会按类型自动建子目录;--types控制只导哪几类对象,不写就全导,全导在包多的时候非常慢;--image-format和--mesh-format决定贴图和模型的输出格式;--log-file把解析过程中的警告和错误落盘,批量跑的时候不看日志等于闭眼开车。

参数怎么改:如果只想提取本地化文本,把--types改成TextAsset,导出后是.txt或.bytes,再用脚本扫一遍关键词就行。如果贴图有透明通道但导出后背景变黑,检查--image-format是不是被设成了 jpg,jpg 不支持透明。

提示:命令行版本对路径里的空格和中文比较敏感,输入输出目录尽量用纯英文短路径,能省掉一类玄学报错。

3. 解析参数与导出设置:贴图、模型、文本各自怎么调

3.1 贴图导出:格式、尺寸与 mipmap 的处理

贴图是 AssetStudio 用得最多的功能,但导出结果和原始资源不一定完全一致。Unity 里的 Texture2D 可能带 mipmap、可能被压缩成 ASTC/ETC2/DXT,AssetStudio 在导出时会做一次解码和重编码。

关键设置有几个。Image Format选 PNG 还是 JPG,PNG 无损但体积大,JPG 有损但小,做素材复用建议 PNG。Export Mipmaps如果勾上,会额外导出每一级 mipmap,一般不需要,除非你在做渲染管线分析。Flip Vertical控制是否上下翻转,Unity 的纹理坐标和常见图像格式的 Y 轴方向相反,导出后如果发现图是倒的,把这个勾上。

还有一个容易忽略的点:部分贴图在 AB 包里是Texture2D但实际是 RenderTexture 或者 Sprite 的图集。Sprite 图集导出后是一张大图,需要配合.meta里的 rect 信息才能切回小图。AssetStudio 能导出 Sprite 对象,但切图信息不一定完整,做 UI 还原的时候要留意。

3.2 模型导出:Mesh、材质与骨骼的对应关系

导出 Mesh 比导出贴图复杂,因为一个模型通常由 Mesh、Material、Texture、Animation 多个对象组成,它们之间靠 PathID 关联。AssetStudio 导出 OBJ 或 FBX 时,会尽量把材质和贴图一起带上,但关联断了就会丢材质。

操作上,先在Asset List里筛选Mesh,选中目标模型导出。如果导出后 OBJ 是灰模,说明材质没关联上。这时候回到列表里找对应的Material和Texture2D,手动导出后按同名规则放一起,再用建模软件重新指定。

骨骼和动画是另一个坑。AssetStudio 能导出AnimationClip,但导出的动画数据是原始关键帧,需要配合 Avatar 才能正确重定向。如果只是看模型形状,忽略动画就行;要做动画复用,建议导出 FBX 而不是 OBJ,FBX 能保留层级和骨骼信息。

3.3 文本与配置提取:TextAsset 和 MonoBehaviour 的区别

游戏里的本地化文本、配置表、脚本数据,通常以TextAsset或MonoBehaviour两种形式存在。TextAsset是纯文本或二进制,导出后直接能读。MonoBehaviour是序列化对象,导出后是二进制或 JSON,需要根据游戏的序列化结构再解析。

常见做法是先把所有TextAsset导出来,用grep或脚本扫一遍,看有没有可读的 JSON、CSV、XML。如果没有,再去看MonoBehaviour,这时候往往需要配合Assembly-CSharp.dll里的类定义才能反序列化。AssetStudio 本身不做反序列化,它只负责把对象 dump 出来,后续解析要靠自己写脚本。

注意:部分游戏的文本被加密或压缩过,导出的TextAsset打开是乱码。这时候先看文件头,如果是UnityFS开头说明还是包,如果是其他魔数,可能需要先解密再解析。

4. 避坑与排查:AB 包解析里最常见的 5 个翻车现场

4.1 打开就报 EndOfStreamException

现象:加载文件夹后,状态栏卡住,日志里刷EndOfStreamException或Invalid header。

原因:AB 包的 Unity 版本和 AssetStudio 支持的版本不匹配,或者包被自定义加密/压缩过。Unity 的 AB 包格式在 5.x、2017、2018、2019、2020 之间有过几次变化,老工具读新包就会在头部解析失败。

解决:先确认游戏的 Unity 版本,方法是在游戏目录里找globalgamemanagers或data.unity3d,用十六进制编辑器看版本字符串。然后换对应版本的 AssetStudio 分支。如果是加密包,需要先找到解密逻辑,常见的是对头部做 XOR 或对整包做 AES,这部分没有通用方案,得针对具体游戏分析。

4.2 贴图导出后是纯黑或纯白

现象:PNG 能打开,但内容全黑、全白或者花屏。

原因:贴图的压缩格式 AssetStudio 不支持,或者解码时用了错误的格式。Unity 常用的压缩格式有 DXT1/5、ETC1/2、ASTC、PVRTC,不同平台用的不一样。AssetStudio 对 DXT 和 ETC 支持较好,ASTC 在部分分支里支持不完整。

解决:换一个支持 ASTC 的分支,或者在导出设置里把Image Format改成Raw先导出原始数据,再用其他工具解码。如果是花屏,检查是不是把法线贴图当普通贴图导了,法线贴图的 RGB 通道含义不同,看起来就是花的。

4.3 模型导出后没有材质和贴图

现象:OBJ 或 FBX 能打开,但模型是灰的,材质球是空的。

原因:Mesh 和 Material 的关联信息在导出时丢了,或者 Material 引用的 Texture 没有被一起导出。AssetStudio 导出模型时,如果只选了 Mesh 没选 Material,关联就会断。

解决:导出时把 Mesh、Material、Texture2D 一起选中再导,或者导出后手动把同名贴图放到模型目录下,在建模软件里重新指定。更稳的做法是先用 AssetStudio 的Export → All Assets全导一次,再从导出结果里挑需要的文件。

4.4 批量导出跑到一半内存爆了

现象:命令行跑了几百个包之后,进程被系统杀掉,日志停在某个文件。

原因:AssetStudio 在解析大包时会占用较多内存,尤其是包含大量贴图或高面数模型的包。CLI 版本默认不会主动释放已解析对象的缓存,包一多就累积。

解决:分批跑,每个批次控制在几十个包,跑完一批重启一次进程。或者用--types限制只导需要的类型,减少内存占用。如果必须一次跑完,给机器加内存比调参数更直接。

4.5 导出的文本是乱码或二进制

现象:TextAsset导出后打开是乱码,或者是一堆不可读的二进制。

原因:文本被加密、压缩,或者本身就是二进制格式(比如 protobuf、MessagePack)。Unity 的TextAsset不保证是纯文本,很多游戏会把配置表序列化成二进制再塞进去。

解决:先看文件头,如果是PK开头可能是 zip,如果是1F 8B是 gzip,先解压。如果是 protobuf,需要找到.proto定义或者从Assembly-CSharp.dll里反推结构。这一步没有捷径,属于逆向的深水区,工具只能帮你到 dump 这一层。

5. 进阶技巧:用脚本把 AssetStudio 接进自动化流水线

5.1 批量导出后的资源分类与重命名

AssetStudio 导出的文件名默认是对象名加 PathID,比如Texture2D_123456.png,可读性差。做资源复用的时候,我一般会写一个 Python 脚本,根据导出目录结构和文件头做二次分类。

import os import shutil from pathlib import Path # 按文件头把导出资源分到 image/mesh/text 三类 EXPORT_ROOT = Path("/data/export/output") TARGET_ROOT = Path("/data/export/sorted") def classify_by_header(filepath): with open(filepath, "rb") as f: header = f.read(4) if header.startswith(b"\x89PNG") or header.startswith(b"\xff\xd8"): return "image" if header.startswith(b"# ") or header.startswith(b"v "): return "mesh" return "text" for sub in EXPORT_ROOT.iterdir(): if not sub.is_dir(): continue for f in sub.iterdir(): if not f.is_file(): continue category = classify_by_header(f) dest = TARGET_ROOT / category / f.name dest.parent.mkdir(parents=True, exist_ok=True) shutil.copy2(f, dest)

逻辑说明:遍历导出目录,读每个文件的前 4 个字节,PNG 和 JPG 归到 image,OBJ 的#或v开头归到 mesh,其余归到 text。参数上,EXPORT_ROOT改成你的实际导出目录,TARGET_ROOT是分类后的目标目录。这个脚本只做粗分类,实际用的时候可以按项目需要加更多规则,比如按尺寸过滤贴图、按面数过滤模型。

5.2 用导出结果做资源差异对比

做版本更新分析的时候,需要知道新版本 AB 包里多了哪些资源、少了哪些、改了哪些。做法是分别导出两个版本,然后用文件哈希做对比。

# 对两个导出目录做哈希清单并对比 find /data/export/v1 -type f -exec md5sum {} \; | sort -k2 > /tmp/v1.md5 find /data/export/v2 -type f -exec md5sum {} \; | sort -k2 > /tmp/v2.md5 # 只看新增和删除的文件名 diff <(awk '{print $2}' /tmp/v1.md5) <(awk '{print $2}' /tmp/v2.md5) # 看内容有变化的文件 join -j 2 /tmp/v1.md5 /tmp/v2.md5 | awk '$2 != $3 {print $1}'

逻辑说明:第一条命令生成 v1 的文件名和哈希清单,第二条生成 v2 的。diff对比文件名列表,能看出新增和删除。join按文件名合并两份清单,比较哈希值,输出内容有变化的文件。参数上,路径换成你的实际导出目录,哈希算法用 md5 够快,要更稳可以换 sha256。

这套流程跑顺之后,每次游戏更新只需要重新导出、跑一遍脚本,就能拿到资源变更清单,比人工翻目录快得多。

5.3 我踩过的那些坑

最后说几个血泪经验。第一,不要在原版 AssetStudio 上死磕新游戏,社区分支更新更快,遇到解析失败先换分支。第二,批量导出一定要写日志,不然跑到一半崩了你不知道是哪个包的问题。第三,导出的资源不要直接覆盖上一版,按版本号建目录,后悔药没地方买。第四,遇到加密包先判断加密层级,是头部加密还是整包加密,头部加密好处理,整包加密往往要动调试器。第五,工具只是入口,真正的活是导出之后的资源整理和二次处理,那部分没有现成工具,得自己写脚本。

希望帮到你。

本文还有配套的精品资源,点击获取

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

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

立即咨询