☰
AssetStudio 使用与构建完整指南:Unity 资源与 AssetBundle 的探索、提取与导出实战手册
2026/10/3 2:14:28 网站建设 项目流程
  • 开发工具
  • 游戏开发

【免费下载链接】AssetStudio

AssetStudio is a tool for exploring, extracting and exporting assets and assetbundles.

项目地址:https://gitcode.com/gh_mirrors/as/AssetStudio
点击查看免费下载

AssetStudio 是一款面向 Unity 开发者、逆向分析者与资源研究人员的图形化工具,用于探索、提取并导出 Unity 资源(Assets)与资源包(AssetBundle)。本文以仓库根目录的 README.md 为核心骨架,结合 AssetStudio 核心源码、AssetStudioGUI 界面实现与 AssetStudioUtility 转换模块,系统讲解其支持范围、运行环境、加载/提取/导出全流程、MonoBehaviour 反序列化方案以及从源码构建的完整方法,让读者既能按图索骥完成实际操作,也能理解每一步背后的文件解析与转换原理。

一、工具定位与功能总览

AssetStudio 的核心能力是读取 Unity 序列化文件(.assets)与 AssetBundle 文件,将其中的资源对象解析为结构化数据,并转换为通用格式导出。需要特别说明的是,该工具与 Unity Technologies 及其关联公司没有任何隶属或授权关系,其作者(Perfare)独立维护该开源项目,使用者应自行确认合规边界。

从 AssetStudio/AssetStudio.csproj 可以看到当前仓库版本为0.16.0.0(Copyright © Perfare 2018-2022),且工程面向多目标框架编译:net472;netstandard2.0;net5.0;net6.0,这也决定了运行与构建时的环境要求。

1.1 支持版本范围

按 README 声明,AssetStudio 支持Unity 3.4 至 2022.1之间生成的资源文件。版本适配主要体现在 AssetStudio/SerializedFile.cs 对序列化文件头(SerializedFileHeader.cs)与版本相关字段的解析逻辑上,不同 Unity 版本在元数据布局、字节序与字段格式上存在差异,工具通过版本分支逐一兼容。

1.2 支持导出的资源类型与格式

README 给出的资源类型支持矩阵如下,这也是"导出"菜单中各转换器(见 AssetStudioGUI/Exporter.cs)的完整清单:

资源类型支持导出格式对应导出实现
Texture2Dpng、tga、jpeg、bmpExportTexture2D,底层走ConvertToImage(见 AssetStudioUtility/Texture2DConverter.cs)
Sprite按 Texture2D 裁剪后导出 png、tga、jpeg、bmpExportSprite
AudioClipmp3、ogg、wav、m4a、fsb;支持将 FSB 转换为 WAV(PCM)ExportAudioClip,底层为 AssetStudioUtility/AudioClipConverter.cs
Fontttf、otfExportFont
MeshobjExportMesh
TextAsset原始文本/二进制ExportTextAsset
Shadershader(转换后文本)ExportShader,底层见 AssetStudioUtility/ShaderConverter.cs
MovieTextureogvExportMovieTexture
VideoClip按原始路径扩展名ExportVideoClip
MonoBehaviourjsonExportMonoBehaviour,底层见 AssetStudioUtility/MonoBehaviourConverter.cs
Animator导出为绑定 AnimationClip 的 FBX 文件ExportAnimator,底层见 AssetStudioUtility/ModelConverter.cs

从源码结构看,AssetStudioGUI/Exporter.cs 中的ExportConvertFile是转换导出的统一分发入口,它会依据资源类型(ClassIDType)将任务派发给上述各专用导出方法;同时还有ExportRawFile(导出原始字节,扩展名.dat)与ExportDumpFile(导出类型结构转储文本,扩展名.txt)两条不经过转换的旁路。

二、运行环境与版本选择

README 明确列出了三种目标框架对应的运行依赖,这与其 csproj 的多目标框架设置一一对应:

  • AssetStudio.net472:需要 .NET Framework 4.7.2 运行时;
  • AssetStudio.net5:需要 .NET Desktop Runtime 5.0;
  • AssetStudio.net6:需要 .NET Desktop Runtime 6.0。

需要说明的是,net472 版本在依赖上与其他框架有所差异:由 AssetStudio/AssetStudio.csproj 可见,非 net472 目标引用K4os.Compression.LZ41.2.16,而 net472 目标引用 1.1.11,并额外引入System.Memory与System.IO.Compression包以保证在旧框架上获得等价的流与内存能力。

选择建议:在较新的 Windows 10/11 上优先使用 net6 版本(运行时支持最长久);在仅装有旧版 .NET Framework 的机器上使用 net472 版本。运行时与工具版本不匹配时程序将无法启动。

三、加载资源与 AssetBundle

3.1 两种加载方式

README 给出的基本用法为:

  • File → Load file:加载单个或多个资源文件;
  • File → Load folder:加载整个文件夹(递归扫描所有子目录)。

对应的界面实现在 AssetStudioGUI/AssetStudioGUIForm.cs 的loadFile_Click(L141-L152)与loadFolder_Click(L154-L166)中。此外,界面还支持拖拽加载:将文件或文件夹拖入窗口时,单个文件夹走LoadFolder,多个文件走LoadFiles(L122-L139)。

底层核心在 AssetStudio/AssetsManager.cs:

  • LoadFiles:先对文件所在目录执行MergeSplitAssets(自动合并分片文件),再经ProcessingSplitFiles过滤分片,最后进入统一加载流程;
  • LoadFolder:递归获取目录下全部文件,同样先合并分片再加载。

加载主循环LoadFile(L71-L94)会根据 AssetStudio/FileReader.cs 中CheckFileType识别的文件类型分派处理:AssetsFile直接解析序列化文件,BundleFile解包 AssetBundle,WebFile解析 UnityWeb 数据文件,GZipFile/BrotliFile先解压再递归处理,ZipFile按压缩包解析。其中 GZip 与 Brotli 解压逻辑位于 AssetStudio/ImportHelper.cs。

3.2 文件类型自动识别原理

AssetStudio/FileReader.cs 通过文件魔数(magic)完成类型判定,这也是"把文件扔进 AssetStudio 就能自动处理"的实现依据:

  • 前 20 字节字符串为UnityWeb/UnityRaw/UnityArchive/UnityFS→BundleFile;
  • 为UnityWebData1.0→WebFile;
  • 头部两个字节为1f 8b→ GZip 文件;
  • 0x20偏移处 6 字节为brotli→ Brotli 文件;
  • 通过IsSerializedFile校验序列化文件头(元数据大小、文件大小、数据偏移、字节序与版本字段的一致性)→AssetsFile;
  • 魔数为50 4b 03 04或50 4b 07 08→ Zip 文件;
  • 其余归为ResourceFile(原始资源文件)。

3.3 关于内存占用的重要提示

README 特别提醒:AssetStudio 加载 AssetBundle 时会在内存中直接解压并读取,对于大体积 Bundle 可能造成可观的内存占用。这一点在 AssetStudio/BundleFile.cs 的CreateBlocksStream等实现中得到印证——解压后的整块数据流驻留于内存。推荐的缓解方式是先用File → Extract file或File → Extract folder将 AssetBundle 解包到磁盘文件夹,再对该文件夹执行加载,从而避免在内存中反复保留压缩与解压两套数据。

四、提取 / 解压 AssetBundle

使用File → Extract file(L168-L182)或File → Extract folder(L184-L199),选择保存目录后即可将 Bundle 内嵌文件原样导出到磁盘。

提取的底层实现在 AssetStudioGUI/Studio.cs:

  • ExtractFile依据FileReader.FileType分支处理:BundleFile走ExtractBundleFile,WebFile走ExtractWebDataFile(L72-L83);
  • 解包结果统一输出到<保存目录>/<原文件名>_unpacked子目录,其中_unpacked命名由Path.Combine(extractPath, reader.FileName + "_unpacked")生成(L85-L109);
  • ExtractFolder会递归处理文件夹内所有文件,并保持原始目录结构映射到保存目录(L43-L57)。

关于解压本身,AssetStudio/BundleFile.cs 定义了完整的压缩体系:ArchiveFlags中的CompressionTypeMask描述压缩类型,CompressionType枚举覆盖None、Lzma、Lz4、Lz4HC、Lzham五种;其中 LZ4/LZ4HC 依赖 csproj 中引用的K4os.Compression.LZ4包,LZMA 则由仓库自带的 AssetStudio/SevenZipHelper.cs 与 7zip 目录下的纯 C# LZMA 解码器(7zip/Compress/LZMA/LzmaDecoder.cs)支撑。

此外,README 中"加载文件夹时自动合并分片"的行为由 AssetStudio/ImportHelper.cs 的MergeSplitAssets与ProcessingSplitFiles实现:工具会扫描*.split0等分片文件,按序拼接为完整文件后再加载,因此分片 Bundle 无需手动合并。

五、导出资源(Export 菜单)

5.1 三种导出模式

从 AssetStudioGUI/Studio.cs 的枚举定义与 AssetStudioGUI/AssetStudioGUIForm.cs 的菜单接线可以看出,导出菜单由"过滤范围 × 导出模式"两维组合而成:

导出模式(ExportType):

  • Convert(转换):按资源类型转换为标准格式(png、obj、json 等),即 README 功能表中的各类格式;
  • Raw(原始):导出资源原始字节数据(.dat),不做任何转换;
  • Dump(转储):导出资源类型结构树文本(.txt),用于查看对象字段布局。

过滤范围(ExportFilter):

  • All:导出 Asset List 中全部可导出资源;
  • Selected:仅导出当前选中的资源;
  • Filtered:仅导出当前类型过滤器下可见的资源。

5.2 导出目录组织规则

AssetStudioGUI/Studio.cs 的ExportAssets依据设置项assetGroupOption(在 ExportOptions 面板中配置)决定导出目录的组织方式:

  • 按类型名(Type name):<保存路径>/<资源类型名>/...;
  • 按容器路径(Container path):使用资源的 AssetBundle 容器路径组织目录,无容器时直接落在保存路径下;
  • 按源文件(Source file):<保存路径>/<源文件名>_export/<资源名>...,使导出结果与原始加载文件对应。

5.3 各类资源导出实操要点

  • Texture2D / Sprite:转换时通过ConvertToImage(true)生成位图,再按所选图像格式编码(png/tga/jpeg/bmp);
  • AudioClip:优先尝试转换为 wav;依据资源编码类型,也可直接抽取 mp3/ogg/m4a/fsb 等原始流;FSB 文件可进一步转为 WAV(PCM);
  • Mesh:导出为 Wavefront obj 格式,适用于大多数 DCC 工具导入;
  • MonoBehaviour:导出为缩进格式的 json,需要配合程序集才能完成字段还原(详见第七节)。

六、模型与动画导出(Model 菜单)

模型导出以"Scene Hierarchy"(场景层级树)为操作入口,README 给出了四条标准路径:

  1. 从 Scene Hierarchy 导出模型:选中场景对象后使用Model菜单,即可将对象及其子对象层级导出为 FBX;
  2. 从 Asset List 导出 Animator:在 Asset List 中选中 Animator 资源,使用Export菜单导出;
  3. 带动画的模型导出:先在 Scene Hierarchy 选中模型,再从 Asset List 选中 AnimationClip,使用Model → Export selected objects with AnimationClip;
  4. 带动画的 Animator 导出:导出的 Animator 会绑定其引用的 AnimationClip;也可以按住Ctrl在 Asset List 中同时选中 Animator 与 AnimationClip,使用Export → Export Animator with selected AnimationClip手动指定动画。

对应的界面逻辑见 AssetStudioGUI/AssetStudioGUIForm.cs:exportAnimatorwithAnimationClipMenuItem_Click会先从 Animator 的预加载数据中收集 AnimationClip;exportObjectswithAnimationClipMenuItem_Click则从当前选中项中筛选 AnimationClip 并传入模型导出。底层统一由 AssetStudioGUI/Exporter.cs 的ExportAnimator/ExportGameObject/ExportGameObjectMerge构造ModelConverter(可传入 AnimationClip 数组),再经ExportFbx调用 AssetStudioUtility/ModelExporter.cs 的 FBX 导出实现(可选欧拉角滤波eulerFilter与滤波精度filterPrecision参数)。

FBX 导出链路由三部分组成:托管侧 AssetStudioFBXWrapper(Fbx.cs / FbxExporter.cs)负责 API 封装,P/Invoke 层 AssetStudio.PInvoke 负责 DllLoader 加载原生库,原生侧 AssetStudioFBXNative(基于 Autodesk FBX SDK 的 C++ 实现,含 skin/morph/anim 三个上下文模块)负责最终写盘。

七、导出 MonoBehaviour(程序集反序列化)

7.1 常规 Mono 程序集

README 说明:当第一次选中 MonoBehaviour 类型资源时,AssetStudio 会要求指定程序集所在目录,例如 Unity 游戏的Managed文件夹。

该行为背后是 AssetStudioUtility/AssemblyLoader.cs 的Load方法:它会扫描目标目录下的所有*.dll,借助 Mono.Cecil 的AssemblyDefinition.ReadAssembly读取每个程序集模块,并通过自定义的MyAssemblyResolver(AssetStudioUtility/MyAssemblyResolver.cs)解析依赖。之后反序列化时,GetTypeDefinition依据资源引用的程序集名与类型全名定位对应的TypeDefinition,从而将原始二进制字段映射为可读的 C# 类型结构并序列化为 json。注意GetTypeDefinition中有一个特例:当目标为UnityEngine.dll时,会在已加载的所有模块中兜底搜索类型(L34-L53)。

7.2 Il2Cpp 场景

对于 Il2Cpp 打包的游戏,原生没有可供读取的托管程序集。README 给出的标准流程是:

  1. 使用另一款工具Il2CppDumper生成"假 dll"(dummy dll)——该工具会从 Il2Cpp 全局元数据(global-metadata.dat)中还原出与原始程序集同名同结构的托管程序集;
  2. 在 AssetStudio 选择程序集目录时,选中dummy dll 所在文件夹;
  3. 之后即可像常规 Mono 游戏一样完成 MonoBehaviour 的 json 导出。

7.3 程序集缓存管理

已加载的程序集在切换工程时可被清空:界面层通过assemblyLoader.Clear()(L1222)释放所有ModuleDefinition,避免跨工程加载时类型定义互相污染。

八、从源码构建

README 给出了构建的硬件/软件前提:

  • Visual Studio 2022 或更新版本(仓库提供 AssetStudio.sln 解决方案文件,可直接打开);
  • 原生 FBX 导出项目AssetStudioFBXNative 依赖 FBX SDK 2020.2.1:构建前需先安装该版本的 Autodesk FBX SDK,然后修改项目文件(AssetStudioFBXNative.vcxproj),将 include 目录与 library 目录指向本机 FBX SDK 的实际安装位置。

构建产物按目标框架产出多个版本(net472 / net5.0 / net6.0),与 README 运行环境一节对应。若只使用纹理、音频、模型等不依赖 FBX 的导出功能,也可按需裁剪 FBX 相关项目。

九、开源依赖说明

README 末尾列出的开源库集中在纹理解码领域(Texture2DDecoder 模块,仓库内对应 Texture2DDecoderNative 与 Texture2DDecoderWrapper):

  • mikunyan:Unity 序列化与资源解析参考实现,为理解 Unity 二进制格式提供重要依据;
  • BinomialLLC/crunch:Crunch 纹理压缩格式的解码基础;
  • Unity-Technologies/crunch:Unity 定制分支的 crunch 解码实现,仓库内对应 Texture2DDecoderNative/unitycrunch 与 Texture2DDecoderNative/crunch 两个子目录。

此外,压缩体系还依赖K4os.Compression.LZ4(LZ4/LZ4HC 解压,见 csproj 包引用)与仓库自带的7zip LZMA纯 C# 实现(7zip 目录)。

十、使用建议与注意事项

  1. 内存管理:加载大型 AssetBundle 时优先"先提取到磁盘、再加载文件夹",避免整包驻留内存;
  2. 程序集目录:MonoBehaviour 导出前务必准备好正确的Managed目录或 Il2CppDumper 生成的 dummy dll 目录,否则字段无法正确还原;
  3. 版本兼容:工具声明支持 Unity 3.4–2022.1;超出该范围的资源格式可能存在解析失败,可尝试在界面的版本输入框中指定 Unity 版本辅助识别;
  4. 导出格式选型:需要可编辑模型时使用 FBX(含动画),仅需几何数据时 obj 更轻量;音频中 FSB 转 WAV 可显著提升通用性;
  5. 合规边界:AssetStudio 与 Unity Technologies 无任何官方关联,请仅在授权范围内使用本工具处理资源。

通过以上各节,读者应已掌握 AssetStudio 从环境准备、资源加载、Bundle 提取、资源/模型/动画导出到 MonoBehaviour 反序列化与源码构建的完整技术路径;如需深入源码,可重点研读 AssetStudio/AssetsManager.cs、AssetStudio/BundleFile.cs、AssetStudio/FileReader.cs 三条主线,它们共同构成了工具"识别文件 → 解压解码 → 结构化解析"的核心链路。

  • 开发工具
  • 游戏开发

【免费下载链接】AssetStudio

AssetStudio is a tool for exploring, extracting and exporting assets and assetbundles.

项目地址:https://gitcode.com/gh_mirrors/as/AssetStudio
点击查看免费下载

相关推荐

上一篇:NHSE:5分钟掌握《动物森友会》存档编辑的完整指南
下一篇:NHSE:动物森友会存档编辑的终极指南 - 如何快速打造梦想岛屿

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

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

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

立即咨询