From a1e40290c73c05f777be6f53ad8311c8bf472f53 Mon Sep 17 00:00:00 2001 From: VaDiM Date: Sat, 30 May 2026 01:50:47 +0300 Subject: [PATCH] Add JsonDump option --- AssetStudioCLI/Exporter.cs | 13 + AssetStudioCLI/Options/CLIOptions.cs | 17 +- AssetStudioCLI/Studio.cs | 37 +-- AssetStudioGUI/AssetStudioGUIForm.Designer.cs | 253 +++++++++++------- AssetStudioGUI/AssetStudioGUIForm.cs | 128 ++++----- AssetStudioGUI/Exporter.cs | 13 + AssetStudioGUI/Studio.cs | 25 +- 7 files changed, 286 insertions(+), 200 deletions(-) diff --git a/AssetStudioCLI/Exporter.cs b/AssetStudioCLI/Exporter.cs index b48f5dc..a8f28db 100644 --- a/AssetStudioCLI/Exporter.cs +++ b/AssetStudioCLI/Exporter.cs @@ -372,6 +372,19 @@ namespace AssetStudioCLI return false; } + public static bool ExportJsonDumpFile(AssetItem item, string exportPath) + { + if (!TryExportFile(exportPath, item, ".json", out var exportFullPath, mode: "JsonDump")) + return false; + var m_Type = item.Asset is MonoBehaviour m_MonoBehaviour + ? m_MonoBehaviour.serializedType.m_Type ?? m_MonoBehaviour.ConvertToTypeTree(Studio.assemblyLoader) + : null; + var jsonDoc = item.Asset.ToJsonDoc(m_Type); + var str = System.Text.Json.JsonSerializer.Serialize(jsonDoc, Object.JsonOptions); + File.WriteAllText(exportFullPath, str); + return true; + } + public static bool ExportConvertFile(AssetItem item, string exportPath) { switch (item.Type) diff --git a/AssetStudioCLI/Options/CLIOptions.cs b/AssetStudioCLI/Options/CLIOptions.cs index 06c71f2..b05152f 100644 --- a/AssetStudioCLI/Options/CLIOptions.cs +++ b/AssetStudioCLI/Options/CLIOptions.cs @@ -25,6 +25,7 @@ namespace AssetStudioCLI.Options Export, ExportRaw, Dump, + JsonDump, Info, Live2D, SplitObjects, @@ -209,11 +210,12 @@ namespace AssetStudioCLI.Options optionDefaultValue: WorkMode.Export, optionName: "-m, --mode ", optionDescription: "Specify working mode\n" + - "\n" + + "\n" + "Extract - Extract(Decompress) asset bundles\n" + "Export - Convert and export assets\n" + "ExportRaw - Export raw assets\n" + - "Dump - Generate json dumps of loaded asset\n" + + "Dump - Generate txt dumps of loaded asset\n" + + "JsonDump - Generate json dumps of loaded asset\n" + "Info - Load file(s) and show the number of available for export assets\n" + "Live2D - Export Live2D Cubism models\n" + "SplitObjects - Export all model objects (split) (fbx)\n" + @@ -706,6 +708,9 @@ namespace AssetStudioCLI.Options case "dump": o_workMode.Value = WorkMode.Dump; break; + case "jsondump": + o_workMode.Value = WorkMode.JsonDump; + break; case "info": o_workMode.Value = WorkMode.Info; o_exportAssetTypes.Value.Add(ClassIDType.Animator); @@ -821,6 +826,7 @@ namespace AssetStudioCLI.Options { case WorkMode.ExportRaw: case WorkMode.Dump: + case WorkMode.JsonDump: case WorkMode.Info: f_loadAllAssets.Value = true; flagIndexes.Add(i); @@ -1493,8 +1499,12 @@ namespace AssetStudioCLI.Options { switch (o_workMode.Value) { - case WorkMode.ExportRaw: case WorkMode.Dump: + case WorkMode.JsonDump: + return f_loadAllAssets.Value && o_exportAssetTypes.Value == o_exportAssetTypes.DefaultValue + ? $"# Dump Asset Type(s): All" + : $"# Dump Asset Type(s): {string.Join(", ", o_exportAssetTypes.Value)}"; + case WorkMode.ExportRaw: case WorkMode.Info: return f_loadAllAssets.Value && o_exportAssetTypes.Value == o_exportAssetTypes.DefaultValue ? $"# Export Asset Type(s): All" @@ -1538,6 +1548,7 @@ namespace AssetStudioCLI.Options case WorkMode.Export: case WorkMode.ExportRaw: case WorkMode.Dump: + case WorkMode.JsonDump: case WorkMode.Info: if (o_workMode.Value != WorkMode.Export) { diff --git a/AssetStudioCLI/Studio.cs b/AssetStudioCLI/Studio.cs index 6da8e6f..dba3720 100644 --- a/AssetStudioCLI/Studio.cs +++ b/AssetStudioCLI/Studio.cs @@ -11,7 +11,6 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Xml.Linq; -using static AssetStudioCLI.Exporter; using Ansi = AssetStudio.ColorConsole; namespace AssetStudioCLI @@ -628,6 +627,7 @@ namespace AssetStudioCLI public static void ExportAssets() { + var workMode = CLIOptions.o_workMode.Value; var savePath = CLIOptions.o_outputFolder.Value; var toExportCount = parsedAssetsList.Count; var exportedCount = 0; @@ -636,6 +636,7 @@ namespace AssetStudioCLI var parallelExportCount = CLIOptions.o_maxParallelExportTasks.Value; var toExportAssetDict = new ConcurrentDictionary(); var toParallelExportAssetDict = new ConcurrentDictionary(); + var modeStr = workMode == WorkMode.Dump || workMode == WorkMode.JsonDump ? "Dump" : "Export"; if (CLIOptions.o_stripPathPrefix.Value != null) { @@ -715,7 +716,7 @@ namespace AssetStudioCLI } exportPath += Path.DirectorySeparatorChar; - if (CLIOptions.o_workMode.Value == WorkMode.Export) + if (workMode == WorkMode.Export) { switch (asset.Type) { @@ -754,32 +755,36 @@ namespace AssetStudioCLI var isExported = false; try { - switch (CLIOptions.o_workMode.Value) + switch (workMode) { case WorkMode.ExportRaw: - Logger.Debug($"{CLIOptions.o_workMode}: {asset.Type} : {asset.Container} : {asset.Text}"); - isExported = ExportRawFile(asset, exportPath); + Logger.Debug($"{workMode}: {asset.Type} : {asset.Container} : {asset.Text}"); + isExported = Exporter.ExportRawFile(asset, exportPath); break; case WorkMode.Dump: - Logger.Debug($"{CLIOptions.o_workMode}: {asset.Type} : {asset.Container} : {asset.Text}"); - isExported = ExportDumpFile(asset, exportPath); + Logger.Debug($"{workMode}: {asset.Type} : {asset.Container} : {asset.Text}"); + isExported = Exporter.ExportDumpFile(asset, exportPath); + break; + case WorkMode.JsonDump: + Logger.Debug($"{workMode}: {asset.Type} : {asset.Container} : {asset.Text}"); + isExported = Exporter.ExportJsonDumpFile(asset, exportPath); break; case WorkMode.Export: - Logger.Debug($"{CLIOptions.o_workMode}: {asset.Type} : {asset.Container} : {asset.Text}"); - isExported = ExportConvertFile(asset, exportPath); + Logger.Debug($"{workMode}: {asset.Type} : {asset.Container} : {asset.Text}"); + isExported = Exporter.ExportConvertFile(asset, exportPath); break; } } catch (Exception ex) { - Logger.Error($"{asset.SourceFile.originalPath ?? asset.SourceFile.fullName}: [{$"{asset.Type}: {asset.Text}".Color(Ansi.BrightRed)}] : Export error\n{ex}"); + Logger.Error($"{asset.SourceFile.originalPath ?? asset.SourceFile.fullName}: [{$"{asset.Type}: {asset.Text}".Color(Ansi.BrightRed)}] : {modeStr} error\n{ex}"); } if (isExported) { exportedCount++; } - Console.Write($"Exported [{exportedCount}/{toExportCount}]\r"); + Console.Write($"{modeStr}ed [{exportedCount}/{toExportCount}]\r"); } Exporter.ClearHash(); @@ -793,7 +798,7 @@ namespace AssetStudioCLI { Interlocked.Increment(ref exportedCount); Logger.Debug(debugLog); - Console.Write($"Exported [{exportedCount}/{toExportCount}]\r"); + Console.Write($"{modeStr}ed [{exportedCount}/{toExportCount}]\r"); } } catch (Exception ex) @@ -806,12 +811,12 @@ namespace AssetStudioCLI if (exportedCount == 0) { - Logger.Default.Log(LoggerEvent.Info, "Nothing exported.", ignoreLevel: true); + Logger.Default.Log(LoggerEvent.Info, $"Nothing {modeStr.ToLower()}ed.", ignoreLevel: true); } else { var outPath = CLIOptions.o_outputFolder.Value.ColorIf(toExportCount > exportedCount, Ansi.BrightYellow, Ansi.BrightGreen); - Logger.Default.Log(LoggerEvent.Info, $"Finished exporting {exportedCount} asset(s) to \"{outPath}\".", ignoreLevel: true); + Logger.Default.Log(LoggerEvent.Info, $"Finished {modeStr.ToLower()}ing {exportedCount} asset(s) to \"{outPath}\".", ignoreLevel: true); } if (toExportCount > exportedCount) @@ -911,7 +916,7 @@ namespace AssetStudioCLI foreach (var gameObjectNode in exportableObjects) { var gameObject = gameObjectNode.gameObject; - var filename = FixFileName(gameObject.m_Name); + var filename = Exporter.FixFileName(gameObject.m_Name); var targetPath = $"{savePath}{filename}{Path.DirectorySeparatorChar}"; //重名文件处理 for (int i = 1; ; i++) @@ -931,7 +936,7 @@ namespace AssetStudioCLI Progress.Report(k, exportableCount); try { - ExportGameObject(gameObject, targetPath); + Exporter.ExportGameObject(gameObject, targetPath); Logger.Debug($"{gameObject.type} \"{filename}\" saved to \"{targetPath}\""); exportedCount++; } diff --git a/AssetStudioGUI/AssetStudioGUIForm.Designer.cs b/AssetStudioGUI/AssetStudioGUIForm.Designer.cs index a666464..f869c3a 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.Designer.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.Designer.cs @@ -71,14 +71,18 @@ this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); this.exportAnimatorWithSelectedAnimationClipToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem9 = new System.Windows.Forms.ToolStripMenuItem(); + this.exportRawAssetsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exportRawAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exportRawSelectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exportRawFilterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.dumpAssetsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.dumpAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.dumpSelectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.dumpFilterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.jsonDumpAssetsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.jsonDumpAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.jsonDumpSelectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.jsonDumpFilterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); this.live2DCubismModelsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.allL2DModelsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -87,10 +91,10 @@ this.l2DModelWithFadeMotionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.l2DModelWithClipsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItem10 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem11 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem12 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem13 = new System.Windows.Forms.ToolStripMenuItem(); + this.exportAssetListXmlToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exportAssetListXmlAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exportAssetListXmlSelectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exportAssetListXmlFilterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.filterTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.allToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.debugMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -518,12 +522,13 @@ this.toolStripSeparator3, this.exportAnimatorWithSelectedAnimationClipToolStripMenuItem, this.toolStripSeparator4, - this.toolStripMenuItem2, - this.toolStripMenuItem3, + this.exportRawAssetsToolStripMenuItem, + this.dumpAssetsToolStripMenuItem, + this.jsonDumpAssetsToolStripMenuItem, this.toolStripSeparator6, this.live2DCubismModelsToolStripMenuItem, this.toolStripSeparator2, - this.toolStripMenuItem10}); + this.exportAssetListXmlToolStripMenuItem}); this.exportToolStripMenuItem.Name = "exportToolStripMenuItem"; this.exportToolStripMenuItem.Size = new System.Drawing.Size(53, 20); this.exportToolStripMenuItem.Text = "Export"; @@ -532,22 +537,25 @@ // this.exportAllAssetsMenuItem.Name = "exportAllAssetsMenuItem"; this.exportAllAssetsMenuItem.Size = new System.Drawing.Size(266, 22); + this.exportAllAssetsMenuItem.Tag = "all"; this.exportAllAssetsMenuItem.Text = "All assets"; - this.exportAllAssetsMenuItem.Click += new System.EventHandler(this.exportAllAssetsMenuItem_Click); + this.exportAllAssetsMenuItem.Click += new System.EventHandler(this.exportAssetsByToolStripMenuItem); // // exportSelectedAssetsMenuItem // this.exportSelectedAssetsMenuItem.Name = "exportSelectedAssetsMenuItem"; this.exportSelectedAssetsMenuItem.Size = new System.Drawing.Size(266, 22); + this.exportSelectedAssetsMenuItem.Tag = "select"; this.exportSelectedAssetsMenuItem.Text = "Selected assets"; - this.exportSelectedAssetsMenuItem.Click += new System.EventHandler(this.exportSelectedAssetsMenuItem_Click); + this.exportSelectedAssetsMenuItem.Click += new System.EventHandler(this.exportAssetsByToolStripMenuItem); // // exportFilteredAssetsMenuItem // this.exportFilteredAssetsMenuItem.Name = "exportFilteredAssetsMenuItem"; this.exportFilteredAssetsMenuItem.Size = new System.Drawing.Size(266, 22); + this.exportFilteredAssetsMenuItem.Tag = "filter"; this.exportFilteredAssetsMenuItem.Text = "Filtered assets"; - this.exportFilteredAssetsMenuItem.Click += new System.EventHandler(this.exportFilteredAssetsMenuItem_Click); + this.exportFilteredAssetsMenuItem.Click += new System.EventHandler(this.exportAssetsByToolStripMenuItem); // // toolStripSeparator3 // @@ -566,67 +574,107 @@ this.toolStripSeparator4.Name = "toolStripSeparator4"; this.toolStripSeparator4.Size = new System.Drawing.Size(263, 6); // - // toolStripMenuItem2 + // exportRawAssetsToolStripMenuItem // - this.toolStripMenuItem2.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItem4, - this.toolStripMenuItem5, - this.toolStripMenuItem6}); - this.toolStripMenuItem2.Name = "toolStripMenuItem2"; - this.toolStripMenuItem2.Size = new System.Drawing.Size(266, 22); - this.toolStripMenuItem2.Text = "Raw"; + this.exportRawAssetsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.exportRawAllToolStripMenuItem, + this.exportRawSelectToolStripMenuItem, + this.exportRawFilterToolStripMenuItem}); + this.exportRawAssetsToolStripMenuItem.Name = "exportRawAssetsToolStripMenuItem"; + this.exportRawAssetsToolStripMenuItem.Size = new System.Drawing.Size(266, 22); + this.exportRawAssetsToolStripMenuItem.Text = "Raw"; // - // toolStripMenuItem4 + // exportRawAllToolStripMenuItem // - this.toolStripMenuItem4.Name = "toolStripMenuItem4"; - this.toolStripMenuItem4.Size = new System.Drawing.Size(152, 22); - this.toolStripMenuItem4.Text = "All assets"; - this.toolStripMenuItem4.Click += new System.EventHandler(this.toolStripMenuItem4_Click); + this.exportRawAllToolStripMenuItem.Name = "exportRawAllToolStripMenuItem"; + this.exportRawAllToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.exportRawAllToolStripMenuItem.Tag = "all"; + this.exportRawAllToolStripMenuItem.Text = "All assets"; + this.exportRawAllToolStripMenuItem.Click += new System.EventHandler(this.exportRawAssetsByToolStripMenuItem); // - // toolStripMenuItem5 + // exportRawSelectToolStripMenuItem // - this.toolStripMenuItem5.Name = "toolStripMenuItem5"; - this.toolStripMenuItem5.Size = new System.Drawing.Size(152, 22); - this.toolStripMenuItem5.Text = "Selected assets"; - this.toolStripMenuItem5.Click += new System.EventHandler(this.toolStripMenuItem5_Click); + this.exportRawSelectToolStripMenuItem.Name = "exportRawSelectToolStripMenuItem"; + this.exportRawSelectToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.exportRawSelectToolStripMenuItem.Tag = "select"; + this.exportRawSelectToolStripMenuItem.Text = "Selected assets"; + this.exportRawSelectToolStripMenuItem.Click += new System.EventHandler(this.exportRawAssetsByToolStripMenuItem); // - // toolStripMenuItem6 + // exportRawFilterToolStripMenuItem // - this.toolStripMenuItem6.Name = "toolStripMenuItem6"; - this.toolStripMenuItem6.Size = new System.Drawing.Size(152, 22); - this.toolStripMenuItem6.Text = "Filtered assets"; - this.toolStripMenuItem6.Click += new System.EventHandler(this.toolStripMenuItem6_Click); + this.exportRawFilterToolStripMenuItem.Name = "exportRawFilterToolStripMenuItem"; + this.exportRawFilterToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.exportRawFilterToolStripMenuItem.Tag = "filter"; + this.exportRawFilterToolStripMenuItem.Text = "Filtered assets"; + this.exportRawFilterToolStripMenuItem.Click += new System.EventHandler(this.exportRawAssetsByToolStripMenuItem); // - // toolStripMenuItem3 + // dumpAssetsToolStripMenuItem // - this.toolStripMenuItem3.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItem7, - this.toolStripMenuItem8, - this.toolStripMenuItem9}); - this.toolStripMenuItem3.Name = "toolStripMenuItem3"; - this.toolStripMenuItem3.Size = new System.Drawing.Size(266, 22); - this.toolStripMenuItem3.Text = "Dump"; + this.dumpAssetsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.dumpAllToolStripMenuItem, + this.dumpSelectToolStripMenuItem, + this.dumpFilterToolStripMenuItem}); + this.dumpAssetsToolStripMenuItem.Name = "dumpAssetsToolStripMenuItem"; + this.dumpAssetsToolStripMenuItem.Size = new System.Drawing.Size(266, 22); + this.dumpAssetsToolStripMenuItem.Text = "Dump"; // - // toolStripMenuItem7 + // dumpAllToolStripMenuItem // - this.toolStripMenuItem7.Name = "toolStripMenuItem7"; - this.toolStripMenuItem7.Size = new System.Drawing.Size(152, 22); - this.toolStripMenuItem7.Text = "All assets"; - this.toolStripMenuItem7.Click += new System.EventHandler(this.toolStripMenuItem7_Click); + this.dumpAllToolStripMenuItem.Name = "dumpAllToolStripMenuItem"; + this.dumpAllToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.dumpAllToolStripMenuItem.Tag = "all"; + this.dumpAllToolStripMenuItem.Text = "All assets"; + this.dumpAllToolStripMenuItem.Click += new System.EventHandler(this.dumpAssetsByToolStripMenuItem); // - // toolStripMenuItem8 + // dumpSelectToolStripMenuItem // - this.toolStripMenuItem8.Name = "toolStripMenuItem8"; - this.toolStripMenuItem8.Size = new System.Drawing.Size(152, 22); - this.toolStripMenuItem8.Text = "Selected assets"; - this.toolStripMenuItem8.Click += new System.EventHandler(this.toolStripMenuItem8_Click); + this.dumpSelectToolStripMenuItem.Name = "dumpSelectToolStripMenuItem"; + this.dumpSelectToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.dumpSelectToolStripMenuItem.Tag = "select"; + this.dumpSelectToolStripMenuItem.Text = "Selected assets"; + this.dumpSelectToolStripMenuItem.Click += new System.EventHandler(this.dumpAssetsByToolStripMenuItem); // - // toolStripMenuItem9 + // dumpFilterToolStripMenuItem // - this.toolStripMenuItem9.Name = "toolStripMenuItem9"; - this.toolStripMenuItem9.Size = new System.Drawing.Size(152, 22); - this.toolStripMenuItem9.Text = "Filtered assets"; - this.toolStripMenuItem9.Click += new System.EventHandler(this.toolStripMenuItem9_Click); + this.dumpFilterToolStripMenuItem.Name = "dumpFilterToolStripMenuItem"; + this.dumpFilterToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.dumpFilterToolStripMenuItem.Tag = "filter"; + this.dumpFilterToolStripMenuItem.Text = "Filtered assets"; + this.dumpFilterToolStripMenuItem.Click += new System.EventHandler(this.dumpAssetsByToolStripMenuItem); + // + // jsonDumpAssetsToolStripMenuItem + // + this.jsonDumpAssetsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.jsonDumpAllToolStripMenuItem, + this.jsonDumpSelectToolStripMenuItem, + this.jsonDumpFilterToolStripMenuItem}); + this.jsonDumpAssetsToolStripMenuItem.Name = "jsonDumpAssetsToolStripMenuItem"; + this.jsonDumpAssetsToolStripMenuItem.Size = new System.Drawing.Size(266, 22); + this.jsonDumpAssetsToolStripMenuItem.Text = "JSON Dump"; + // + // jsonDumpAllToolStripMenuItem + // + this.jsonDumpAllToolStripMenuItem.Name = "jsonDumpAllToolStripMenuItem"; + this.jsonDumpAllToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.jsonDumpAllToolStripMenuItem.Tag = "all"; + this.jsonDumpAllToolStripMenuItem.Text = "All assets"; + this.jsonDumpAllToolStripMenuItem.Click += new System.EventHandler(this.jsonDumpAssetsByToolStripMenuItem); + // + // jsonDumpSelectToolStripMenuItem + // + this.jsonDumpSelectToolStripMenuItem.Name = "jsonDumpSelectToolStripMenuItem"; + this.jsonDumpSelectToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.jsonDumpSelectToolStripMenuItem.Tag = "select"; + this.jsonDumpSelectToolStripMenuItem.Text = "Selected assets"; + this.jsonDumpSelectToolStripMenuItem.Click += new System.EventHandler(this.jsonDumpAssetsByToolStripMenuItem); + // + // jsonDumpFilterToolStripMenuItem + // + this.jsonDumpFilterToolStripMenuItem.Name = "jsonDumpFilterToolStripMenuItem"; + this.jsonDumpFilterToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.jsonDumpFilterToolStripMenuItem.Tag = "filter"; + this.jsonDumpFilterToolStripMenuItem.Text = "Filtered assets"; + this.jsonDumpFilterToolStripMenuItem.Click += new System.EventHandler(this.jsonDumpAssetsByToolStripMenuItem); // // toolStripSeparator6 // @@ -685,36 +733,39 @@ this.toolStripSeparator2.Name = "toolStripSeparator2"; this.toolStripSeparator2.Size = new System.Drawing.Size(263, 6); // - // toolStripMenuItem10 + // exportAssetListXmlToolStripMenuItem // - this.toolStripMenuItem10.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolStripMenuItem11, - this.toolStripMenuItem12, - this.toolStripMenuItem13}); - this.toolStripMenuItem10.Name = "toolStripMenuItem10"; - this.toolStripMenuItem10.Size = new System.Drawing.Size(266, 22); - this.toolStripMenuItem10.Text = "Asset list to XML"; + this.exportAssetListXmlToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.exportAssetListXmlAllToolStripMenuItem, + this.exportAssetListXmlSelectToolStripMenuItem, + this.exportAssetListXmlFilterToolStripMenuItem}); + this.exportAssetListXmlToolStripMenuItem.Name = "exportAssetListXmlToolStripMenuItem"; + this.exportAssetListXmlToolStripMenuItem.Size = new System.Drawing.Size(266, 22); + this.exportAssetListXmlToolStripMenuItem.Text = "Asset list to XML"; // - // toolStripMenuItem11 + // exportAssetListXmlAllToolStripMenuItem // - this.toolStripMenuItem11.Name = "toolStripMenuItem11"; - this.toolStripMenuItem11.Size = new System.Drawing.Size(152, 22); - this.toolStripMenuItem11.Text = "All assets"; - this.toolStripMenuItem11.Click += new System.EventHandler(this.toolStripMenuItem11_Click); + this.exportAssetListXmlAllToolStripMenuItem.Name = "exportAssetListXmlAllToolStripMenuItem"; + this.exportAssetListXmlAllToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.exportAssetListXmlAllToolStripMenuItem.Tag = "all"; + this.exportAssetListXmlAllToolStripMenuItem.Text = "All assets"; + this.exportAssetListXmlAllToolStripMenuItem.Click += new System.EventHandler(this.exportAssetsListByToolStripMenuItem); // - // toolStripMenuItem12 + // exportAssetListXmlSelectToolStripMenuItem // - this.toolStripMenuItem12.Name = "toolStripMenuItem12"; - this.toolStripMenuItem12.Size = new System.Drawing.Size(152, 22); - this.toolStripMenuItem12.Text = "Selected assets"; - this.toolStripMenuItem12.Click += new System.EventHandler(this.toolStripMenuItem12_Click); + this.exportAssetListXmlSelectToolStripMenuItem.Name = "exportAssetListXmlSelectToolStripMenuItem"; + this.exportAssetListXmlSelectToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.exportAssetListXmlSelectToolStripMenuItem.Tag = "select"; + this.exportAssetListXmlSelectToolStripMenuItem.Text = "Selected assets"; + this.exportAssetListXmlSelectToolStripMenuItem.Click += new System.EventHandler(this.exportAssetsListByToolStripMenuItem); // - // toolStripMenuItem13 + // exportAssetListXmlFilterToolStripMenuItem // - this.toolStripMenuItem13.Name = "toolStripMenuItem13"; - this.toolStripMenuItem13.Size = new System.Drawing.Size(152, 22); - this.toolStripMenuItem13.Text = "Filtered assets"; - this.toolStripMenuItem13.Click += new System.EventHandler(this.toolStripMenuItem13_Click); + this.exportAssetListXmlFilterToolStripMenuItem.Name = "exportAssetListXmlFilterToolStripMenuItem"; + this.exportAssetListXmlFilterToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.exportAssetListXmlFilterToolStripMenuItem.Tag = "filter"; + this.exportAssetListXmlFilterToolStripMenuItem.Text = "Filtered assets"; + this.exportAssetListXmlFilterToolStripMenuItem.Click += new System.EventHandler(this.exportAssetsListByToolStripMenuItem); // // filterTypeToolStripMenuItem // @@ -1806,14 +1857,14 @@ private System.Windows.Forms.ToolStripMenuItem exportSelectedObjectsmergeWithAnimationClipToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem5; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem6; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem7; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem8; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem9; + private System.Windows.Forms.ToolStripMenuItem exportRawAssetsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exportRawAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exportRawSelectToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exportRawFilterToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem dumpAssetsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem dumpAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem dumpSelectToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem dumpFilterToolStripMenuItem; private System.Windows.Forms.ColumnHeader columnHeaderContainer; private System.Windows.Forms.ColumnHeader columnHeaderPathID; private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; @@ -1822,10 +1873,10 @@ private System.Windows.Forms.TabPage tabPage5; private System.Windows.Forms.TextBox dumpTextBox; private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem10; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem11; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem12; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem13; + private System.Windows.Forms.ToolStripMenuItem exportAssetListXmlToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exportAssetListXmlAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exportAssetListXmlSelectToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exportAssetListXmlFilterToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem15; private System.Windows.Forms.ToolStripMenuItem dumpSelectedAssetsToolStripMenuItem; private System.Windows.Forms.ContextMenuStrip sceneContextMenuStrip; @@ -1885,6 +1936,10 @@ private System.Windows.Forms.ToolStripMenuItem moreStudioOptionsToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator optionsMenuSeparator2; private System.Windows.Forms.ToolStripMenuItem decompressBundlesToDiskToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem jsonDumpAssetsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem jsonDumpAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem jsonDumpSelectToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem jsonDumpFilterToolStripMenuItem; } } diff --git a/AssetStudioGUI/AssetStudioGUIForm.cs b/AssetStudioGUI/AssetStudioGUIForm.cs index df08e78..5206fdb 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.cs @@ -1832,76 +1832,6 @@ namespace AssetStudioGUI } } - private void goToSceneHierarchyToolStripMenuItem_Click(object sender, EventArgs e) - { - var selectAsset = (AssetItem)assetListView.Items[assetListView.SelectedIndices[0]]; - if (selectAsset.TreeNode != null) - { - sceneTreeView.SelectedNode = selectAsset.TreeNode; - tabControl1.SelectedTab = tabPage1; - } - } - - private void exportAllAssetsMenuItem_Click(object sender, EventArgs e) - { - ExportAssets(ExportFilter.All, ExportType.Convert); - } - - private void exportSelectedAssetsMenuItem_Click(object sender, EventArgs e) - { - ExportAssets(ExportFilter.Selected, ExportType.Convert); - } - - private void exportFilteredAssetsMenuItem_Click(object sender, EventArgs e) - { - ExportAssets(ExportFilter.Filtered, ExportType.Convert); - } - - private void toolStripMenuItem4_Click(object sender, EventArgs e) - { - ExportAssets(ExportFilter.All, ExportType.Raw); - } - - private void toolStripMenuItem5_Click(object sender, EventArgs e) - { - ExportAssets(ExportFilter.Selected, ExportType.Raw); - } - - private void toolStripMenuItem6_Click(object sender, EventArgs e) - { - ExportAssets(ExportFilter.Filtered, ExportType.Raw); - } - - private void toolStripMenuItem7_Click(object sender, EventArgs e) - { - ExportAssets(ExportFilter.All, ExportType.Dump); - } - - private void toolStripMenuItem8_Click(object sender, EventArgs e) - { - ExportAssets(ExportFilter.Selected, ExportType.Dump); - } - - private void toolStripMenuItem9_Click(object sender, EventArgs e) - { - ExportAssets(ExportFilter.Filtered, ExportType.Dump); - } - - private void toolStripMenuItem11_Click(object sender, EventArgs e) - { - ExportAssetsList(ExportFilter.All); - } - - private void toolStripMenuItem12_Click(object sender, EventArgs e) - { - ExportAssetsList(ExportFilter.Selected); - } - - private void toolStripMenuItem13_Click(object sender, EventArgs e) - { - ExportAssetsList(ExportFilter.Filtered); - } - private void exportAllObjectsSplitToolStripMenuItem1_Click(object sender, EventArgs e) { if (sceneTreeView.Nodes.Count > 0) @@ -1912,7 +1842,7 @@ namespace AssetStudioGUI { saveDirectoryBackup = saveFolderDialog.Folder; var savePath = saveFolderDialog.Folder + Path.DirectorySeparatorChar; - ExportSplitObjects(savePath, sceneTreeView.Nodes); + Studio.ExportSplitObjects(savePath, sceneTreeView.Nodes); } } else @@ -1921,6 +1851,62 @@ namespace AssetStudioGUI } } + private void goToSceneHierarchyToolStripMenuItem_Click(object sender, EventArgs e) + { + var selectAsset = (AssetItem)assetListView.Items[assetListView.SelectedIndices[0]]; + if (selectAsset.TreeNode != null) + { + sceneTreeView.SelectedNode = selectAsset.TreeNode; + tabControl1.SelectedTab = tabPage1; + } + } + + private static ExportFilter GetExportFilterFromTag(string tag) + { + switch (tag) + { + case "all": return ExportFilter.All; + case "select": return ExportFilter.Selected; + case "filter": return ExportFilter.Filtered; + default: throw new NotSupportedException(); + } + } + + private void exportAssetsByToolStripMenuItem(object sender, EventArgs e) + { + var menuItem = (ToolStripMenuItem)sender; + var exportFilter = GetExportFilterFromTag((string)menuItem.Tag); + ExportAssets(exportFilter, ExportType.Convert); + } + + private void exportRawAssetsByToolStripMenuItem(object sender, EventArgs e) + { + var menuItem = (ToolStripMenuItem)sender; + var exportFilter = GetExportFilterFromTag((string)menuItem.Tag); + ExportAssets(exportFilter, ExportType.Raw); + } + + private void dumpAssetsByToolStripMenuItem(object sender, EventArgs e) + { + var menuItem = (ToolStripMenuItem)sender; + var exportFilter = GetExportFilterFromTag((string)menuItem.Tag); + ExportAssets(exportFilter, ExportType.Dump); + } + + private void jsonDumpAssetsByToolStripMenuItem(object sender, EventArgs e) + { + var menuItem = (ToolStripMenuItem)sender; + var exportFilter = GetExportFilterFromTag((string)menuItem.Tag); + ExportAssets(exportFilter, ExportType.JsonDump); + } + + private void exportAssetsListByToolStripMenuItem(object sender, EventArgs e) + { + var menuItem = (ToolStripMenuItem)sender; + var exportFilter = GetExportFilterFromTag((string)menuItem.Tag); + ExportAssetsList(exportFilter); + } + private void assetListView_SelectedIndexChanged(object sender, EventArgs e) { ProcessSelectedItems(); diff --git a/AssetStudioGUI/Exporter.cs b/AssetStudioGUI/Exporter.cs index 751c18c..aef2791 100644 --- a/AssetStudioGUI/Exporter.cs +++ b/AssetStudioGUI/Exporter.cs @@ -329,6 +329,19 @@ namespace AssetStudioGUI return false; } + public static bool ExportJsonDumpFile(AssetItem item, string exportPath) + { + if (!TryExportFile(exportPath, item, ".json", out var exportFullPath, mode: "JsonDump")) + return false; + var m_Type = item.Asset is MonoBehaviour m_MonoBehaviour + ? m_MonoBehaviour.serializedType.m_Type ?? Studio.MonoBehaviourToTypeTree(m_MonoBehaviour) + : null; + var jsonDoc = item.Asset.ToJsonDoc(m_Type); + var str = System.Text.Json.JsonSerializer.Serialize(jsonDoc, Object.JsonOptions); + File.WriteAllText(exportFullPath, str); + return true; + } + public static bool ExportConvertFile(AssetItem item, string exportPath) { switch (item.Type) diff --git a/AssetStudioGUI/Studio.cs b/AssetStudioGUI/Studio.cs index f200c97..39c1133 100644 --- a/AssetStudioGUI/Studio.cs +++ b/AssetStudioGUI/Studio.cs @@ -13,7 +13,6 @@ using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Linq; -using static AssetStudioGUI.Exporter; using Object = AssetStudio.Object; namespace AssetStudioGUI @@ -29,7 +28,8 @@ namespace AssetStudioGUI { Convert, Raw, - Dump + Dump, + JsonDump, } internal enum ExportFilter @@ -534,7 +534,7 @@ namespace AssetStudioGUI var toParallelExportAssetDict = new ConcurrentDictionary(); var exceptionMsgs = new ConcurrentDictionary(); var parallelExportCount = GetParallelExportCount(); - var mode = exportType == ExportType.Dump ? "Dump" : "Export"; + var mode = exportType == ExportType.Dump || exportType == ExportType.JsonDump ? "Dump" : "Export"; var toExportCount = toExportAssets.Count; var exportedCount = 0; var i = 0; @@ -634,13 +634,16 @@ namespace AssetStudioGUI switch (exportType) { case ExportType.Raw: - isExported = ExportRawFile(asset, exportPath); + isExported = Exporter.ExportRawFile(asset, exportPath); break; case ExportType.Dump: - isExported = ExportDumpFile(asset, exportPath); + isExported = Exporter.ExportDumpFile(asset, exportPath); + break; + case ExportType.JsonDump: + isExported = Exporter.ExportJsonDumpFile(asset, exportPath); break; case ExportType.Convert: - isExported = ExportConvertFile(asset, exportPath); + isExported = Exporter.ExportConvertFile(asset, exportPath); break; } } @@ -793,7 +796,7 @@ namespace AssetStudioGUI continue; } //处理非法文件名 - var filename = FixFileName(j.Text); + var filename = Exporter.FixFileName(j.Text); //每个文件存放在单独的文件夹 var targetPath = $"{savePath}{filename}{Path.DirectorySeparatorChar}"; //重名文件处理 @@ -813,7 +816,7 @@ namespace AssetStudioGUI Logger.Info($"Exporting {filename}.fbx"); try { - ExportGameObject(j.gameObject, targetPath); + Exporter.ExportGameObject(j.gameObject, targetPath); } catch (Exception ex) { @@ -849,7 +852,7 @@ namespace AssetStudioGUI Logger.Info($"Exporting {animator.Text}"); try { - ExportAnimator(animator, exportPath, animationList); + Exporter.ExportAnimator(animator, exportPath, animationList); if (Properties.Settings.Default.openAfterExport) { OpenFolderInExplorer(exportPath); @@ -882,7 +885,7 @@ namespace AssetStudioGUI try { var modelExportPath = Path.Combine(exportPath, gameObject.m_Name) + Path.DirectorySeparatorChar; - ExportGameObject(gameObject, modelExportPath, animationList); + Exporter.ExportGameObject(gameObject, modelExportPath, animationList); Logger.Info($"Finished exporting {gameObject.m_Name}"); } catch (Exception ex) @@ -914,7 +917,7 @@ namespace AssetStudioGUI Logger.Info($"Exporting {name}"); try { - ExportGameObjectMerge(gameObjects, exportPath, animationList); + Exporter.ExportGameObjectMerge(gameObjects, exportPath, animationList); Progress.Report(1, 1); Logger.Info($"Finished exporting {name}"); }