diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack.meta new file mode 100644 index 00000000..7182dbd8 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 611bc182f939ea147a72b08613e2d2ba +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors.meta new file mode 100644 index 00000000..88093e68 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cbe37300d75dbd641be2e6dca83a913c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs new file mode 100644 index 00000000..5234487e --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs @@ -0,0 +1,262 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using System; +using UnityEditor; +using System.IO; +using UnityEngine; +using System.Text; + +namespace AxibugEmuOnline.Editors +{ + public class AxibugNSPTools : Editor + { + static string WorkRoot = Path.GetFullPath(Path.Combine(Application.dataPath,"AxiProjectTools/AxiNSPack")); + static string switch_keys = Path.GetFullPath(Path.Combine(Application.dataPath, "AxiProjectTools/AxiNSPack/switch_keys")); + static string hacpack_root = Path.GetFullPath(Path.Combine(Application.dataPath, "AxiProjectTools/AxiNSPack/hacpack")); + static Dictionary<string, string> tools = new Dictionary<string, string>(); + static string prodKeysPath; + + [MenuItem("Axibug��ֲ����/Switch/AxibugNSPTools/RepackNSP")] + static void RepackNSP() + { + if (!CheckEnvironmentVariable()) + return; + + string path = EditorUtility.OpenFilePanel( + title: "ѡ�� .nsp �ļ�", + directory: Path.Combine(Application.dataPath,".."), // Ĭ��·��Ϊ��Ŀ Assets Ŀ¼ + extension: "nsp" // �����ļ�����Ϊ .nsp + ); + + if (string.IsNullOrEmpty(path)) + return; + + RepackNSP(path); + } + static bool CheckEnvironmentVariable() + { + // ��ȡ������������Ҫ���ӻ���������飩 + string sdkRoot = Environment.GetEnvironmentVariable("NINTENDO_SDK_ROOT"); + if (string.IsNullOrEmpty(sdkRoot)) + { + Debug.LogError($"[AxibugNSPTools]������ȷ���û�������:NINTENDO_SDK_ROOT,(�������ã���֤���ú�����Unity Hub��Unity)"); + return false; + } + + #region ��ȡprod.keys�ļ�·�� + prodKeysPath = Path.Combine( + switch_keys, + "prod.keys" + ); + + if (!File.Exists(prodKeysPath)) + { + Debug.LogError($"[AxibugNSPTools]δ�ҵ� prod.keys! �������ļ���path:{prodKeysPath}"); + return false; + } + #endregion + + return true; + } + + static void RepackNSP(string nspFile) + { + #region ��ʼ������·�� + // ��ȡ������������Ҫ���ӻ���������飩 + string sdkRoot = Environment.GetEnvironmentVariable("NINTENDO_SDK_ROOT"); + tools["authoringTool"] = Path.Combine(sdkRoot, "Tools/CommandLineTools/AuthoringTool/AuthoringTool.exe"); + tools["hacPack"] = hacpack_root; + #endregion + + #region ����NSP�ļ�·�� + string nspFilePath = nspFile; + string nspFileName = Path.GetFileName(nspFilePath); + string nspParentDir = Path.GetDirectoryName(nspFilePath); + #endregion + + #region ��ȡTitle ID + string titleID = ExtractTitleID(nspFilePath) ?? ManualTitleIDInput(); + Debug.Log($"[AxibugNSPTools]Using Title ID: {titleID}"); + #endregion + + #region ������ʱĿ¼ + CleanDirectory(Path.Combine(nspParentDir, "repacker_extract")); + CleanDirectory(Path.Combine(Path.GetTempPath(), "NCA")); + CleanDirectory(Path.Combine(WorkRoot, "hacpack_backup")); + #endregion + + #region ���NSP�ļ� + string extractPath = Path.Combine(nspParentDir, "repacker_extract"); + ExecuteCommand($"{tools["authoringTool"]} extract -o \"{extractPath}\" \"{nspFilePath}\""); + + var (controlPath, programPath) = FindNACPAndNPDPaths(extractPath); + if (controlPath == null || programPath == null) + { + Debug.LogError("[AxibugNSPTools] Critical directory structure not found!"); + return; + } + #endregion + + #region �ؽ�NCA/NSP + string tmpPath = Path.Combine(Path.GetTempPath(), "NCA"); + string programNCA = BuildProgramNCA(tmpPath, titleID, programPath); + string controlNCA = BuildControlNCA(tmpPath, titleID, controlPath); + BuildMetaNCA(tmpPath, titleID, programNCA, controlNCA); + + string outputNSP = BuildFinalNSP(nspFilePath, nspParentDir, tmpPath, titleID); + Debug.Log($"[AxibugNSPTools]Repacking completed: {outputNSP}"); + #endregion + } + + #region �������� + static string GetUserInput() + { + Console.Write("Enter the NSP filepath: "); + return Console.ReadLine(); + } + + static string ExtractTitleID(string path) + { + var match = Regex.Match(path, @"0100[\dA-Fa-f]{12}"); + return match.Success ? match.Value : null; + } + + static string ManualTitleIDInput() + { + Console.Write("Enter Title ID manually: "); + return Console.ReadLine().Trim(); + } + + static void CleanDirectory(string path) + { + if (Directory.Exists(path)) + { + Directory.Delete(path, true); + while (Directory.Exists(path)) ; // �ȴ�ɾ����� + } + } + + static (string, string) FindNACPAndNPDPaths(string basePath) + { + foreach (var dir in Directory.GetDirectories(basePath)) + { + if (File.Exists(Path.Combine(dir, "fs0/control.nacp"))) + return (dir, null); + if (File.Exists(Path.Combine(dir, "fs0/main.npdm"))) + return (null, dir); + } + return (null, null); + } + + static string ExecuteCommand(string command) + { + var process = new System.Diagnostics.Process() + { + StartInfo = new System.Diagnostics.ProcessStartInfo + { + FileName = "cmd.exe", + Arguments = $"/C {command}", + RedirectStandardOutput = true, + RedirectStandardError = true, // ���Ӵ������ض��� + UseShellExecute = false, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8, // ��ȷָ������ + StandardErrorEncoding = Encoding.UTF8 + } + }; + + var outputBuilder = new StringBuilder(); + var errorBuilder = new StringBuilder(); + + // ʹ���¼���������ʵʱ��� + process.OutputDataReceived += (sender, args) => + { + if (!string.IsNullOrEmpty(args.Data)) + { + outputBuilder.AppendLine(args.Data); + Debug.Log($"[AxibugNSPTools]{args.Data}"); + } + }; + + process.ErrorDataReceived += (sender, args) => + { + if (!string.IsNullOrEmpty(args.Data)) + { + errorBuilder.AppendLine(args.Data); + Debug.LogError($"[AxibugNSPTools]{args.Data}"); + } + }; + + process.Start(); + + // ��ʼ�첽��ȡ��� + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + + // �ȴ������˳�����ʱ���ѹرգ� + process.WaitForExit(); + + // ��������Ϣ���ӵ������ + if (errorBuilder.Length > 0) + { + outputBuilder.AppendLine("\nError Output:"); + outputBuilder.Append(errorBuilder); + } + + return outputBuilder.ToString(); + } + #endregion + + #region NCA������ + static string BuildProgramNCA(string tmpPath, string titleID, string programDir) + { + string args = $"-k \"{prodKeysPath}\" -o \"{tmpPath}\" --titleid {titleID} " + + $"--type nca --ncatype program --exefsdir \"{programDir}/fs0\" " + + $"--romfsdir \"{programDir}/fs1\" --logodir \"{programDir}/fs2\""; + + string output = ExecuteCommand($"{tools["hacPack"]} {args}"); + return ParseNCAOutput(output, "Program"); + } + + static string BuildControlNCA(string tmpPath, string titleID, string controlDir) + { + string args = $"-k \"{prodKeysPath}\" -o \"{tmpPath}\" --titleid {titleID} " + + $"--type nca --ncatype control --romfsdir \"{controlDir}/fs0\""; + + string output = ExecuteCommand($"{tools["hacPack"]} {args}"); + return ParseNCAOutput(output, "Control"); + } + + static void BuildMetaNCA(string tmpPath, string titleID, string programNCA, string controlNCA) + { + string args = $"-k \"{prodKeysPath}\" -o \"{tmpPath}\" --titleid {titleID} " + + $"--type nca --ncatype meta --titletype application " + + $"--programnca \"{programNCA}\" --controlnca \"{controlNCA}\""; + + ExecuteCommand($"{tools["hacPack"]} {args}"); + } + + static string BuildFinalNSP(string origPath, string parentDir, string tmpPath, string titleID) + { + string outputPath = origPath.Replace(".nsp", "_repacked.nsp"); + if (File.Exists(outputPath)) File.Delete(outputPath); + + string args = $"-k \"{prodKeysPath}\" -o \"{parentDir}\" --titleid {titleID} " + + $"--type nsp --ncadir \"{tmpPath}\""; + + ExecuteCommand($"{tools["hacPack"]} {args}"); + File.Move(Path.Combine(parentDir, $"{titleID}.nsp"), outputPath); + return outputPath; + } + + static string ParseNCAOutput(string output, string type) + { + var line = output.Split('\n') + .FirstOrDefault(l => l.Contains($"Created {type} NCA:")); + + return line?.Split(':').Last().Trim(); + } + #endregion + } +} diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs.meta new file mode 100644 index 00000000..a48f3e39 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 55aa3f0466c30bc4683cdbdc4dd75940 \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack.meta new file mode 100644 index 00000000..f4c02cc9 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d90c85ddb14ad7e4e9a6242ba135da0b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools.meta new file mode 100644 index 00000000..e6fce366 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b31e2ae7250c09548a777d4dcdfe2d1f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP.meta new file mode 100644 index 00000000..708c152c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7be57cd4293e9dc4297ea9b83fe08b18 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/hptnacp.exe b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/hptnacp.exe new file mode 100644 index 00000000..7b48599a Binary files /dev/null and b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/hptnacp.exe differ diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/hptnacp.exe.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/hptnacp.exe.meta new file mode 100644 index 00000000..81ccc3b3 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/hptnacp.exe.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e1252f6d74d67ee48af0a0342aecc981 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/sample_hbemnu.nacp.xml b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/sample_hbemnu.nacp.xml new file mode 100644 index 00000000..09433f89 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/sample_hbemnu.nacp.xml @@ -0,0 +1,152 @@ +<?xml version="1.0" encoding="utf-8"?> +<Application> + <Title> + <Language>AmericanEnglish</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>BritishEnglish</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>Japanese</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>French</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>German</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>LatinAmericanSpanish</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>Spanish</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>Italian</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>Dutch</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>CanadianFrench</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>Portuguese</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Title> + <Language>Russian</Language> + <Name>Homebrew Menu</Name> + <Publisher>Yellows8</Publisher> + </Title> + <Isbn/> + <StartupUserAccount>Required</StartupUserAccount> + <UserAccountSwitchLock>Disable</UserAccountSwitchLock> + <ParentalControl>None</ParentalControl> + <SupportedLanguage>AmericanEnglish</SupportedLanguage> + <SupportedLanguage>BritishEnglish</SupportedLanguage> + <SupportedLanguage>Japanese</SupportedLanguage> + <SupportedLanguage>French</SupportedLanguage> + <SupportedLanguage>German</SupportedLanguage> + <SupportedLanguage>LatinAmericanSpanish</SupportedLanguage> + <SupportedLanguage>Spanish</SupportedLanguage> + <SupportedLanguage>Italian</SupportedLanguage> + <SupportedLanguage>Dutch</SupportedLanguage> + <SupportedLanguage>CanadianFrench</SupportedLanguage> + <SupportedLanguage>Russian</SupportedLanguage> + <Screenshot>Allow</Screenshot> + <VideoCapture>Disable</VideoCapture> + <PresenceGroupId>0x0104444444441001</PresenceGroupId> + <DisplayVersion>2.0</DisplayVersion> + <Rating> + <Organization>CERO</Organization> + <Age>12</Age> + </Rating> + <Rating> + <Organization>ESRB</Organization> + <Age>10</Age> + </Rating> + <Rating> + <Organization>USK</Organization> + <Age>12</Age> + </Rating> + <Rating> + <Organization>PEGI</Organization> + <Age>12</Age> + </Rating> + <Rating> + <Organization>PEGIPortugal</Organization> + <Age>12</Age> + </Rating> + <Rating> + <Organization>PEGIBBFC</Organization> + <Age>12</Age> + </Rating> + <Rating> + <Organization>Russian</Organization> + <Age>12</Age> + </Rating> + <Rating> + <Organization>ACB</Organization> + <Age>13</Age> + </Rating> + <Rating> + <Organization>OFLC</Organization> + <Age>13</Age> + </Rating> + <DataLossConfirmation>Required</DataLossConfirmation> + <PlayLogPolicy>All</PlayLogPolicy> + <SaveDataOwnerId>0x0104444444441001</SaveDataOwnerId> + <UserAccountSaveDataSize>0x0000000003e00000</UserAccountSaveDataSize> + <UserAccountSaveDataJournalSize>0x0000000000180000</UserAccountSaveDataJournalSize> + <DeviceSaveDataSize>0x0000000000000000</DeviceSaveDataSize> + <DeviceSaveDataJournalSize>0x0000000000000000</DeviceSaveDataJournalSize> + <BcatDeliveryCacheStorageSize>0x0000000000000000</BcatDeliveryCacheStorageSize> + <ApplicationErrorCodeCategory/> + <AddOnContentBaseId>0x0104444444442001</AddOnContentBaseId> + <LogoType>Nintendo</LogoType> + <LocalCommunicationId>0x0104444444441001</LocalCommunicationId> + <LogoHandling>Auto</LogoHandling> + <SeedForPseudoDeviceId>0x0000000000000000</SeedForPseudoDeviceId> + <BcatPassphrase/> + <AddOnContentRegistrationType>AllOnLaunch</AddOnContentRegistrationType> + <UserAccountSaveDataSizeMax>0x0000000000000000</UserAccountSaveDataSizeMax> + <UserAccountSaveDataJournalSizeMax>0x0000000000000000</UserAccountSaveDataJournalSizeMax> + <DeviceSaveDataSizeMax>0x0000000000000000</DeviceSaveDataSizeMax> + <DeviceSaveDataJournalSizeMax>0x0000000000000000</DeviceSaveDataJournalSizeMax> + <TemporaryStorageSize>0x0000000000000000</TemporaryStorageSize> + <CacheStorageSize>0x0000000000000000</CacheStorageSize> + <CacheStorageJournalSize>0x0000000000000000</CacheStorageJournalSize> + <CacheStorageDataAndJournalSizeMax>0x0000000000000000</CacheStorageDataAndJournalSizeMax> + <CacheStorageIndexMax>0x0000000000000000</CacheStorageIndexMax> + <Hdcp>None</Hdcp> + <CrashReport>Deny</CrashReport> + <RuntimeAddOnContentInstall>Deny</RuntimeAddOnContentInstall> + <PlayLogQueryableApplicationId>0x0000000000000000</PlayLogQueryableApplicationId> + <PlayLogQueryCapability>None</PlayLogQueryCapability> + <Repair>None</Repair> + <Attribute>None</Attribute> + <ProgramIndex>0</ProgramIndex> + <RequiredNetworkServiceLicenseOnLaunch>None</RequiredNetworkServiceLicenseOnLaunch> +</Application> diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/sample_hbemnu.nacp.xml.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/sample_hbemnu.nacp.xml.meta new file mode 100644 index 00000000..abd644c0 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/Tools/hacPackTools-NACP/sample_hbemnu.nacp.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 42c1295c31de3a948825b9e8e9e8184f +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/hacpack.exe b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/hacpack.exe new file mode 100644 index 00000000..293ebb79 Binary files /dev/null and b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/hacpack.exe differ diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/hacpack.exe.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/hacpack.exe.meta new file mode 100644 index 00000000..d694a349 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/hacpack/hacpack.exe.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7b1b3ff7954facb409d3ba6f9840f762 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys.meta new file mode 100644 index 00000000..5ab90e7c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 409c6e8e5ead0ac4991ea6c243e407dd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys/copy prod.keys To here.txt b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys/copy prod.keys To here.txt new file mode 100644 index 00000000..e69de29b diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys/copy prod.keys To here.txt.meta b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys/copy prod.keys To here.txt.meta new file mode 100644 index 00000000..a36d51af --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/AxiNSPack/switch_keys/copy prod.keys To here.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 08bd0c8a53daacb4ea23b14dde156354 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/AxiProjectTools/Editors/AxiProjectTools.cs b/AxibugEmuOnline.Client/Assets/AxiProjectTools/Editors/AxiProjectTools.cs index 31e38257..fa31dc04 100644 --- a/AxibugEmuOnline.Client/Assets/AxiProjectTools/Editors/AxiProjectTools.cs +++ b/AxibugEmuOnline.Client/Assets/AxiProjectTools/Editors/AxiProjectTools.cs @@ -29,7 +29,7 @@ public class AxiProjectTools : EditorWindow } } - [MenuItem("Axibug移植工具/[1]采集所有预制体和场景下的UGUI组件")] + [MenuItem("Axibug移植工具/ToLowVersionUnity/[1]采集所有预制体和场景下的UGUI组件")] public static void Part1() { GoTAxiProjectToolsSence(); @@ -132,7 +132,7 @@ public class AxiProjectTools : EditorWindow #endif } - [MenuItem("Axibug移植工具/[2]生成中间脚本代码")] + [MenuItem("Axibug移植工具/ToLowVersionUnity/[2]生成中间脚本代码")] public static void Part2() { if (UnityEngine.Windows.Directory.Exists(outCsDir)) @@ -161,7 +161,7 @@ public class AxiProjectTools : EditorWindow Debug.Log("<Color=#FFF333>处理完毕 [2]生成中间脚本代码</color>"); } - [MenuItem("Axibug移植工具/[3]收集生成的脚本")] + [MenuItem("Axibug移植工具/ToLowVersionUnity/[3]收集生成的脚本")] public static void Part3() { AxiPrefabCache cache = AssetDatabase.LoadAssetAtPath<AxiPrefabCache>(cachecfgPath); @@ -205,7 +205,7 @@ public class AxiProjectTools : EditorWindow } - [MenuItem("Axibug移植工具/[4]替换所有预制体和场景中的组件")] + [MenuItem("Axibug移植工具/ToLowVersionUnity/[4]替换所有预制体和场景中的组件")] public static void Part4() { AxiPrefabCache cache = AssetDatabase.LoadAssetAtPath<AxiPrefabCache>(cachecfgPath); @@ -259,7 +259,7 @@ public class AxiProjectTools : EditorWindow } - [MenuItem("Axibug移植工具/[5]UnPack所有嵌套预制体和场景中的预制体")] + [MenuItem("Axibug移植工具/ToLowVersionUnity/[5]UnPack所有嵌套预制体和场景中的预制体")] public static void UnpackPrefabs() { @@ -350,7 +350,7 @@ public class AxiProjectTools : EditorWindow } - [MenuItem("Axibug移植工具/[6]修复Sprite")] + [MenuItem("Axibug移植工具/ToLowVersionUnity/[6]修复Sprite")] public static void FixMultipleMaterialSprites() { string[] guids = AssetDatabase.FindAssets("t:sprite");