{"id":26550132,"url":"https://github.com/swingcosmic/assetstudioexporter","last_synced_at":"2025-03-22T07:30:27.927Z","repository":{"id":177869423,"uuid":"656220732","full_name":"SwingCosmic/AssetStudioExporter","owner":"SwingCosmic","description":"基于AssetStudio修改的适配AssetsTools.NET v3的导出工具","archived":false,"fork":false,"pushed_at":"2024-04-26T16:38:28.000Z","size":4980,"stargazers_count":6,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"v3","last_synced_at":"2024-04-26T17:51:01.455Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SwingCosmic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-06-20T13:49:49.000Z","updated_at":"2024-04-26T16:38:32.000Z","dependencies_parsed_at":"2024-01-10T15:00:14.939Z","dependency_job_id":"8d854668-7865-4b9d-9aad-e2f5d4837bd1","html_url":"https://github.com/SwingCosmic/AssetStudioExporter","commit_stats":null,"previous_names":["swingcosmic/assetstudioexporter"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SwingCosmic%2FAssetStudioExporter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SwingCosmic%2FAssetStudioExporter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SwingCosmic%2FAssetStudioExporter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SwingCosmic%2FAssetStudioExporter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SwingCosmic","download_url":"https://codeload.github.com/SwingCosmic/AssetStudioExporter/tar.gz/refs/heads/v3","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244924645,"owners_count":20532872,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-22T07:30:27.323Z","updated_at":"2025-03-22T07:30:27.896Z","avatar_url":"https://github.com/SwingCosmic.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AssetStudioExporter\n\n适配 [AssetsTools.NET](https://github.com/nesrak1/AssetsTools.NET) V3(AT3) 的AssetBundle导出工具，基于AssetStudio进行修改\n\n\u003e 本仓库是生成的是.NET库，用于简化使用AssetsTools.NET编写解包代码的逻辑，并不是一个独立的可执行文件，请先使用其他工具探索AssetBundle(AB)的结构并定位所需内容\n\n---\n\n## 特性\n\n* 同时支持AssetFile和AssetBundle文件\n* 经过简单的封装，以简单的方式导出`Texture2D`, `AudioClip`, `Font`等各类资源\n* 更好的`Texture2D`\n  * 全面的图片纹理格式支持，能导出几乎所有种类的`Texture2D`。\n  * 同时带有AssetRipper的解码器和AssetStudio自己的解码器，两者有各自的特点，可根据实际情况自由切换\n* 支持反序列化`MonoBehaviour`，只需要提供由Il2CppDumper/Cpp2Il生成的dummy DLL，调一个简单方法即可导出JSON\n* 直接的资源类型抽象，以及简单的导出参数配置，可以方便地实现新的导出方法，并灵活控制封装程度，不会对编写解包代码产生较大的侵入性和限制\n* 简单的跨平台\n  * 同时带有Windows/Mac/Linux的x86/x64第三方库二进制，无分平台包，无需判断平台和重新编译，编译一次到处运行\n\n## 开始使用\n\n本仓库包含了对AssetsTools.NET V3(AT3)的封装，使用前先阅读AT3的开发文档\n\n### 添加引用\n\n1. 添加对`AssetsTools.NET`和`AssetsTools.NET.Texture`（如果需要处理图片）的nuget包\n2. 克隆本仓库并作为项目依赖添加\n\n### 定位Asset\n\n具体参考AT3的文档\n\n```csharp\nvar am = new AssetsManager();\nam.LoadClassPackage(Path.Combine(AppContext.BaseDirectory, \"classdata.tpk\"));\n\nvar root = new DirectoryInfo(\"path/to/ab\");\nforeach (var file in root.EnumerateFiles(\"*.bundle\", SearchOption.AllDirectories))\n{\n  var bf = am.LoadBundleFile(file.FullName, true);\n  var inst = am.LoadAssetsFileFromBundle(bf, 0, true);\n\n  foreach (var info in inst.file.AssetInfos) {\n    var needExport = false;\n    // 尝试定位到所需的资源\n    // ...\n    if(needExport) {\n      // 使用Exporter进行导出\n    }\n  }\n}\n\n\n```\n\n### 导出资源\n\n* 如果只是想简单的导出符合要求的资源，可以根据asset的`AssetClassID`来使用不同的导出类。可以使用`ExporterSetting.Default`来设置全局默认导出设置。\n\n```csharp\nIAssetTypeExporter? exporter = null;\nswitch (info.TypeId)\n{\n  case (int)AssetClassID.Texture2D:\n    exporter = Texture2D.Read(baseField);\n    break;\n  case (int)AssetClassID.AudioClip:\n    exporter = AudioClip.Read(baseField);\n    break;\n  case (int)AssetClassID.TextAsset:\n    exporter = TextAsset.Read(baseField);\n    break;\n  case (int)AssetClassID.Font:\n    exporter = Font.Read(baseField);\n    break;\n  // 检查其他类型\n  // ...\n  default:\n    break;\n}\n\nif (exporter is not null) \n{\n  exporter.Export(inst, \"path/to/exported/file\");\n}\n```\n\n* 对于需要更精细控制的asset，也可以手动传入参数\n\n```csharp\nif (info.TypeId == (int)AssetClassID.Texture2D) \n{\n  var texture2D = Texture2D.Read(baseField);\n  var fileName = Path.Combind(\"path/to/export\", texture2D.m_Name + \".webp\");\n  using (var fs = File.Open(fileName, FileMode.Create, FileAccess.ReadWrite)) \n  { \n    // 使用webp导出并写入流\n    texture2D.Export(inst, fs, ImageFormat.Webp);\n  }\n}\n\n```\n\n### 反序列化MonoBehavoiur\n\n读取MonoBehavoiur是一件十分复杂的操作，但如果只需要简单地读取指定`GameObject`中存储的数据的结构（例如反序列化并生成JSON），使用提供的方法可以进行很大程度的简化\n\n```csharp\n\nif (info.TypeId == (int)AssetClassID.GameObject) \n{\n  // 确保加载了GameObject的依赖\n  // ...\n\n  // 读取该GameObject上包含的所有MonoBehaviour并筛选出需要的那个\n  var assetFile = info\n    .ReadAllMonoBehaviours(inst, am)\n    .First(m =\u003e m.m_Script.m_ClassName == \"YourClass\" \u0026\u0026 m.m_Script.m_Namespace == \"YourNamespace\")\n    .assetFile!;\n\n  // dump出的dummy DLL所在目录\n  var managedDir = \"path/to/bin/Data/Managed\";\n  var monoBehaviour = MonoDeserializer.GetMonoBaseField(am, inst, assetFile, managedDir);\n\n  // 将monoBehaviour的字段信息转换为对象，\n  // 该对象和原始的类结构类似，且生成JSON的内容一致，\n  // 但并不是原来的类的实例，而是由字典、数组和基本类型等组成的复杂结构\n  dynamic? obj = AssetDataUtil.DeserializeMonoBehaviour(monoBehaviour);\n  var json = JsonSerializer.Serialize(obj);\n  Console.WriteLine(json);\n}\n\n```\n\n## 一些工具方法\n\n\n### 读取资产路径\n\n部分资产在打包时包含路径信息，在AssetStudio中会显示为 \"Container\" 列，可以通过扩展方法`AssetsFileInstance.GetContainers`获取当前文件里的所有路径信息。\n\n```csharp\nDictionary\u003cstring, AssetPPtr\u003e containers = inst.GetContainers(am);\nforeach (var (name, pptr) in containers) \n{\n  Console.WriteLine($\"{name}: FileId={pptr.FileId}, PathId={pptr.PathId}\");\n  // 根据PPtr找到对应的资产对象\n}\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswingcosmic%2Fassetstudioexporter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fswingcosmic%2Fassetstudioexporter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswingcosmic%2Fassetstudioexporter/lists"}