From 01da084b5a9d26957eeea989d5e4773c2a33ccad Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Thu, 21 Aug 2025 02:28:12 +0800 Subject: [PATCH] =?UTF-8?q?Switch=E5=88=9D=E6=AC=A1=E6=B8=B8=E7=8E=A9?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=BD=92=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AxiNSPack/Editors/AxibugNSPTools.cs | 2 +- .../Assets/Plugins/AxiNSApi/AxiNSIO.cs | 1114 +++++++++-------- .../Assets/Resources/IMPORTENT.prefab | 15 +- .../Icons/DevicesIcons/SwitchJoyCon.png | Bin 0 -> 4090 bytes .../Icons/DevicesIcons/SwitchJoyCon.png.meta | 130 ++ .../Assets/Resources/Icons/checking.png | Bin 0 -> 6719 bytes .../Assets/Resources/Icons/checking.png.meta | 117 ++ .../Assets/Resources/Icons/download.png | Bin 0 -> 2575 bytes .../Assets/Resources/Icons/download.png.meta | 117 ++ .../Assets/Resources/Icons/downloaderror.png | Bin 0 -> 4517 bytes .../Resources/Icons/downloaderror.png.meta | 117 ++ .../Assets/Resources/Icons/syncerror.png | Bin 0 -> 4911 bytes .../Assets/Resources/Icons/syncerror.png.meta | 117 ++ .../Assets/Resources/Icons/upload.png | Bin 0 -> 5093 bytes .../Assets/Resources/Icons/upload.png.meta | 117 ++ .../Resources/UIPrefabs/OptionUI.prefab | 403 ++++-- .../Assets/Scene/AxibugEmuOnline.Client.unity | 26 +- .../Assets/Script/AppMain/App.cs | 24 +- .../Assets/Script/AppMain/AxiHttp/AxiHttp.cs | 19 +- .../PSVita/AxiPSVBackTouchEmuKey.cs | 6 +- .../Assets/Script/AppMain/DebuggerByGUI.cs | 35 +- .../NesEmulator/NesEmulator_Screen.mat | 1 + .../KeyMapperSetting/EssgeeKeyBinding.cs | 19 + .../KeyMapperSetting/MAMEKeyBinding.cs | 21 + .../KeyMapperSetting/Model/EmuCoreBinder.cs | 5 +- .../KeyMapperSetting/NesKeyBinding.cs | 17 + .../KeyMapperSetting/XMBKeyBinding.cs | 15 + .../Devices/SwitchJoyCon_D.cs | 34 + .../Devices/SwitchJoyCon_D.cs.meta | 2 + .../InputDevicesManager.cs | 40 +- .../InputResolver/InputSystemResolver.cs | 114 +- .../Manager/SaveSlotManager/SaveFile.cs | 14 +- .../SaveFileSyncStates/CheckingState.cs | 13 +- .../SaveFileSyncStates/ConflictState.cs | 3 +- .../SaveFileSyncStates/DownloadingState.cs | 18 +- .../SaveFileSyncStates/SyncFailedState.cs | 18 + .../SyncFailedState.cs.meta | 2 + .../Manager/SaveSlotManager/SimpleSFM.cs | 96 +- .../Script/AppMain/Switch/SwitchCommon.cs | 2 + .../UI/InGameUI/InGameUI_SaveStateMenu.cs | 92 +- .../UI/OptionUI/OptionUI_SavSlotItem.cs | 14 +- 41 files changed, 2098 insertions(+), 801 deletions(-) create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/DevicesIcons/SwitchJoyCon.png create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/DevicesIcons/SwitchJoyCon.png.meta create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/checking.png create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/checking.png.meta create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/download.png create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/download.png.meta create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/downloaderror.png create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/downloaderror.png.meta create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/syncerror.png create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/syncerror.png.meta create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/upload.png create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/upload.png.meta create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/SwitchJoyCon_D.cs create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/SwitchJoyCon_D.cs.meta create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/SyncFailedState.cs create mode 100644 AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/SyncFailedState.cs.meta diff --git a/AxibugEmuOnline.Client.Switch/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs b/AxibugEmuOnline.Client.Switch/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs index 0ff1826a..3212d652 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/AxiProjectTools/AxiNSPack/Editors/AxibugNSPTools.cs @@ -101,7 +101,7 @@ namespace AxibugEmuOnline.Editors #endif string targetName = $"{Application.productName}_{titleid}.nsp"; - string _locationPathName = $"Output/NSPBuild/{targetName}"; + string _locationPathName = $"Output/NSPBuild/{DateTime.Now.ToString("yyyyMMddHHmmss")}/{targetName}"; var options = new BuildPlayerOptions { scenes = levels.ToArray(), diff --git a/AxibugEmuOnline.Client.Switch/Assets/Plugins/AxiNSApi/AxiNSIO.cs b/AxibugEmuOnline.Client.Switch/Assets/Plugins/AxiNSApi/AxiNSIO.cs index 9ad3c4a9..031b1df6 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Plugins/AxiNSApi/AxiNSIO.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Plugins/AxiNSApi/AxiNSIO.cs @@ -7,20 +7,20 @@ using System.Text.RegularExpressions; public class AxiNSIO { - string save_name => AxiNS.instance.mount.SaveMountName; - public string save_path => $"{save_name}:/"; + string save_name => AxiNS.instance.mount.SaveMountName; + public string save_path => $"{save_name}:/"; #if UNITY_SWITCH - private FileHandle fileHandle = new nn.fs.FileHandle(); + private FileHandle fileHandle = new nn.fs.FileHandle(); #endif - static object commitLock = new object(); + static object commitLock = new object(); - static bool bDirty = false; + static bool bDirty = false; - bool CommitSave() - { - lock (commitLock) - { + bool CommitSave() + { + lock (commitLock) + { #if UNITY_SWITCH && !UNITY_EDITOR // 阻止用户在保存时,退出游戏 Switch 条例 0080 @@ -39,242 +39,242 @@ public class AxiNSIO bDirty = false; return true; #else - return false; + return false; #endif - } + } - } + } - void SetCommitDirty() - { - lock (commitLock) - { - bDirty = true; - } - } + void SetCommitDirty() + { + lock (commitLock) + { + bDirty = true; + } + } - public void ApplyAutoCommit() - { - bool temp; - lock (commitLock) - { - temp = bDirty; - } + public void ApplyAutoCommit() + { + bool temp; + lock (commitLock) + { + temp = bDirty; + } - if (temp) - { - CommitSave(); - } - } + if (temp) + { + CommitSave(); + } + } - /// - /// 检查Path是否存在 - /// - /// - /// - public bool CheckPathExists(string filePath) - { + /// + /// 检查Path是否存在 + /// + /// + /// + public bool CheckPathExists(string filePath) + { #if !UNITY_SWITCH return false; #else - nn.fs.EntryType entryType = 0; - nn.Result result = nn.fs.FileSystem.GetEntryType(ref entryType, filePath); - //result.abortUnlessSuccess(); - //这个异常捕获。真的别扭 + nn.fs.EntryType entryType = 0; + nn.Result result = nn.fs.FileSystem.GetEntryType(ref entryType, filePath); + //result.abortUnlessSuccess(); + //这个异常捕获。真的别扭 - //日,FileSystem.ResultPathAlreadyExists 貌似不太行 - //return nn.fs.FileSystem.ResultPathAlreadyExists.Includes(result); - return !nn.fs.FileSystem.ResultPathNotFound.Includes(result); + //日,FileSystem.ResultPathAlreadyExists 貌似不太行 + //return nn.fs.FileSystem.ResultPathAlreadyExists.Includes(result); + return !nn.fs.FileSystem.ResultPathNotFound.Includes(result); #endif - } - /// - /// 检查Path是否不存在 - /// - /// - /// - public bool CheckPathNotFound(string filePath) - { + } + /// + /// 检查Path是否不存在 + /// + /// + /// + public bool CheckPathNotFound(string filePath) + { #if !UNITY_SWITCH return false; #else - nn.fs.EntryType entryType = 0; - nn.Result result = nn.fs.FileSystem.GetEntryType(ref entryType, filePath); - //这个异常捕获。真的别扭 - return nn.fs.FileSystem.ResultPathNotFound.Includes(result); + nn.fs.EntryType entryType = 0; + nn.Result result = nn.fs.FileSystem.GetEntryType(ref entryType, filePath); + //这个异常捕获。真的别扭 + return nn.fs.FileSystem.ResultPathNotFound.Includes(result); #endif - } - /// - /// 创建目录,目录存在也会返回true - /// - /// - /// - public bool CreateDir(string filePath) - { - lock (commitLock) - { + } + /// + /// 创建目录,目录存在也会返回true + /// + /// + /// + public bool CreateDir(string filePath) + { + lock (commitLock) + { #if !UNITY_SWITCH return false; #else - // 使用封装函数检查和创建父目录 - if (!EnsureParentDirectory(filePath, true)) - { - UnityEngine.Debug.LogError($"无法确保父目录,文件写入取消: {filePath}"); - return false; - } - return true; + // 使用封装函数检查和创建父目录 + if (!EnsureParentDirectory(filePath, true)) + { + UnityEngine.Debug.LogError($"无法确保父目录,文件写入取消: {filePath}"); + return false; + } + return true; #endif - } - } + } + } - /// - /// 保存并创建文件(如果目录不存在回先自动创建目录) - /// - /// - /// - /// - public bool FileToSaveWithCreate(string filePath, System.IO.MemoryStream ms) - { - return FileToSaveWithCreate(filePath, ms.ToArray()); - } - /// - /// 保存并创建文件(如果目录不存在回先自动创建目录) - /// - /// - /// - /// - public AxiNSWait_FileToSaveByMSWithCreate FileToSaveWithCreateAsync(string filePath, System.IO.MemoryStream ms) - { - var wait = new AxiNSWait_FileToSaveByMSWithCreate(filePath, ms); - AxiNS.instance.wait.AddWait(wait); - return wait; - } + /// + /// 保存并创建文件(如果目录不存在回先自动创建目录) + /// + /// + /// + /// + public bool FileToSaveWithCreate(string filePath, System.IO.MemoryStream ms) + { + return FileToSaveWithCreate(filePath, ms.ToArray()); + } + /// + /// 保存并创建文件(如果目录不存在回先自动创建目录) + /// + /// + /// + /// + public AxiNSWait_FileToSaveByMSWithCreate FileToSaveWithCreateAsync(string filePath, System.IO.MemoryStream ms) + { + var wait = new AxiNSWait_FileToSaveByMSWithCreate(filePath, ms); + AxiNS.instance.wait.AddWait(wait); + return wait; + } - /// - /// 保存并创建文件(如果目录不存在回先自动创建目录) - /// - /// - /// - /// 是否立即Commit到物理存储 - /// - public bool FileToSaveWithCreate(string filePath, byte[] data, bool immediatelyCommit = true) - { - lock (commitLock) - { + /// + /// 保存并创建文件(如果目录不存在回先自动创建目录) + /// + /// + /// + /// 是否立即Commit到物理存储 + /// + public bool FileToSaveWithCreate(string filePath, byte[] data, bool immediatelyCommit = true) + { + lock (commitLock) + { #if !UNITY_SWITCH return false; #else - if (!AxiNS.instance.mount.SaveIsMount) - { - UnityEngine.Debug.LogError($"Save 尚未挂载,无法存储 {filePath}"); - return false; - } + if (!AxiNS.instance.mount.SaveIsMount) + { + UnityEngine.Debug.LogError($"Save 尚未挂载,无法存储 {filePath}"); + return false; + } - nn.Result result; + nn.Result result; #if UNITY_SWITCH && !UNITY_EDITOR // 阻止用户在保存时,退出游戏 // Switch 条例 0080 UnityEngine.Switch.Notification.EnterExitRequestHandlingSection(); #endif - // 使用封装函数检查和创建父目录 - if (!EnsureParentDirectory(filePath, true)) - { - UnityEngine.Debug.LogError($"无法确保父目录,文件写入取消: {filePath}"); - return false; - } + // 使用封装函数检查和创建父目录 + if (!EnsureParentDirectory(filePath, true)) + { + UnityEngine.Debug.LogError($"无法确保父目录,文件写入取消: {filePath}"); + return false; + } - //string directoryPath = System.IO.Path.GetDirectoryName(filePath.Replace(save_path, "")); - //string fullDirectoryPath = $"{save_path}{directoryPath}"; - //UnityEngine.Debug.Log($"检查父目录: {fullDirectoryPath}"); + //string directoryPath = System.IO.Path.GetDirectoryName(filePath.Replace(save_path, "")); + //string fullDirectoryPath = $"{save_path}{directoryPath}"; + //UnityEngine.Debug.Log($"检查父目录: {fullDirectoryPath}"); - //nn.fs.EntryType entryType = 0; - //result = nn.fs.FileSystem.GetEntryType(ref entryType, fullDirectoryPath); - //if (!result.IsSuccess() && nn.fs.FileSystem.ResultPathNotFound.Includes(result)) - //{ - // UnityEngine.Debug.Log($"父目录 {fullDirectoryPath} 不存在,尝试创建 (判断依据 result=>{result.ToString()})"); - // result = nn.fs.Directory.Create(fullDirectoryPath); - // if (!result.IsSuccess()) - // { - // UnityEngine.Debug.LogError($"创建父目录失败: {result.GetErrorInfo()}"); - // return false; - // } - // UnityEngine.Debug.Log($"父目录 {fullDirectoryPath} 创建成功"); - //} - //else if (result.IsSuccess() && entryType != nn.fs.EntryType.Directory) - //{ - // UnityEngine.Debug.LogError($"路径 {fullDirectoryPath} 已存在,但不是目录"); - // return false; - //} - //else if (!result.IsSuccess()) - //{ - // UnityEngine.Debug.LogError($"检查父目录失败: {result.GetErrorInfo()}"); - // return false; - //} + //nn.fs.EntryType entryType = 0; + //result = nn.fs.FileSystem.GetEntryType(ref entryType, fullDirectoryPath); + //if (!result.IsSuccess() && nn.fs.FileSystem.ResultPathNotFound.Includes(result)) + //{ + // UnityEngine.Debug.Log($"父目录 {fullDirectoryPath} 不存在,尝试创建 (判断依据 result=>{result.ToString()})"); + // result = nn.fs.Directory.Create(fullDirectoryPath); + // if (!result.IsSuccess()) + // { + // UnityEngine.Debug.LogError($"创建父目录失败: {result.GetErrorInfo()}"); + // return false; + // } + // UnityEngine.Debug.Log($"父目录 {fullDirectoryPath} 创建成功"); + //} + //else if (result.IsSuccess() && entryType != nn.fs.EntryType.Directory) + //{ + // UnityEngine.Debug.LogError($"路径 {fullDirectoryPath} 已存在,但不是目录"); + // return false; + //} + //else if (!result.IsSuccess()) + //{ + // UnityEngine.Debug.LogError($"检查父目录失败: {result.GetErrorInfo()}"); + // return false; + //} - if (CheckPathNotFound(filePath)) - { - UnityEngine.Debug.Log($"文件({filePath})不存在需要创建"); - result = nn.fs.File.Create(filePath, data.Length); //this makes a file the size of your save journal. You may want to make a file smaller than this. - //result.abortUnlessSuccess(); - if (!result.IsSuccess()) - { - UnityEngine.Debug.LogError($"创建文件失败 {filePath} : " + result.GetErrorInfo()); - return false; - } - //读取文件Handle - result = File.Open(ref fileHandle, filePath, OpenFileMode.Write); - } - else - { - //读取文件Handle - result = File.Open(ref fileHandle, filePath, OpenFileMode.Write); - long currsize = 0; - File.GetSize(ref currsize, fileHandle); - if (currsize == data.Length) - { - UnityEngine.Debug.Log($"文件({filePath})存在,长度一致,不用重新创建"); - } - else - { - UnityEngine.Debug.Log($"文件({filePath})存在,长度不一致,先删除再重建"); - nn.fs.File.Close(fileHandle); - //删除 - File.Delete(filePath); - //重新创建 - result = nn.fs.File.Create(filePath, data.Length); - if (!result.IsSuccess()) - { - UnityEngine.Debug.LogError($"创建文件失败 {filePath} : " + result.GetErrorInfo()); - return false; - } - //重新读取文件Handle - result = File.Open(ref fileHandle, filePath, OpenFileMode.Write); - } - } + if (CheckPathNotFound(filePath)) + { + UnityEngine.Debug.Log($"文件({filePath})不存在需要创建"); + result = nn.fs.File.Create(filePath, data.Length); //this makes a file the size of your save journal. You may want to make a file smaller than this. + //result.abortUnlessSuccess(); + if (!result.IsSuccess()) + { + UnityEngine.Debug.LogError($"创建文件失败 {filePath} : " + result.GetErrorInfo()); + return false; + } + //读取文件Handle + result = File.Open(ref fileHandle, filePath, OpenFileMode.Write); + } + else + { + //读取文件Handle + result = File.Open(ref fileHandle, filePath, OpenFileMode.Write); + long currsize = 0; + File.GetSize(ref currsize, fileHandle); + if (currsize == data.Length) + { + UnityEngine.Debug.Log($"文件({filePath})存在,长度一致,不用重新创建"); + } + else + { + UnityEngine.Debug.Log($"文件({filePath})存在,长度不一致,先删除再重建"); + nn.fs.File.Close(fileHandle); + //删除 + File.Delete(filePath); + //重新创建 + result = nn.fs.File.Create(filePath, data.Length); + if (!result.IsSuccess()) + { + UnityEngine.Debug.LogError($"创建文件失败 {filePath} : " + result.GetErrorInfo()); + return false; + } + //重新读取文件Handle + result = File.Open(ref fileHandle, filePath, OpenFileMode.Write); + } + } - // //OpenFileMode.AllowAppend 好像不可用 - // //result = File.Open(ref fileHandle, filePath, OpenFileMode.AllowAppend); - // result = File.Open(ref fileHandle, filePath, OpenFileMode.Write); + // //OpenFileMode.AllowAppend 好像不可用 + // //result = File.Open(ref fileHandle, filePath, OpenFileMode.AllowAppend); + // result = File.Open(ref fileHandle, filePath, OpenFileMode.Write); - //result.abortUnlessSuccess(); - if (!result.IsSuccess()) - { - UnityEngine.Debug.LogError($"失败 File.Open(ref filehandle, {filePath}, OpenFileMode.Write): " + result.GetErrorInfo()); - return false; - } - UnityEngine.Debug.Log($"成功 File.Open(ref filehandle, {filePath}, OpenFileMode.Write)"); + //result.abortUnlessSuccess(); + if (!result.IsSuccess()) + { + UnityEngine.Debug.LogError($"失败 File.Open(ref filehandle, {filePath}, OpenFileMode.Write): " + result.GetErrorInfo()); + return false; + } + UnityEngine.Debug.Log($"成功 File.Open(ref filehandle, {filePath}, OpenFileMode.Write)"); - //nn.fs.WriteOption.Flush 应该就是覆盖写入 - result = nn.fs.File.Write(fileHandle, 0, data, data.Length, nn.fs.WriteOption.Flush); // Writes and flushes the write at the same time - //result.abortUnlessSuccess(); - if (!result.IsSuccess()) - { - UnityEngine.Debug.LogError("写入文件失败: " + result.GetErrorInfo()); - return false; - } - UnityEngine.Debug.Log("写入文件成功: " + filePath); + //nn.fs.WriteOption.Flush 应该就是覆盖写入 + result = nn.fs.File.Write(fileHandle, 0, data, data.Length, nn.fs.WriteOption.Flush); // Writes and flushes the write at the same time + //result.abortUnlessSuccess(); + if (!result.IsSuccess()) + { + UnityEngine.Debug.LogError("写入文件失败: " + result.GetErrorInfo()); + return false; + } + UnityEngine.Debug.Log("写入文件成功: " + filePath); - nn.fs.File.Close(fileHandle); + nn.fs.File.Close(fileHandle); #if UNITY_SWITCH && !UNITY_EDITOR @@ -282,56 +282,56 @@ public class AxiNSIO UnityEngine.Switch.Notification.LeaveExitRequestHandlingSection(); #endif - if (immediatelyCommit) - { - //必须得提交,否则没有真实写入 - return CommitSave(); - } - else - { - SetCommitDirty(); - return true; - } + if (immediatelyCommit) + { + //必须得提交,否则没有真实写入 + return CommitSave(); + } + else + { + SetCommitDirty(); + return true; + } #endif - } - } - /// - /// 保存并创建文件(如果目录不存在回先自动创建目录) - /// - /// - /// - /// - public AxiNSWait_FileToSaveWithCreate FileToSaveWithCreateAsync(string filePath, byte[] data) - { - var wait = new AxiNSWait_FileToSaveWithCreate(filePath, data); - AxiNS.instance.wait.AddWait(wait); - return wait; - } - public byte[] LoadSwitchDataFile(string filename) - { - byte[] outputData; - LoadSwitchDataFile(filename, out outputData); - return outputData; - } + } + } + /// + /// 保存并创建文件(如果目录不存在回先自动创建目录) + /// + /// + /// + /// + public AxiNSWait_FileToSaveWithCreate FileToSaveWithCreateAsync(string filePath, byte[] data) + { + var wait = new AxiNSWait_FileToSaveWithCreate(filePath, data); + AxiNS.instance.wait.AddWait(wait); + return wait; + } + public byte[] LoadSwitchDataFile(string filename) + { + byte[] outputData; + LoadSwitchDataFile(filename, out outputData); + return outputData; + } - public bool LoadSwitchDataFile(string filename, ref System.IO.MemoryStream ms) - { - byte[] outputData; - if (LoadSwitchDataFile(filename, out outputData)) - { - using (System.IO.BinaryWriter writer = new System.IO.BinaryWriter(ms)) - { - writer.Write(outputData); - } - return true; - } - return false; - } - public bool LoadSwitchDataFile(string filename, out byte[] outputData) - { + public bool LoadSwitchDataFile(string filename, ref System.IO.MemoryStream ms) + { + byte[] outputData; + if (LoadSwitchDataFile(filename, out outputData)) + { + using (System.IO.BinaryWriter writer = new System.IO.BinaryWriter(ms)) + { + writer.Write(outputData); + } + return true; + } + return false; + } + public bool LoadSwitchDataFile(string filename, out byte[] outputData) + { #if !UNITY_SWITCH || UNITY_EDITOR - outputData = null; - return false; + outputData = null; + return false; #else outputData = null; if (!AxiNS.instance.mount.SaveIsMount) @@ -379,104 +379,104 @@ public class AxiNSIO outputData = loadedData; return true; #endif - } - public AxiNSWait_LoadSwitchDataFile LoadSwitchDataFileAsync(string filename) - { - var wait = new AxiNSWait_LoadSwitchDataFile(filename); - AxiNS.instance.wait.AddWait(wait); - return wait; - } + } + public AxiNSWait_LoadSwitchDataFile LoadSwitchDataFileAsync(string filename) + { + var wait = new AxiNSWait_LoadSwitchDataFile(filename); + AxiNS.instance.wait.AddWait(wait); + return wait; + } - public bool GetDirectoryFiles(string path, out string[] entrys) - { + public bool GetDirectoryFiles(string path, out string[] entrys) + { #if !UNITY_SWITCH || UNITY_EDITOR - entrys = null; - return false; + entrys = null; + return false; #else return GetDirectoryEntrys(path,nn.fs.OpenDirectoryMode.File,out entrys); #endif - } + } - public bool GetDirectoryDirs(string path, out string[] entrys) - { + public bool GetDirectoryDirs(string path, out string[] entrys) + { #if !UNITY_SWITCH || UNITY_EDITOR - entrys = null; - return false; + entrys = null; + return false; #else return GetDirectoryEntrys(path, nn.fs.OpenDirectoryMode.Directory, out entrys); #endif - } + } #if UNITY_SWITCH - public bool GetDirectoryEntrys(string path, nn.fs.OpenDirectoryMode type, out string[] entrys) - { - nn.fs.DirectoryHandle eHandle = new nn.fs.DirectoryHandle(); - nn.Result result = nn.fs.Directory.Open(ref eHandle, path, type); - if (nn.fs.FileSystem.ResultPathNotFound.Includes(result)) - { - UnityEngine.Debug.Log($"目录 {path} 不存在"); - entrys = null; - return false; - } - long entryCount = 0; - nn.fs.Directory.GetEntryCount(ref entryCount, eHandle); - nn.fs.DirectoryEntry[] entries = new nn.fs.DirectoryEntry[entryCount]; - long actualEntries = 0; - nn.fs.Directory.Read(ref actualEntries, entries, eHandle, entryCount); + public bool GetDirectoryEntrys(string path, nn.fs.OpenDirectoryMode type, out string[] entrys) + { + nn.fs.DirectoryHandle eHandle = new nn.fs.DirectoryHandle(); + nn.Result result = nn.fs.Directory.Open(ref eHandle, path, type); + if (nn.fs.FileSystem.ResultPathNotFound.Includes(result)) + { + UnityEngine.Debug.Log($"目录 {path} 不存在"); + entrys = null; + return false; + } + long entryCount = 0; + nn.fs.Directory.GetEntryCount(ref entryCount, eHandle); + nn.fs.DirectoryEntry[] entries = new nn.fs.DirectoryEntry[entryCount]; + long actualEntries = 0; + nn.fs.Directory.Read(ref actualEntries, entries, eHandle, entryCount); - entrys = new string[actualEntries]; - for (int i = 0; i < actualEntries; i++) - { - entrys[i] = System.IO.Path.Combine(path, entries[i].name); - } - nn.fs.Directory.Close(eHandle); - return true; - } + entrys = new string[actualEntries]; + for (int i = 0; i < actualEntries; i++) + { + entrys[i] = System.IO.Path.Combine(path, entries[i].name); + } + nn.fs.Directory.Close(eHandle); + return true; + } #endif - public bool GetDirectoryEntrysFullRecursion(string path, out string[] entrys) - { + public bool GetDirectoryEntrysFullRecursion(string path, out string[] entrys) + { #if UNITY_SWITCH - nn.fs.DirectoryHandle eHandle = new nn.fs.DirectoryHandle(); - nn.Result result = nn.fs.Directory.Open(ref eHandle, path, OpenDirectoryMode.All); - if (nn.fs.FileSystem.ResultPathNotFound.Includes(result)) - { - UnityEngine.Debug.Log($"目录 {path} 不存在"); - entrys = null; - return false; - } - long entryCount = 0; - nn.fs.Directory.GetEntryCount(ref entryCount, eHandle); - nn.fs.DirectoryEntry[] entries = new nn.fs.DirectoryEntry[entryCount]; - long actualEntries = 0; - nn.fs.Directory.Read(ref actualEntries, entries, eHandle, entryCount); + nn.fs.DirectoryHandle eHandle = new nn.fs.DirectoryHandle(); + nn.Result result = nn.fs.Directory.Open(ref eHandle, path, OpenDirectoryMode.All); + if (nn.fs.FileSystem.ResultPathNotFound.Includes(result)) + { + UnityEngine.Debug.Log($"目录 {path} 不存在"); + entrys = null; + return false; + } + long entryCount = 0; + nn.fs.Directory.GetEntryCount(ref entryCount, eHandle); + nn.fs.DirectoryEntry[] entries = new nn.fs.DirectoryEntry[entryCount]; + long actualEntries = 0; + nn.fs.Directory.Read(ref actualEntries, entries, eHandle, entryCount); - List temp = new List(); - for (int i = 0; i < actualEntries; i++) - { - string singlePath = System.IO.Path.Combine(path, entries[i].name); - temp.Add(singlePath); - if (entries[i].entryType == EntryType.Directory && GetDirectoryEntrysFullRecursion(singlePath, out string[] singleEntryList)) - { - temp.AddRange(singleEntryList); - } - } - nn.fs.Directory.Close(eHandle); - entrys = temp.ToArray(); - return true; + List temp = new List(); + for (int i = 0; i < actualEntries; i++) + { + string singlePath = System.IO.Path.Combine(path, entries[i].name); + temp.Add(singlePath); + if (entries[i].entryType == EntryType.Directory && GetDirectoryEntrysFullRecursion(singlePath, out string[] singleEntryList)) + { + temp.AddRange(singleEntryList); + } + } + nn.fs.Directory.Close(eHandle); + entrys = temp.ToArray(); + return true; #else entrys = null; return false; #endif - } + } - public IEnumerable EnumerateFiles(string path, string searchPattern) - { + public IEnumerable EnumerateFiles(string path, string searchPattern) + { #if !UNITY_SWITCH || UNITY_EDITOR - yield break; + yield break; #else // 将通配符转换为正则表达式(支持*和?) var regexPattern = "^" + @@ -500,10 +500,10 @@ public class AxiNSIO } } #endif - } + } - public bool DeletePathFile(string filename) - { + public bool DeletePathFile(string filename) + { #if !UNITY_SWITCH return false; #else @@ -515,32 +515,32 @@ public class AxiNSIO UnityEngine.Switch.Notification.EnterExitRequestHandlingSection(); #endif - if (CheckPathNotFound(filename)) - return false; - nn.Result result; - result = nn.fs.File.Delete(filename); - if (result.IsSuccess() == false) - { - UnityEngine.Debug.LogError($"nn.fs.File.Delete 失败 {filename} : result=>{result.GetErrorInfo()}"); - return false; - } + if (CheckPathNotFound(filename)) + return false; + nn.Result result; + result = nn.fs.File.Delete(filename); + if (result.IsSuccess() == false) + { + UnityEngine.Debug.LogError($"nn.fs.File.Delete 失败 {filename} : result=>{result.GetErrorInfo()}"); + return false; + } #if UNITY_SWITCH && !UNITY_EDITOR // End preventing the user from quitting the game while saving. UnityEngine.Switch.Notification.LeaveExitRequestHandlingSection(); #endif - return CommitSave(); + return CommitSave(); #endif - } - public AxiNSWait_DeletePathFile DeletePathFileAsync(string filename) - { - var wait = new AxiNSWait_DeletePathFile(filename); - AxiNS.instance.wait.AddWait(wait); - return wait; - } - public bool DeletePathDir(string filename) - { + } + public AxiNSWait_DeletePathFile DeletePathFileAsync(string filename) + { + var wait = new AxiNSWait_DeletePathFile(filename); + AxiNS.instance.wait.AddWait(wait); + return wait; + } + public bool DeletePathDir(string filename) + { #if !UNITY_SWITCH return false; #else @@ -551,31 +551,31 @@ public class AxiNSIO UnityEngine.Switch.Notification.EnterExitRequestHandlingSection(); #endif - if (CheckPathNotFound(filename)) - return false; - nn.Result result; - result = nn.fs.Directory.Delete(filename); - if (result.IsSuccess() == false) - { - UnityEngine.Debug.LogError($"nn.fs.File.Delete 失败 {filename} : result=>{result.GetErrorInfo()}"); - return false; - } + if (CheckPathNotFound(filename)) + return false; + nn.Result result; + result = nn.fs.Directory.Delete(filename); + if (result.IsSuccess() == false) + { + UnityEngine.Debug.LogError($"nn.fs.File.Delete 失败 {filename} : result=>{result.GetErrorInfo()}"); + return false; + } #if UNITY_SWITCH && !UNITY_EDITOR // End preventing the user from quitting the game while saving. UnityEngine.Switch.Notification.LeaveExitRequestHandlingSection(); #endif - return CommitSave(); + return CommitSave(); #endif - } - public AxiNSWait_DeletePathDir DeletePathDirAsync(string filename) - { - var wait = new AxiNSWait_DeletePathDir(filename); - AxiNS.instance.wait.AddWait(wait); - return wait; - } - public bool DeletePathDirRecursively(string filename) - { + } + public AxiNSWait_DeletePathDir DeletePathDirAsync(string filename) + { + var wait = new AxiNSWait_DeletePathDir(filename); + AxiNS.instance.wait.AddWait(wait); + return wait; + } + public bool DeletePathDirRecursively(string filename) + { #if !UNITY_SWITCH return false; #else @@ -586,37 +586,37 @@ public class AxiNSIO UnityEngine.Switch.Notification.EnterExitRequestHandlingSection(); #endif - if (CheckPathNotFound(filename)) - return false; - nn.Result result; - result = nn.fs.Directory.DeleteRecursively(filename); - if (result.IsSuccess() == false) - { - UnityEngine.Debug.LogError($"nn.fs.File.Recursively 失败 {filename} : result=>{result.GetErrorInfo()}"); - return false; - } + if (CheckPathNotFound(filename)) + return false; + nn.Result result; + result = nn.fs.Directory.DeleteRecursively(filename); + if (result.IsSuccess() == false) + { + UnityEngine.Debug.LogError($"nn.fs.File.Recursively 失败 {filename} : result=>{result.GetErrorInfo()}"); + return false; + } #if UNITY_SWITCH && !UNITY_EDITOR // End preventing the user from quitting the game while saving. UnityEngine.Switch.Notification.LeaveExitRequestHandlingSection(); #endif - return CommitSave(); + return CommitSave(); #endif - } - public AxiNSWait_DeletePathDirRecursively DeletePathDirRecursivelyAsync(string filename) - { - var wait = new AxiNSWait_DeletePathDirRecursively(filename); - AxiNS.instance.wait.AddWait(wait); - return wait; - } + } + public AxiNSWait_DeletePathDirRecursively DeletePathDirRecursivelyAsync(string filename) + { + var wait = new AxiNSWait_DeletePathDirRecursively(filename); + AxiNS.instance.wait.AddWait(wait); + return wait; + } - /// - /// 递归删除目录 - /// - /// - /// - public bool DeleteRecursivelyPathDir(string filename) - { + /// + /// 递归删除目录 + /// + /// + /// + public bool DeleteRecursivelyPathDir(string filename) + { #if !UNITY_SWITCH return false; #else @@ -627,31 +627,31 @@ public class AxiNSIO UnityEngine.Switch.Notification.EnterExitRequestHandlingSection(); #endif - if (CheckPathNotFound(filename)) - return false; - nn.Result result; - result = nn.fs.Directory.DeleteRecursively(filename); - if (result.IsSuccess() == false) - { - UnityEngine.Debug.LogError($"nn.fs.File.DeleteRecursively 失败 {filename} : result=>{result.GetErrorInfo()}"); - return false; - } + if (CheckPathNotFound(filename)) + return false; + nn.Result result; + result = nn.fs.Directory.DeleteRecursively(filename); + if (result.IsSuccess() == false) + { + UnityEngine.Debug.LogError($"nn.fs.File.DeleteRecursively 失败 {filename} : result=>{result.GetErrorInfo()}"); + return false; + } #if UNITY_SWITCH && !UNITY_EDITOR // End preventing the user from quitting the game while saving. UnityEngine.Switch.Notification.LeaveExitRequestHandlingSection(); #endif - return CommitSave(); + return CommitSave(); #endif - } + } - /// - /// 递归删除情况 - /// - /// - /// - public bool CleanRecursivelyPathDir(string filename) - { + /// + /// 递归删除情况 + /// + /// + /// + public bool CleanRecursivelyPathDir(string filename) + { #if !UNITY_SWITCH return false; #else @@ -662,26 +662,26 @@ public class AxiNSIO UnityEngine.Switch.Notification.EnterExitRequestHandlingSection(); #endif - if (CheckPathNotFound(filename)) - return false; - nn.Result result; - result = nn.fs.Directory.CleanRecursively(filename); - if (result.IsSuccess() == false) - { - UnityEngine.Debug.LogError($"nn.fs.File.DeleteRecursively 失败 {filename} : result=>{result.GetErrorInfo()}"); - return false; - } + if (CheckPathNotFound(filename)) + return false; + nn.Result result; + result = nn.fs.Directory.CleanRecursively(filename); + if (result.IsSuccess() == false) + { + UnityEngine.Debug.LogError($"nn.fs.File.DeleteRecursively 失败 {filename} : result=>{result.GetErrorInfo()}"); + return false; + } #if UNITY_SWITCH && !UNITY_EDITOR // End preventing the user from quitting the game while saving. UnityEngine.Switch.Notification.LeaveExitRequestHandlingSection(); #endif - return CommitSave(); + return CommitSave(); #endif - } + } - public bool RenameDir(string oldpath, string newpath) - { + public bool RenameDir(string oldpath, string newpath) + { #if !UNITY_SWITCH return false; #else @@ -692,146 +692,178 @@ public class AxiNSIO UnityEngine.Switch.Notification.EnterExitRequestHandlingSection(); #endif - if (CheckPathNotFound(oldpath)) - return false; + if (CheckPathNotFound(oldpath)) + return false; - nn.Result result; - result = nn.fs.Directory.Rename(oldpath, newpath); - if (result.IsSuccess() == false) - { - UnityEngine.Debug.LogError($"nn.fs.File.Rename 失败 {oldpath} to {newpath} : result=>{result.GetErrorInfo()}"); - return false; - } + nn.Result result; + result = nn.fs.Directory.Rename(oldpath, newpath); + if (result.IsSuccess() == false) + { + UnityEngine.Debug.LogError($"nn.fs.File.Rename 失败 {oldpath} to {newpath} : result=>{result.GetErrorInfo()}"); + return false; + } #if UNITY_SWITCH && !UNITY_EDITOR // End preventing the user from quitting the game while saving. UnityEngine.Switch.Notification.LeaveExitRequestHandlingSection(); #endif - return CommitSave(); + return CommitSave(); #endif - } - bool EnsureParentDirectory(string filePath, bool bAutoCreateDir = true) - { + } + bool EnsureParentDirectory(string filePath, bool bAutoCreateDir = true) + { #if !UNITY_SWITCH return false; #else - // 参数校验 - if (string.IsNullOrEmpty(filePath)) - { - UnityEngine.Debug.LogError($"无效参数:filePath={filePath}"); - return false; - } + // 参数校验 + if (string.IsNullOrEmpty(filePath)) + { + UnityEngine.Debug.LogError($"无效参数:filePath={filePath}"); + return false; + } - // 提取路径前缀(如 save:/、sd:/) - int prefixEndIndex = filePath.IndexOf(":/"); - if (prefixEndIndex == -1) - { - UnityEngine.Debug.LogError($"文件路径 {filePath} 格式无效,未找到 ':/' 前缀"); - return false; - } - string pathPrefix = filePath.Substring(0, prefixEndIndex + 2); // 提取前缀,例如 "save:/" - string relativePath = filePath.Substring(prefixEndIndex + 2); // 移除前缀,得到相对路径 + // 提取路径前缀(如 save:/、sd:/) + int prefixEndIndex = filePath.IndexOf(":/"); + if (prefixEndIndex == -1) + { + UnityEngine.Debug.LogError($"文件路径 {filePath} 格式无效,未找到 ':/' 前缀"); + return false; + } + string pathPrefix = filePath.Substring(0, prefixEndIndex + 2); // 提取前缀,例如 "save:/" + string relativePath = filePath.Substring(prefixEndIndex + 2); // 移除前缀,得到相对路径 - // 检查挂载状态 - if (!IsMountPointAccessible(pathPrefix)) - { - UnityEngine.Debug.LogError($"挂载点 {pathPrefix} 未挂载,无法操作路径 {filePath}"); - return false; - } + // 检查挂载状态 + if (!IsMountPointAccessible(pathPrefix)) + { + UnityEngine.Debug.LogError($"挂载点 {pathPrefix} 未挂载,无法操作路径 {filePath}"); + return false; + } - // 提取父目录路径 - string directoryPath = System.IO.Path.GetDirectoryName(relativePath); // 获取父目录相对路径 - if (string.IsNullOrEmpty(directoryPath)) - { - UnityEngine.Debug.Log($"文件路径 {filePath} 无需创建父目录(位于根目录)"); - return true; // 根目录无需创建 - } + // 提取父目录路径 + string directoryPath = System.IO.Path.GetDirectoryName(relativePath); // 获取父目录相对路径 + if (string.IsNullOrEmpty(directoryPath)) + { + UnityEngine.Debug.Log($"文件路径 {filePath} 无需创建父目录(位于根目录)"); + return true; // 根目录无需创建 + } - string fullDirectoryPath = $"{pathPrefix}{directoryPath}"; // 拼接完整父目录路径 - UnityEngine.Debug.Log($"检查父目录: {fullDirectoryPath}"); + string fullDirectoryPath = $"{pathPrefix}{directoryPath}"; // 拼接完整父目录路径 + UnityEngine.Debug.Log($"检查父目录: {fullDirectoryPath}"); - // 检查路径是否存在及其类型 - nn.fs.EntryType entryType = 0; - nn.Result result = nn.fs.FileSystem.GetEntryType(ref entryType, fullDirectoryPath); - if (!result.IsSuccess() && nn.fs.FileSystem.ResultPathNotFound.Includes(result)) - { - if (bAutoCreateDir) - { - // 路径不存在,尝试创建 - UnityEngine.Debug.Log($"父目录 {fullDirectoryPath} 不存在,尝试创建 (判断依据 result=>{result.ToString()})"); - result = nn.fs.Directory.Create(fullDirectoryPath); - if (!result.IsSuccess()) - { - UnityEngine.Debug.LogError($"创建父目录失败: {result.GetErrorInfo()}"); - return false; - } - UnityEngine.Debug.Log($"父目录 {fullDirectoryPath} 创建成功"); - return true; - } - return false; - } - else if (result.IsSuccess() && entryType != nn.fs.EntryType.Directory) - { - // 路径存在,但不是目录 - UnityEngine.Debug.LogError($"路径 {fullDirectoryPath} 已存在,但不是目录"); - return false; - } - else if (!result.IsSuccess()) - { - // 其他错误 - UnityEngine.Debug.LogError($"检查父目录失败: {result.GetErrorInfo()}"); - return false; - } - // 路径存在且是目录 - UnityEngine.Debug.Log($"父目录 {fullDirectoryPath} 已存在且有效"); - return true; + // 检查路径是否存在及其类型 + nn.fs.EntryType entryType = 0; + nn.Result result = nn.fs.FileSystem.GetEntryType(ref entryType, fullDirectoryPath); + if (!result.IsSuccess() && nn.fs.FileSystem.ResultPathNotFound.Includes(result)) + { + if (bAutoCreateDir) + { + //List NeedCreateList = new List(); + //NeedCreateList.Add(fullDirectoryPath); + //nn.fs.EntryType entryTypeLoop = 0; + //nn.Result resultloop; + //string NodeLoop = fullDirectoryPath; + //while (!NodeLoop.EndsWith(":/")) + //{ + // NodeLoop = System.IO.Path.GetDirectoryName(NodeLoop); + // if (NodeLoop.EndsWith(":/")) + // break; + // resultloop = nn.fs.FileSystem.GetEntryType(ref entryTypeLoop, NodeLoop); + // if (!resultloop.IsSuccess() && nn.fs.FileSystem.ResultPathNotFound.Includes(resultloop)) + // { + // NeedCreateList.Add(NodeLoop); + // } + //} + + //for(int i = NeedCreateList.Count - 1; i >= 0; i--) + //{ + // string dirToCreate = NeedCreateList[i]; + // // 路径不存在,尝试创建 + // UnityEngine.Debug.Log($"父目录 {dirToCreate} 不存在,尝试创建 (判断依据 result=>{result.ToString()})"); + // resultloop = nn.fs.Directory.Create(dirToCreate); + // if (!resultloop.IsSuccess()) + // { + // UnityEngine.Debug.LogError($"创建父目录失败: {resultloop.GetErrorInfo()}"); + // return false; + // } + // UnityEngine.Debug.Log($"父目录 {dirToCreate} 创建成功"); + //} + //return true; + + // 路径不存在,尝试创建 + UnityEngine.Debug.Log($"父目录 {fullDirectoryPath} 不存在,尝试创建 (判断依据 result=>{result.ToString()})"); + result = nn.fs.Directory.Create(fullDirectoryPath); + if (!result.IsSuccess()) + { + UnityEngine.Debug.LogError($"创建父目录失败: {result.GetErrorInfo()}"); + return false; + } + UnityEngine.Debug.Log($"父目录 {fullDirectoryPath} 创建成功"); + return true; + } + return false; + } + else if (result.IsSuccess() && entryType != nn.fs.EntryType.Directory) + { + // 路径存在,但不是目录 + UnityEngine.Debug.LogError($"路径 {fullDirectoryPath} 已存在,但不是目录"); + return false; + } + else if (!result.IsSuccess()) + { + // 其他错误 + UnityEngine.Debug.LogError($"检查父目录失败: {result.GetErrorInfo()}"); + return false; + } + // 路径存在且是目录 + UnityEngine.Debug.Log($"父目录 {fullDirectoryPath} 已存在且有效"); + return true; #endif - } - /// - /// 检查指定挂载点是否可访问 - /// - /// 路径前缀,例如 "save:/" 或 "sd:/" - /// 挂载点是否可访问 - bool IsMountPointAccessible(string pathPrefix) - { + } + /// + /// 检查指定挂载点是否可访问 + /// + /// 路径前缀,例如 "save:/" 或 "sd:/" + /// 挂载点是否可访问 + bool IsMountPointAccessible(string pathPrefix) + { #if !UNITY_SWITCH return false; #else - if (string.IsNullOrEmpty(pathPrefix)) - { - UnityEngine.Debug.LogError($"无效挂载点: {pathPrefix}"); - return false; - } + if (string.IsNullOrEmpty(pathPrefix)) + { + UnityEngine.Debug.LogError($"无效挂载点: {pathPrefix}"); + return false; + } - // 根据前缀判断挂载点类型并检查挂载状态 - if (pathPrefix == $"{save_name}:/") - { - if (!AxiNS.instance.mount.SaveIsMount) - { - UnityEngine.Debug.LogError($"{save_name}:/ 未挂载"); - return false; - } - return true; - } - else if (pathPrefix == "sd:/") - { - long freeSpace = 0; - // 检查 SD 卡挂载状态(示例,需根据实际实现调整) - nn.Result result = nn.fs.FileSystem.GetFreeSpaceSize(ref freeSpace, "sd:/"); - if (!result.IsSuccess()) - { - UnityEngine.Debug.LogError($"sd:/ 未挂载或无法访问: {result.GetErrorInfo()}"); - return false; - } - return true; - } - else - { - UnityEngine.Debug.LogWarning($"未知挂载点 {pathPrefix},假定已挂载"); - return true; // 其他挂载点需根据实际需求实现 - } + // 根据前缀判断挂载点类型并检查挂载状态 + if (pathPrefix == $"{save_name}:/") + { + if (!AxiNS.instance.mount.SaveIsMount) + { + UnityEngine.Debug.LogError($"{save_name}:/ 未挂载"); + return false; + } + return true; + } + else if (pathPrefix == "sd:/") + { + long freeSpace = 0; + // 检查 SD 卡挂载状态(示例,需根据实际实现调整) + nn.Result result = nn.fs.FileSystem.GetFreeSpaceSize(ref freeSpace, "sd:/"); + if (!result.IsSuccess()) + { + UnityEngine.Debug.LogError($"sd:/ 未挂载或无法访问: {result.GetErrorInfo()}"); + return false; + } + return true; + } + else + { + UnityEngine.Debug.LogWarning($"未知挂载点 {pathPrefix},假定已挂载"); + return true; // 其他挂载点需根据实际需求实现 + } #endif - } + } } diff --git a/AxibugEmuOnline.Client.Switch/Assets/Resources/IMPORTENT.prefab b/AxibugEmuOnline.Client.Switch/Assets/Resources/IMPORTENT.prefab index cc925102..6ff21895 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Resources/IMPORTENT.prefab +++ b/AxibugEmuOnline.Client.Switch/Assets/Resources/IMPORTENT.prefab @@ -25,13 +25,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 173080370084988713} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 7122109429436137579} - m_RootOrder: -2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1464475178787633862 MonoBehaviour: @@ -78,6 +78,7 @@ MonoBehaviour: m_DeselectOnBackgroundClick: 1 m_PointerBehavior: 0 m_CursorLockBehavior: 0 + m_ScrollDeltaPerTick: 6 --- !u!1 &261166211120060501 GameObject: m_ObjectHideFlags: 0 @@ -111,7 +112,6 @@ RectTransform: - {fileID: 7813729344275964042} - {fileID: 4804966765082268001} m_Father: {fileID: 5169543666820693527} - m_RootOrder: -2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -167,7 +167,6 @@ RectTransform: - {fileID: 4140710606298198504} - {fileID: 3574645515793225367} m_Father: {fileID: 7122109429436137579} - m_RootOrder: -2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -191,6 +190,7 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 m_AdditionalShaderChannelsFlag: 1 m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 @@ -268,7 +268,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8545038260809852605} - m_RootOrder: -2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -346,6 +345,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4747871931704546037} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -356,7 +356,6 @@ Transform: - {fileID: 5927909303067165599} - {fileID: 5169543666820693527} m_Father: {fileID: 0} - m_RootOrder: -2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &-5568097984606286463 MonoBehaviour: @@ -404,7 +403,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8545038260809852605} - m_RootOrder: -2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -486,13 +484,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6868843688838274199} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 7122109429436137579} - m_RootOrder: -2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &5322909716643310759 MonoBehaviour: @@ -537,7 +535,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8545038260809852605} - m_RootOrder: -2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -607,13 +604,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 9087746359628224422} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 7122109429436137579} - m_RootOrder: -2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!20 &4468044133909204598 Camera: diff --git a/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/DevicesIcons/SwitchJoyCon.png b/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/DevicesIcons/SwitchJoyCon.png new file mode 100644 index 0000000000000000000000000000000000000000..53cbfaeb30cab91cce352abd514425aba188ab1e GIT binary patch literal 4090 zcmcIn`9G9j-=7&{3>sz>*^McwWEr~=W-^L2M7EKLS?t1$os5$2$d(pMmJkXJAt5Rv zWJVNYt%xFJtGQbw^<2Ks_jNzd{RiAXoa;KD^Esd8dY|ij&ikYuw>yFmlNSSlKnNRa zq9gF`+iGwa@Z`AF76UIZ!|})=Q0;TYML>Z15=aCPs6I>lm$xt=i-ua086c3vldT4p z-g}e<82sh$O(9m7%11Z#Oy&-l=^qJu+$*&xtCi|9~qN+6Ai_M!RuhnT6awmnuy z`%}%-T@6S&q)V zF%IZ&4Qpe}4~A3eI7i~)e`WxZ8OD#v48>_{M@2*#9h>S_Wr zG#N1=Oz&vT5XP>591v*?O1OV0)Bj8edds1=&zT6O873mapNgY<(+zy6R0B;PZ#}9e z7EATk^rq@zHK}@fR3ihdu`V6!gZU>s)1Ur-@k1E@zyJWEy`|B{YUymHyw%6qhx^lj zEVe?LV-NnV|BtbQ+FObIzr@V{cLexWp!aWNwqW`aL<2r)dKjm5MW2qk^&2Oml$Kp+_@j*JZ z*b^O@QuId&XV2Qj5AOFAI(Hgx`{w+t8X6Aslgg$cp+=1pLGB5pf?<}2hX=Durx5v~ z1aNe2H@86}xA7S{0-uJR|GBiZlt@e_3wbOS7Zq)OpX<%~*W0eY>i+x^3_j+o_}M1F zI`4o*W~qh_25pD6kw%UlpzxIRvTEi)#hXVO-#Lo1vGWpY(u&yx zB-COP@Q`>9Ve^TFRt!zgTOXd7n7AdWV*aXG^w}FT`1LSjVN3&05Z`h}@W>U9lrUBc zJ|yKN5}6d*vCn%xL^kD0T3TAq!aMoz=vyxt;|0v$oZmk4H>xef2MRy4~qt;yrn)&xh~r!gT4AjLxPw?D&c+ zvTJVH7?zMEmdEWLo6Q*3e^@0E(!jva8Y`#vmE%^fu#cTbw*%gP>YgpVbgJwVs^;{_O0Y+81hAuztN_hB!`{?YFdsMO2JV zvVQF45UEv77>GrsK4~>*`zmg?f-R>BTxEOp@@~?w))Vm5_?}0f9%xT6d36Z(+{CVW zgFPM3gM{iLZ_UUD`ev^}eBvZskrLx4uUGEMeLwnu{H~4Fa@~wbO%27L)QXcr$vOLG z8-Y{j#@}CHyYj)TN}05$S86WlFuwo#^=lyaM*(a6HJ|U@B&M$^lcr9Oe3|8>wR-n~^Cn{p<<)Lm2hc`IkA%rXzpUL47IRR#nbgjs0plu|i7FPP?&J zLQCAIz)q{XVuhc6URVPo5_4LPDS5<2N9P&mS;4IGrH8mppQnq^4lHMlHLFcGjs80< zPxn z71hMrk4Jk`;}|&x2L>V63(S=Ms}Qm383Y; zr&hFg!|ob!C=SF20ctt)0Py6{K^gwh1Duf@Im*`0Ts;ShxR+_gS1#vpxm*njZ$!2+ zeJ*d-cn|%Nc-Pvq-zKSZ(dk1ShP+=*xck~otfjWt)9G?OVTJ6zmR zEn}$gD4FB3Uk~mNqpE}{s(*`7A`Q+<5~)%tZ=tH-+!4s-h4trE8D+P3_J%ba(W!m60U9+PJU!2-}&rf zPW!>|$ql)b!m{&BvweFq&tax&!&-A$8D7;yrGZ?vA71k?=KQl!W3Qq`WC(>2c5}N zMS~2GNR~Vtjz>VDB`^r&xDXh8JBbAv!Q(*z=>ML2rlf4|N9W#5(PACpjC(OpoOW0} z6bJ-K>|c8@yXY%2b=Q)(tDy0%x&P>BvBX>-wvDQ|%~%=Yt;5J92z zqL%Bj*~ikcT;t5%_cu(SP-vlU&$cd|cud)0kv7E8k0Am9-;ob!gKZ}g+T1O z!wU6_4DQP+P%8O^F(mT1Z@Qe+ixS)$8NICd!QF89?eK?=dojBd@Y;a#DQ}FAB}GoMQsm71H|d-V5}hU>bI0zpZ^cR4Id0 z$yM%Jv>E=F)}X+9c%nNcps>=v*`HjoPUFZRStKCRFkt6P9;M7{#9dw;2)|pjFNdgq zKO;J7nrtcHx(5qB?lG7xZFzHf-fYOz>SCF7!Z4#PDyP3*_Fk1FH{PQ_(n5JT6rd~> z?y1hNISMnZk^9Py;_#08p*wWQ)3yfK^-qJK4R+b>Th0SI0!NOBDn_hpXsX8>^vO^8 ze6<<7!es-zWV0+wod;M?XTsMDGRNtio#PaHJ+zn5@%qKqS8$SL$kv4%Vy#K(OU0eHpT?hTe>PG8Z!=D=r%P&5da(U3qMm}oocT4or z$(V*{gtY_1-<{(!wzsJR`*q@G;e|04Kn8A}qGK7Zal!H>$llLxpB~gS=##vRI%;y< zs%yxjvK2CZjTP7WNeS)i@%54q;9&@1SC=3WBN2!GOZ=6og|M|h7|Nb?X3mmZOhb7xxA|pnjarGIEvn_VGvqR`k%||%35I4pD=W)Q6R$VF zeEAa4;!8U&&-Qa?zx5p)%ynv{82`-$#{(-KJk`Smp&yuY zZ{aYyMS}}X88PIWEF|jd#^$rq$Kc5Ns@=>8rNOxRMMlN&kDx31q^SKIu?!)g?8o4e zB!x=ugcHtjHoFIn`cR&99^OGxT zy_;v@>?N|+SqzPD{Cr4(6L+Z^pjIKbhFdMYAjQCye@J`yTE;uc zXi4k5^WBzMNkG0*@wxA|;0JM}cYVoc!{EFu4!m0+V3Z|D zSavzUs7fa@QF@6o*|nRSfuR?%#uB{t@_vL1ubnzy*DJqug$IFHmKzqZ-#57PggZyK OWE(3xV(p>R=l%zmnJbk5 literal 0 HcmV?d00001 diff --git a/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/DevicesIcons/SwitchJoyCon.png.meta b/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/DevicesIcons/SwitchJoyCon.png.meta new file mode 100644 index 00000000..4a2106ba --- /dev/null +++ b/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/DevicesIcons/SwitchJoyCon.png.meta @@ -0,0 +1,130 @@ +fileFormatVersion: 2 +guid: 562e8ae4167d26b42b4dd08d3f809531 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/checking.png b/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/checking.png new file mode 100644 index 0000000000000000000000000000000000000000..a7cf18ea9d4c8c7d4c97089fed18c73c7b0965e8 GIT binary patch literal 6719 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 CtUm4l literal 0 HcmV?d00001 diff --git a/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/checking.png.meta b/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/checking.png.meta new file mode 100644 index 00000000..b40e8824 --- /dev/null +++ b/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/checking.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 3efbb404fd0fa2440b59f2759cb66521 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/download.png b/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/download.png new file mode 100644 index 0000000000000000000000000000000000000000..1531a6a0b2c41049fac8fc09e3a37b61095446e4 GIT binary patch literal 2575 zcmX|DeLPg@7r!%Iy5n^WO)Bcnm|^l3Q&yv7Zmyc4NQ+e}!m=nay`n5vm>G*P$PY`I z2qonu+E_LzgIW}YRc)v!sjx~)`?P=j{QodgjMBM%3nI23% zZ4bpSBd<{7)|i%}-3SS8KhV2AO`D$XI>M-FoJ=+n4AZR`P2PZ$awR5_i@FA06VO)?y#KGJ7-R$W_xB5l#?R8TZZtwxpm+cIv@ZYhw~%YVpkr8B?(^HPGQIE=mC)VL|xPRTq|g>zPN0lNdBy`cLPV z2G8%;yt-z;6Wjfo{6=WH%H{^uy@M}?+2P_v8 z`G`@nIEjiUq7sfr`VNseNFVdikc&58LrjtdNij;3x2Gp&IkvV?6bj(rSjttA z*iV3Y=*z_|FLZWm^{AVPrH(ZBe)E=2hNwuzJsx1ZeO{f1TQs7kG$CH(eKPBOfA50v ztIgE?TWRjfw8~NH<#5=&3K+Kc6c{l3vQblgA-@0Uk=4nZqb6eM7MlC@4L7nKPv6kP z6OAMs^DRet^tD4DiEtI2A3)aaWBar+#&=Ume46`5s`7nWaSYZ<65`K}qiu)uZpEQ* ztz@GJnU|)&a1xU_m?!)sGJm$~+Eqcu2nA;+b3h*F((HD@|iKp5n%P{p{A9SFpYj#(*1gK3fv zt{_%x>^^NrSs0V@bVDZ0qeZW`fw2q9ij9*v@HkLk(iuYwlsL`Kb;!}J#}+%d#-Xcn z0}abr6j9*OgV9#Rwi@B4ni`feW2pRjJW_p^GcGM)VQIyaLkLXY9&Lm2@p zkM`6cJM~_E4paeNqgrowF$Iyu)4D+*rRkq+c`0bVU%}ZU*{srX*+}dD4_A=t4O0&Y zGhnP+ZR)F2tTy{VaU2+%c=RbmrQ~zWO{Q#MouN{`AQBXnKz0#Q<$skp+nH`{9L))|W za{&2qjVis}(7OmsdEl%zKtRL+ESq-=u%^}JVwnYkD(N1%Yc&9SKIqt|Hc;;h59HWh zvH=5Nd6@qAqzi=2KED^53h46A@+~*!!Js)6Rg)J?wiTHfEB_nn-#DrjNvKj=^ycOo z+u7**MNHzCk&l6wns;sVIaz;#rK+#tssEF9Q-9&fniKlmuRl^0usJKKSh+3n8I|MA z7YX#foO3Q*??UzQtTWY#QEHMWk)IB|VmD7_%3bKKg}fO%w~Sh=1oWydsl8~`sIZf* z?tke^Kx9*-HmM6{33tZwh<6hir+>wkAY+CPi@)R<397S~KvgVQj*KELr3-9E@D5FK z@-0S4GgFWnUiIP$JmX#|410l0`QDdaT5JuG2VnV!&}wuxtE4OK%b5Z@UA~_W`AXdn znfvywz8r|H>))(C-8`mBI9qIQQJx{&b z<&K_#6a_`^t%9>mqKNr@hM7cCo#)E*>I}6%>C&8H{g&$Bat`3rLid^4*;^~;({IHa z1Xy#JiL+BYshX%TD+a+Caj3hU&@dm|)%L605Irz#OEP<_C}7!uUt3un)F3y5ZSL#W ivwfXm;79e_KDP*3^6Sf?hS_5YKmrM!T=B}ye#F1&dq773 literal 0 HcmV?d00001 diff --git a/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/download.png.meta b/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/download.png.meta new file mode 100644 index 00000000..6916023d --- /dev/null +++ b/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/download.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 0ab2653139d474e40a1ce8213f36274e +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/downloaderror.png b/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/downloaderror.png new file mode 100644 index 0000000000000000000000000000000000000000..062ecc7fefd6de486bcbb6c26fb826246246c2e2 GIT binary patch literal 4517 zcmZ{oc{Egi_{Z-o#u(c)&5$LgZ!_7FC1i_HXeL`(vS%w9k;zt}+$^D}F^n}L$~uxY zDod0#Wh*30ktJEPC%@bIo%8$e_s6}TbDs11ywCgdJfC~+d7hXvrl@7trmtst9X6M7ujY#yF7jDbJc-?0(o7@Q6*Lc?erWm4i#)VR zXvoILG;ixY42fvuMt6#Lnt^zQl}E>Rq_}b$jJS}kMs$A)=GAK+tif&kz*!177oBs` zoB~RtavSc$39v!BRa9;R34>-Z5J=6PzZV3@JeQ2{!g0|Io; zi^@yRik=SM1nl82jsW)=WLt@GfB=T6Su4@MHJRVgbaf0%5`0`SfG5gZj#Rkhv|Rc^ z8k4_gr#@xTCnEb05@}0Pd<72=Cr*w0_a}FowNP?@`?YGd&@+3mf*%0dyp<;E$kqHA z3wSKiG}>_R1J}@IHf4X|e`jDYoU~=OE4kz^c~*L&YqMw%acaTsMoKoMi8agnA*0wd z2)}UWJS*-iwD)VSb<$ zPaA9@B1=@K8V;Wr-jQ2ShDx3apZ)D82O0QUzkI|324l%&nd<%nN<*!jFG96!f2}Yo z2!T zZ_ED!dieTmFG6-M`di9NLD%eIh1=vg5onLdeya`|BqsICrpC$;1~WHoVSC!PTf@pM zuXPOCKt!>tY<(h>go62`^5>Ac&0EV`GLSvKbtHOkctgdN#`)bfm zcMrFb?plRgMHN@8$MK#43Bt~2+@VNGRn z8hXA%aNwNAR^4qn79kZ*~X%u7WlB^^Hg$5-*=GZk^@#x6i zM>e)(dG2UO16}*6AE-9}Uj7xW3!3yE@go{T`_Jjv-JS$w`e4X5DPGNz{K&#$>$pK% zj6m!}<2(Eej2nrLL!9oMfp zbu6r>PmS2^VcJ+k3t(Kx!15p?BX=PsDmVAy;#l^LsxBI$I zO{}x$bw9coP&`MS;k1=JZT_*1j@!Z^@9cP<_4Zk>S6xmw45N5Goi z)bEH8sMz$-jJJ8_y35DT6lNk;IV-nwKjoYm4N`>+ksqDg?0%D5qv%=sYsW^-NeCPC z$G4`FkB6~H6}I-pS(tzu*J~V-B;+$=UZ@b!u6o@V96W7Lq87IK z-whrd7DU(DfB@|m@j#XlaN;=0*vzCp{lnpn47(QG6c6_Edm;JyAy02=aZCyCI>GqK zVr9{Ra+M<#wd0dS7t^}I?S+2Yx?%=gfSB4Bx#rHx>QRfU{%lhiP(qk$6aaWp`#$%#}2!$YUBfD>c$*9j3TN1u0 zR&Ec@<@du_`!9zHF6B7&Zu4(D-Vt<4*vLXSWlsdxPmtCob&>=E>-_a#zFGO<5k*S9 zCE-0^1^temUp-qH4g;=>BvdEuL_ND96)UN@sh4Pdy_GhXQ=Ad>L_5ZNcAtbe42SJS z@f@o`j9@@dihwJ zBa50x?BgH^HXeJaVC1USC3_z1251nE-FY?PbI2R^lQTr`Q3&f=1q~|{SNpGL3#k((-W}(GD9dV9T z^HwRJ7c#^OVt!uZzI+AE)3@jz7d0ZQNVg+WS}L3Ipq`oxOEwO8YY9&8e-$?Am^KF4&BsbsPglDp?#gbs%Rh zQFbt`c<*hbQ<rPdVI{;lQ7>uK;DFv&#IgS@fbkN06m<> zTlBkA6fHSGFrDbRE3!G&CW*Z}` z_hz~g9WZLskOY0kmtIV%FDC`FzA@3vgM)kTYf)dMnqp?9Ow2zgeBFL2F5drCa+{N^ zA!^(4YjvyDFYq2O)A2@+peX5;cB>DmhN&2I#yU|6#r@!;}IM-Goj z_awH_572*?qVAa;EAA2zBFg-D2^0)Z3b6Wu!H3=9)<# zKC1aC$&vQsYKLFx&#NfqK4E#|#SD;C>Suy<0>G2QZBdc`>DNfOoRrM$E8)mZmmcH# z#ixKw04e0`j`uZ=+I_=#`|qcAq0>ZSBZ+)Ba_0yvx?z(|19Xgx6%34}W zac4d9T7P|fR2{mq+t#BGPF$my^9x--{+Gpga*MA5uU>j^d!%U&J!Ku5aOJRHmJ3`$qSI=0*wA40;4p$7CVcm{xcHdB9 zysD`^IeXkQIawq@L7WbXr{;d|#@J8*-cXs1bWR@f-G}ZtA@#<=AS4YhE>>Pv@;5z* zm1hgTkn?S#sLi@9Zq&g$Cwv)Tk<>A9(Ib@}kN(8Ko8^?Q&WFippw&t&xIIQGV z+JZxf!)5X*{RXpI5RLsTmT<`+ysbhSMpG6?X@f~G@|3OX6lkJ6%!MtJ*C!}!e{ide z_$qI0pN1g1k522Lw9Sw+S0L zqEG8$Vx!F=pS6`n`7zr-q zqp=Jf0VPGMh3GEneNZ#!<|6l23(I$fE?$b5EC z=Gb(LgkEQnmlWqdJ87Dp#03KrQ|=>gN=V@ZMz1yNDUv>+9{n8`5509dlaD*DQdEzT zxR&^afUaZt6dqQ3|E;>R!Hb8b24gJ}9ot-uUGXG{0(a=uR0i1&@5>pU^x2MG<{S|JPSMuM<1wqJ2T z$pq58*os!~qOEe`C35j=tJ#fH{)$F1Wc8ko*&o-GbyOVT0(|WfXSvYI z_tPKyeDcP-RCLvPYHFaJ4Ou=yFObU4*ca8#ffvtT%-*Jl=cV_3NGJ4t2%O#wp4>3M zRVBayXtz46@*3bR^Ce?@{wD1+2=PNIonii|6Iq_?Mo6UtuGXrVB*w)YlP3(W6kq+5 zu0c7fX;IbwC9GHp59Tkcy_AP+@-xqpc5)e%M2ko{k9gwM)%UEW#}}X5Tt-DZ_NNFY zr8#x=*plaB|C&S?n)r;3EyxWx$PmI2-D$8BZlCB5{a{3wTe5iyoR$+k6W3*cIMg|u z_9XD10(Wyzfu|EK6e3tCj%v|ep1SpI#UT>SR=)xPktt!7gu^+BdqsRm~2|E zH6uT9a3LKLruT{d2W;9c#(fJd^OkSHOgKQiH%q9_1LO|9Al zR7no$MDgP!l9#3Tok6#c+!--ER(?;0@Y8WlhKnlvz2D;o*I^fEI@P^M@!~q68mKxEdl;!=eJ$)u zpn?3urkcL-Q<(EwgJ z26R0UpgiwwaYVMhxOp`0qR?8bGU@z|bHxD|ps~GA_36^3%hO2E>wSMM-lGU=-HWR2 z(v6{J)HbSZxC(07s)C9t+o0|*At0sGyQpCZtmwDnm_XfdYH9BUUoEJ~)8h2^L_j2u zmdT-N3kq1#YbXB?DCnaXu8Cv*NCLp_F07Nd9~!ox{$&;cc#8E7f8J7m2}J;!fvJAU I3Fol?0cTkbeEZX*0afh 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 literal 0 HcmV?d00001 diff --git a/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/syncerror.png.meta b/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/syncerror.png.meta new file mode 100644 index 00000000..efc580d5 --- /dev/null +++ b/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/syncerror.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 5ab158116cd13094f8aeec03e9c776bd +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/upload.png b/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7d2a8a18bb57eaf9838ac3ec010be3b1e6008e GIT binary patch literal 5093 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 literal 0 HcmV?d00001 diff --git a/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/upload.png.meta b/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/upload.png.meta new file mode 100644 index 00000000..500718c1 --- /dev/null +++ b/AxibugEmuOnline.Client.Switch/Assets/Resources/Icons/upload.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: fe23eed4ad510ca42885889dbb8aaf06 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client.Switch/Assets/Resources/UIPrefabs/OptionUI.prefab b/AxibugEmuOnline.Client.Switch/Assets/Resources/UIPrefabs/OptionUI.prefab index fc677e08..e20dea9c 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Resources/UIPrefabs/OptionUI.prefab +++ b/AxibugEmuOnline.Client.Switch/Assets/Resources/UIPrefabs/OptionUI.prefab @@ -520,6 +520,81 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: gradient: {fileID: 46877084639177849} +--- !u!1 &804908692400837359 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8642975113305060610} + - component: {fileID: 6956713201433508184} + - component: {fileID: 1041409322641615} + m_Layer: 5 + m_Name: download + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8642975113305060610 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 804908692400837359} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 905458728127029103} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 25, y: 25} + m_SizeDelta: {x: 50, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6956713201433508184 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 804908692400837359} + m_CullTransparentMesh: 1 +--- !u!114 &1041409322641615 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 804908692400837359} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 961aba7b7a39e4d4c832e94350f44d4c, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &1280900818828460255 GameObject: m_ObjectHideFlags: 0 @@ -706,7 +781,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Color: {r: 1, g: 0.80982494, b: 0, a: 1} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -973,9 +1048,12 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3539783812791358836} - - {fileID: 6030618878828304669} - {fileID: 2303902335643923373} - {fileID: 8677023902282266940} + - {fileID: 7976727918032113692} + - {fileID: 8642975113305060610} + - {fileID: 5521327881148589877} + - {fileID: 1660924397234324979} m_Father: {fileID: 5970282275929291192} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -1442,97 +1520,6 @@ MonoBehaviour: m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} m_EffectDistance: {x: 1.5, y: -1.5} m_UseGraphicAlpha: 1 ---- !u!1 &4078965612622303339 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6030618878828304669} - - component: {fileID: 6018890508858230420} - - component: {fileID: 1865219663044263670} - - component: {fileID: 6562970432720184454} - m_Layer: 5 - m_Name: Syncing - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &6030618878828304669 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4078965612622303339} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 905458728127029103} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 25, y: 25} - m_SizeDelta: {x: 50, y: 50} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &6018890508858230420 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4078965612622303339} - m_CullTransparentMesh: 1 ---- !u!114 &1865219663044263670 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4078965612622303339} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 21300000, guid: c5a9535bb63e1f14f9a1528566864ab2, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!114 &6562970432720184454 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4078965612622303339} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 8707b921aaba60d45b4041e96f3542dd, type: 3} - m_Name: - m_EditorClassIdentifier: - m_duration: 2 - m_ease: 1 - m_reverseRotation: 1 --- !u!1 &4124172888520656882 GameObject: m_ObjectHideFlags: 0 @@ -3183,7 +3170,10 @@ MonoBehaviour: UI_Empty: {fileID: 8350228378118296958} UI_SavTime: {fileID: 13043593624240728} UI_Disconnect: {fileID: 6998836277133601669} - UI_Syncing: {fileID: 4078965612622303339} + UI_DownloadError: {fileID: 8857746597932873861} + UI_Downloading: {fileID: 804908692400837359} + UI_Uploading: {fileID: 8872483836623718893} + UI_Checking: {fileID: 7267609509608397888} UI_Conflict: {fileID: 1601163034082482360} UI_Synced: {fileID: 2637678715180681658} --- !u!1 &7141318786199574664 @@ -3286,6 +3276,81 @@ MonoBehaviour: m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} m_EffectDistance: {x: 1.5, y: -1.5} m_UseGraphicAlpha: 1 +--- !u!1 &7267609509608397888 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1660924397234324979} + - component: {fileID: 5687683890234766428} + - component: {fileID: 6995705272401882157} + m_Layer: 5 + m_Name: checking + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1660924397234324979 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7267609509608397888} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 905458728127029103} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 25, y: 25} + m_SizeDelta: {x: 50, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5687683890234766428 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7267609509608397888} + m_CullTransparentMesh: 1 +--- !u!114 &6995705272401882157 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7267609509608397888} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 3efbb404fd0fa2440b59f2759cb66521, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &7579340952198812870 GameObject: m_ObjectHideFlags: 0 @@ -3888,6 +3953,156 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8857746597932873861 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7976727918032113692} + - component: {fileID: 8830922541807882247} + - component: {fileID: 74709689621410332} + m_Layer: 5 + m_Name: syncerror + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7976727918032113692 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8857746597932873861} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 905458728127029103} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 25, y: 25} + m_SizeDelta: {x: 50, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8830922541807882247 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8857746597932873861} + m_CullTransparentMesh: 1 +--- !u!114 &74709689621410332 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8857746597932873861} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 5ab158116cd13094f8aeec03e9c776bd, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8872483836623718893 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5521327881148589877} + - component: {fileID: 1453351515137974665} + - component: {fileID: 625482330037984562} + m_Layer: 5 + m_Name: upload + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5521327881148589877 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8872483836623718893} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 905458728127029103} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 25, y: 25} + m_SizeDelta: {x: 50, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1453351515137974665 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8872483836623718893} + m_CullTransparentMesh: 1 +--- !u!114 &625482330037984562 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8872483836623718893} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: fe23eed4ad510ca42885889dbb8aaf06, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &8884391103430529053 GameObject: m_ObjectHideFlags: 0 diff --git a/AxibugEmuOnline.Client.Switch/Assets/Scene/AxibugEmuOnline.Client.unity b/AxibugEmuOnline.Client.Switch/Assets/Scene/AxibugEmuOnline.Client.unity index 592ac5ab..1a77c117 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Scene/AxibugEmuOnline.Client.unity +++ b/AxibugEmuOnline.Client.Switch/Assets/Scene/AxibugEmuOnline.Client.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 10 + serializedVersion: 9 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -38,12 +38,13 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 13 - m_BakeOnSceneLoad: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -66,6 +67,9 @@ LightmapSettings: m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 m_ReflectionCompression: 2 m_MixedBakeMode: 2 m_BakeBackend: 1 @@ -143,13 +147,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 408101310} - serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &408101312 MonoBehaviour: @@ -164,6 +168,9 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: AllowDebugging: 1 + OpenHubOnStart: 0 + AutoShowLastLogLine: 0 + OnlyShowErrOnStart: 0 --- !u!1 &1335662458 GameObject: m_ObjectHideFlags: 0 @@ -188,13 +195,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1335662458} - serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1335662460 MonoBehaviour: @@ -266,18 +273,11 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1498586261} - serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1660057539 &9223372036854775807 -SceneRoots: - m_ObjectHideFlags: 0 - m_Roots: - - {fileID: 1498586263} - - {fileID: 1335662459} - - {fileID: 408101311} diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/App.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/App.cs index 1d78b05a..03fd39d9 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/App.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/App.cs @@ -90,9 +90,14 @@ namespace AxibugEmuOnline.Client.ClientCore public static void Init(bool isTest = false, bool isUseGUIButton = false, string testSrvIP = "", bool bUseLocalWebApi = false, string mLocalWebApi = "") { log = new LogManager(OnLogOut); - //鍏朵粬骞冲彴蹇呰鐨勫垵濮嬪寲 - if (UnityEngine.Application.platform == RuntimePlatform.PSP2) PSP2Init(); +#if UNITY_PSP2 + PSP2Init(); +#endif + +#if UNITY_SWITCH + SwitchInit(); +#endif input = new InputDevicesManager(); FileDownloader = new FileDownloader(); @@ -153,11 +158,18 @@ namespace AxibugEmuOnline.Client.ClientCore sonyVitaCommonDialog = new GameObject().AddComponent(); #endif -#if UNITY_SWITCH - //鍒涘缓鍒涘缓Switch - switchCommon = new GameObject().AddComponent(); -#endif + } + private static void SwitchInit() + { +#if UNITY_SWITCH + AxiNS.instance.Init(); + if (!AxiIO.Directory.Exists(App.PersistentDataRootPath())) + AxiIO.Directory.CreateDirectory(App.PersistentDataRootPath()); + switchCommon = new GameObject().AddComponent(); + switchCommon.gameObject.name = "[SwitchCommon]"; + GameObject.DontDestroyOnLoad(switchCommon); +#endif } diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/AxiHttp/AxiHttp.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/AxiHttp/AxiHttp.cs index b255ac8d..cf0dc512 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/AxiHttp/AxiHttp.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/AxiHttp/AxiHttp.cs @@ -166,20 +166,23 @@ public static class AxiHttp public static IPAddress GetDnsIP(string str) { - if (!dictIP2Address.ContainsKey(str)) + lock (dictIP2Address) { - IPHostEntry host = Dns.GetHostEntry(str); - IPAddress ip = null; - foreach (var item in host.AddressList) + if (!dictIP2Address.ContainsKey(str)) { - if (item.AddressFamily == AddressFamily.InterNetwork) + IPHostEntry host = Dns.GetHostEntry(str); + IPAddress ip = null; + foreach (var item in host.AddressList) { - ip = item; break; + if (item.AddressFamily == AddressFamily.InterNetwork) + { + ip = item; break; + } } + dictIP2Address[str] = ip; } - dictIP2Address[str] = ip; + return dictIP2Address[str]; } - return dictIP2Address[str]; } public enum AxiDownLoadMode diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/AxiInputSP/PSVita/AxiPSVBackTouchEmuKey.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/AxiInputSP/PSVita/AxiPSVBackTouchEmuKey.cs index b3f3542b..6a0b74e1 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/AxiInputSP/PSVita/AxiPSVBackTouchEmuKey.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/AxiInputSP/PSVita/AxiPSVBackTouchEmuKey.cs @@ -62,11 +62,7 @@ namespace AxiInputSP m_TouckState[AxiPSVBackTouchType.RightBotton] = new AxiPSVBackTouchState(AxiPSVBackTouchType.RightBotton); } - private void OnEnable() - { - } - - private void OnDisable() + void OnDestroy() { _instance = null; } diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/DebuggerByGUI.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/DebuggerByGUI.cs index 9affce45..0853c920 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/DebuggerByGUI.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/DebuggerByGUI.cs @@ -24,7 +24,7 @@ public class DebuggerByGUI : MonoBehaviour private Vector2 _scrollLogView = Vector2.zero; private Vector2 _scrollCurrentLogView = Vector2.zero; private Vector2 _scrollSystemView = Vector2.zero; - private bool _expansion = false; + private bool _expansion = false; private Rect _windowRect = new Rect(0, 0, 100, 60); private int _fps = 0; @@ -32,9 +32,26 @@ public class DebuggerByGUI : MonoBehaviour private int _frameNumber = 0; private float _lastShowFPSTime = 0f; - private void Start() + public bool OpenHubOnStart = false; + public bool AutoShowLastLogLine = false; + public bool OnlyShowErrOnStart = false; + + private void Start() { - DontDestroyOnLoad(this.gameObject); + if (OpenHubOnStart) + { + _expansion = true; + _windowRect.width = 1000; + _windowRect.height = 600; + } + + if (OnlyShowErrOnStart) + { + _showInfoLog = false; + _showWarningLog = false; + } + + DontDestroyOnLoad(this.gameObject); if (AllowDebugging) { Application.logMessageReceived += LogHandler; @@ -237,16 +254,22 @@ public class DebuggerByGUI : MonoBehaviour GUILayout.Label(_logInformations[i].message); GUILayout.FlexibleSpace(); GUI.contentColor = Color.white; - GUILayout.EndHorizontal(); + GUILayout.EndHorizontal(); } } GUILayout.EndScrollView(); _scrollCurrentLogView = GUILayout.BeginScrollView(_scrollCurrentLogView, "Box", GUILayout.Height(100)); - if (_currentLogIndex != -1) + + if (AutoShowLastLogLine) + { + _scrollLogView.y = Mathf.Lerp(_scrollLogView.y, float.MaxValue, 0.1f); + } + + if (_currentLogIndex != -1) { GUILayout.Label(_logInformations[_currentLogIndex].message + "\r\n\r\n" + _logInformations[_currentLogIndex].stackTrace); - } + } GUILayout.EndScrollView(); } #endregion diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Emulator/NesEmulator/NesEmulator_Screen.mat b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Emulator/NesEmulator/NesEmulator_Screen.mat index 74fd7309..d581fae5 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Emulator/NesEmulator/NesEmulator_Screen.mat +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Emulator/NesEmulator/NesEmulator_Screen.mat @@ -92,3 +92,4 @@ Material: - _Color: {r: 1, g: 1, b: 1, a: 1} - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/EssgeeKeyBinding.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/EssgeeKeyBinding.cs index 159c8be1..39161387 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/EssgeeKeyBinding.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/EssgeeKeyBinding.cs @@ -147,6 +147,25 @@ namespace AxibugEmuOnline.Client.Settings controller.SetBinding(EssgeeSingleKey.LEFT, device.JOYSTICK.Left, 1); controller.SetBinding(EssgeeSingleKey.RIGHT, device.JOYSTICK.Right, 1); } + + public override void Bind(SwitchJoyCon_D device, ControllerBinder controller) + { + controller.SetBinding(EssgeeSingleKey.OPTION_1, device.Plus, 0); + controller.SetBinding(EssgeeSingleKey.OPTION_2, device.Minus, 0); + controller.SetBinding(EssgeeSingleKey.UP, device.Up, 0); + controller.SetBinding(EssgeeSingleKey.DOWN, device.Down, 0); + controller.SetBinding(EssgeeSingleKey.LEFT, device.Left, 0); + controller.SetBinding(EssgeeSingleKey.RIGHT, device.Right, 0); + controller.SetBinding(EssgeeSingleKey.BTN_1, device.A, 0); + controller.SetBinding(EssgeeSingleKey.BTN_2, device.B, 0); + controller.SetBinding(EssgeeSingleKey.BTN_3, device.X, 0); + controller.SetBinding(EssgeeSingleKey.BTN_4, device.Y, 0); + + controller.SetBinding(EssgeeSingleKey.UP, device.LeftStick.Up, 1); + controller.SetBinding(EssgeeSingleKey.DOWN, device.LeftStick.Down, 1); + controller.SetBinding(EssgeeSingleKey.LEFT, device.LeftStick.Left, 1); + controller.SetBinding(EssgeeSingleKey.RIGHT, device.LeftStick.Right, 1); + } } public class MasterSystemKeyBinding : EssgeeKeyBinding diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/MAMEKeyBinding.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/MAMEKeyBinding.cs index f7962ab9..f8af305c 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/MAMEKeyBinding.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/MAMEKeyBinding.cs @@ -158,6 +158,27 @@ namespace AxibugEmuOnline.Client.Settings controller.SetBinding(UMAMEKSingleKey.LEFT, device.JOYSTICK.Left, 1); controller.SetBinding(UMAMEKSingleKey.RIGHT, device.JOYSTICK.Right, 1); } + + public override void Bind(SwitchJoyCon_D device, ControllerBinder controller) + { + controller.SetBinding(UMAMEKSingleKey.INSERT_COIN, device.Minus, 0); + controller.SetBinding(UMAMEKSingleKey.GAMESTART, device.Plus, 0); + controller.SetBinding(UMAMEKSingleKey.UP, device.Up, 0); + controller.SetBinding(UMAMEKSingleKey.DOWN, device.Down, 0); + controller.SetBinding(UMAMEKSingleKey.LEFT, device.Left, 0); + controller.SetBinding(UMAMEKSingleKey.RIGHT, device.Right, 0); + controller.SetBinding(UMAMEKSingleKey.BTN_A, device.A, 0); + controller.SetBinding(UMAMEKSingleKey.BTN_B, device.B, 0); + controller.SetBinding(UMAMEKSingleKey.BTN_C, device.X, 0); + controller.SetBinding(UMAMEKSingleKey.BTN_D, device.Y, 0); + controller.SetBinding(UMAMEKSingleKey.BTN_E, device.LeftSL, 0); + controller.SetBinding(UMAMEKSingleKey.BTN_F, device.RightSL, 0); + + controller.SetBinding(UMAMEKSingleKey.UP, device.LeftStick.Up, 1); + controller.SetBinding(UMAMEKSingleKey.DOWN, device.LeftStick.Down, 1); + controller.SetBinding(UMAMEKSingleKey.LEFT, device.LeftStick.Left, 1); + controller.SetBinding(UMAMEKSingleKey.RIGHT, device.LeftStick.Right, 1); + } } public class NEOGEOKeyBinding : MAMEKeyBinding diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/Model/EmuCoreBinder.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/Model/EmuCoreBinder.cs index 86d36556..dc4aab0e 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/Model/EmuCoreBinder.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/Model/EmuCoreBinder.cs @@ -16,7 +16,8 @@ public abstract class EmuCoreBinder : InternalEmuCoreBinder, IDeviceBinder, IDeviceBinder, IDeviceBinder, - IDeviceBinder + IDeviceBinder, + IDeviceBinder where T : Enum { //姣忎竴涓疄渚嬩唬琛ㄤ竴涓搴旀ā鎷熷櫒骞冲彴鐨勬帶鍒跺櫒绱㈠紩 @@ -83,6 +84,7 @@ public abstract class EmuCoreBinder : InternalEmuCoreBinder, else if (device is XboxController_D xbC) Bind(xbC, binding); else if (device is PSVController_D psvC) Bind(psvC, binding); else if (device is ScreenGamepad_D screenGamepad) Bind(screenGamepad, binding); + else if (device is SwitchJoyCon_D nsJoyCon) Bind(nsJoyCon, binding); else throw new NotImplementedException($"{device.GetType()}"); } @@ -305,4 +307,5 @@ public abstract class EmuCoreBinder : InternalEmuCoreBinder, public abstract void Bind(XboxController_D device, ControllerBinder controller); public abstract void Bind(PSVController_D device, ControllerBinder controller); public abstract void Bind(ScreenGamepad_D device, ControllerBinder controller); + public abstract void Bind(SwitchJoyCon_D device, ControllerBinder controller); } \ No newline at end of file diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/NesKeyBinding.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/NesKeyBinding.cs index 4781c3fb..6d42aa0d 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/NesKeyBinding.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/NesKeyBinding.cs @@ -121,5 +121,22 @@ namespace AxibugEmuOnline.Client.Settings controller.SetBinding(EnumButtonType.UP, device.JOYSTICK.Up, 1); controller.SetBinding(EnumButtonType.DOWN, device.JOYSTICK.Down, 1); } + public override void Bind(SwitchJoyCon_D device, ControllerBinder controller) + { + controller.SetBinding(EnumButtonType.LEFT, device.Left, 0); + controller.SetBinding(EnumButtonType.RIGHT, device.Right, 0); + controller.SetBinding(EnumButtonType.UP, device.Up, 0); + controller.SetBinding(EnumButtonType.DOWN, device.Down, 0); + controller.SetBinding(EnumButtonType.A, device.A, 0); + controller.SetBinding(EnumButtonType.B, device.B, 0); + controller.SetBinding(EnumButtonType.SELECT, device.Minus, 0); + controller.SetBinding(EnumButtonType.START, device.Plus, 0); + controller.SetBinding(EnumButtonType.MIC, device.RightSL, 0); + + controller.SetBinding(EnumButtonType.LEFT, device.LeftStick.Left, 1); + controller.SetBinding(EnumButtonType.RIGHT, device.LeftStick.Right, 1); + controller.SetBinding(EnumButtonType.UP, device.LeftStick.Up, 1); + controller.SetBinding(EnumButtonType.DOWN, device.LeftStick.Down, 1); + } } } \ No newline at end of file diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/XMBKeyBinding.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/XMBKeyBinding.cs index 5ef9669a..8061c3d0 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/XMBKeyBinding.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/XMBKeyBinding.cs @@ -112,5 +112,20 @@ namespace AxibugEmuOnline.Client controller.SetBinding(EnumCommand.SelectItemRight, device.JOYSTICK.Right, 1); controller.SetBinding(EnumCommand.SelectItemUp, device.JOYSTICK.Up, 1); } + public override void Bind(SwitchJoyCon_D device, ControllerBinder controller) + { + controller.SetBinding(EnumCommand.Back, device.A, 0); + controller.SetBinding(EnumCommand.Enter, device.B, 0); + controller.SetBinding(EnumCommand.OptionMenu, device.Plus, 0); + controller.SetBinding(EnumCommand.SelectItemDown, device.Down, 0); + controller.SetBinding(EnumCommand.SelectItemLeft, device.Left, 0); + controller.SetBinding(EnumCommand.SelectItemRight, device.Right, 0); + controller.SetBinding(EnumCommand.SelectItemUp, device.Up, 0); + + controller.SetBinding(EnumCommand.SelectItemDown, device.LeftStick.Down, 1); + controller.SetBinding(EnumCommand.SelectItemLeft, device.LeftStick.Left, 1); + controller.SetBinding(EnumCommand.SelectItemRight, device.LeftStick.Right, 1); + controller.SetBinding(EnumCommand.SelectItemUp, device.LeftStick.Up, 1); + } } } \ No newline at end of file diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/SwitchJoyCon_D.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/SwitchJoyCon_D.cs new file mode 100644 index 00000000..f5836d7e --- /dev/null +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/SwitchJoyCon_D.cs @@ -0,0 +1,34 @@ +锘縰sing AxibugProtobuf; + +namespace AxibugEmuOnline.Client.InputDevices +{ + public class SwitchJoyCon_D : InputDevice_D + { + public Button_C LeftSL; + public Button_C LeftSR; + public Button_C RightSL; + public Button_C RightSR; + + public Button_C B; + public Button_C A; + public Button_C Y; + public Button_C X; + + public Button_C Up; + public Button_C Down; + public Button_C Left; + public Button_C Right; + + public Button_C Minus; + public Button_C Plus; + + public Stick_C LeftStick; + public Stick_C RightStick; + public Button_C LeftStickPress; + public Button_C RightStickPress; + + public SwitchJoyCon_D(InputResolver resolver) : base(resolver) { } + + public override GamePadType PadType => GamePadType.SwitchJoyCon; + } +} \ No newline at end of file diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/SwitchJoyCon_D.cs.meta b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/SwitchJoyCon_D.cs.meta new file mode 100644 index 00000000..0fe358eb --- /dev/null +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/SwitchJoyCon_D.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 28380f06191bd35458b20113fbd2960b \ No newline at end of file diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/InputDevicesManager.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/InputDevicesManager.cs index 458ecc84..5bb9f530 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/InputDevicesManager.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/InputDevicesManager.cs @@ -1,5 +1,6 @@ 锘縰sing System.Collections.Generic; using UnityEngine; +using UnityEngine.InputSystem; namespace AxibugEmuOnline.Client.InputDevices { @@ -72,11 +73,48 @@ namespace AxibugEmuOnline.Client.InputDevices { return m_devices.Values; } - + List templog = new List(); /// 鐢卞閮ㄩ┍鍔ㄧ殑閫昏緫鏇存柊鍏ュ彛 public void Update() { foreach (var device in m_devices.Values) device.Update(); + + //string HadDrive = ""; + //foreach (var device in InputSystem.devices) + //{ + // if (device is Mouse) + // continue; + // bool bhadflag = false; + + // templog.Clear(); + // for (int i = 0; i < device.allControls.Count; i++) + // { + // if (device.allControls[i].IsPressed(0)) + // { + // if (device.allControls[i].name.ToLower() == "anykey") + // continue; + // bhadflag = true; + // string keyname = $"{device.allControls[i].GetType().FullName}|{device.allControls[i].name},"; + // templog.Add(keyname); + // } + // } + + // if (bhadflag) + // { + // HadDrive += $" D:{device.GetType().FullName}|{device.GetType().BaseType.FullName}|{device.name}, K:"; + // foreach (var s in templog) + // { + // HadDrive += s; + // } + // } + + //} + + //if (!string.IsNullOrEmpty(HadDrive)) + //{ + // Debug.Log($"Had Drive: {HadDrive}"); + //} + } } } \ No newline at end of file diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs index 0e9f910a..af6ff057 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs @@ -1,8 +1,18 @@ 锘#if ENABLE_INPUT_SYSTEM + +#if UNITY_EDITOR || UNITY_STANDALONE_OSX || UNITY_STANDALONE_WIN || UNITY_WSA || PACKAGE_DOCS_GENERATION +#define DUALSHOCK_SUPPORT +#endif + +#if UNITY_EDITOR || UNITY_SWITCH || PACKAGE_DOCS_GENERATION +#define JOYCON_SUPPORT +#endif + using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.DualShock; +using UnityEngine.InputSystem.Switch; using UnityEngine.InputSystem.XInput; namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem @@ -24,25 +34,25 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem InputDevice_D newDevice = null; if (ipdev is Keyboard) newDevice = new Keyboard_D(this); - -#if UNITY_STANDALONE || UNITY_PS5 || UNITY_PS4 || UNITY_PS3 //PC/Mac/Linux/PS345 鎵嶈兘鐢 DualShock +#if DUALSHOCK_SUPPORT else if (ipdev is DualShockGamepad) { if (ipdev is DualShock3GamepadHID) newDevice = new DualShockController_D(this, ps3: true); else if (ipdev is DualShock4GamepadHID) newDevice = new DualShockController_D(this, ps4: true); else if (ipdev is DualSenseGamepadHID) newDevice = new DualShockController_D(this, ps5: true); else newDevice = new DualShockController_D(this); - } #endif - -#if UNITY_STANDALONE_WIN //浠匴indows 鎵嶈兘鐢╔input else if (ipdev is XInputController) { newDevice = new XboxController_D(this); } +#if JOYCON_SUPPORT + else if (ipdev is NPad) + { + newDevice = new SwitchJoyCon_D(this); + } #endif - else if (ipdev is Gamepad) newDevice = new GamePad_D(this); //娉ㄦ剰Gamepad鐨勪紭鍏堢骇,鍥犱负浠讳綍鎵嬫焺,Inputsystem涓殑鍩虹被閮芥槸GamePad if (newDevice != null) @@ -240,6 +250,7 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem mapper[keyboard_d.Semicolon] = ipKeyboard.semicolonKey; mapper[keyboard_d.Quote] = ipKeyboard.quoteKey; } +#if DUALSHOCK_SUPPORT else if (device_d is DualShockController_D ds_d) { var ipDsGamePad = ipdevice as DualShockGamepad; @@ -263,6 +274,7 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem mapper[ds_d.LeftStick] = ipDsGamePad.leftStick; mapper[ds_d.RightStick] = ipDsGamePad.rightStick; } +#endif else if (device_d is XboxController_D xbox_d) { var ipXInputGamePad = ipdevice as XInputController; @@ -284,53 +296,53 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem mapper[xbox_d.RightStickPress] = ipXInputGamePad.rightStickButton; mapper[xbox_d.LeftStick] = ipXInputGamePad.leftStick; mapper[xbox_d.RightStick] = ipXInputGamePad.rightStick; - } +#if JOYCON_SUPPORT + else if (device_d is SwitchJoyCon_D joycon_d) + { + var ipdevice_joycon = ipdevice as NPad; + mapper[joycon_d.LeftSL] = ipdevice_joycon.leftSL; + mapper[joycon_d.LeftSR] = ipdevice_joycon.leftSR; + mapper[joycon_d.RightSL] = ipdevice_joycon.rightSL; + mapper[joycon_d.RightSR] = ipdevice_joycon.rightSR; + mapper[joycon_d.B] = ipdevice_joycon.bButton; + mapper[joycon_d.A] = ipdevice_joycon.aButton; + mapper[joycon_d.Y] = ipdevice_joycon.yButton; + mapper[joycon_d.X] = ipdevice_joycon.xButton; + mapper[joycon_d.Up] = ipdevice_joycon.dpad.up; + mapper[joycon_d.Down] = ipdevice_joycon.dpad.down; + mapper[joycon_d.Left] = ipdevice_joycon.dpad.left; + mapper[joycon_d.Right] = ipdevice_joycon.dpad.right; + mapper[joycon_d.Minus] = ipdevice_joycon.selectButton; + mapper[joycon_d.Plus] = ipdevice_joycon.startButton; + mapper[joycon_d.LeftStick] = ipdevice_joycon.leftStick; + mapper[joycon_d.RightStick] = ipdevice_joycon.rightStick; + mapper[joycon_d.RightStickPress] = ipdevice_joycon.rightStickButton; + mapper[joycon_d.LeftStickPress] = ipdevice_joycon.leftStickButton; + } +#endif else if (device_d is GamePad_D gamepad_d) { - if (ipdevice is UnityEngine.InputSystem.Switch.NPad ipdevice_ns) - { - mapper[gamepad_d.Up] = ipdevice_ns.dpad.up; - mapper[gamepad_d.Down] = ipdevice_ns.dpad.down; - mapper[gamepad_d.Left] = ipdevice_ns.dpad.left; - mapper[gamepad_d.Right] = ipdevice_ns.dpad.right; - mapper[gamepad_d.Select] = ipdevice_ns.selectButton; - mapper[gamepad_d.Start] = ipdevice_ns.startButton; - mapper[gamepad_d.North] = ipdevice_ns.xButton; - mapper[gamepad_d.South] = ipdevice_ns.bButton; - mapper[gamepad_d.West] = ipdevice_ns.yButton; - mapper[gamepad_d.East] = ipdevice_ns.aButton; - mapper[gamepad_d.LeftShoulder] = ipdevice_ns; - mapper[gamepad_d.RightShoulder] = ipdevice_ns.rightShoulder; - mapper[gamepad_d.LeftTrigger] = ipdevice_ns.leftTrigger; - mapper[gamepad_d.RightTrigger] = ipdevice_ns.rightTrigger; - mapper[gamepad_d.LeftStickPress] = ipdevice_ns.leftStickButton; - mapper[gamepad_d.RightStickPress] = ipdevice_ns.rightStickButton; - mapper[gamepad_d.LeftStick] = ipdevice_ns.leftStick; - mapper[gamepad_d.RightStick] = ipdevice_ns.rightStick; - } - else - { - var ipGamepad = ipdevice as Gamepad; - mapper[gamepad_d.Up] = ipGamepad.dpad.up; - mapper[gamepad_d.Down] = ipGamepad.dpad.down; - mapper[gamepad_d.Left] = ipGamepad.dpad.left; - mapper[gamepad_d.Right] = ipGamepad.dpad.right; - mapper[gamepad_d.Select] = ipGamepad.selectButton; - mapper[gamepad_d.Start] = ipGamepad.startButton; - mapper[gamepad_d.North] = ipGamepad.buttonNorth; - mapper[gamepad_d.South] = ipGamepad.buttonSouth; - mapper[gamepad_d.West] = ipGamepad.buttonWest; - mapper[gamepad_d.East] = ipGamepad.buttonEast; - mapper[gamepad_d.LeftShoulder] = ipGamepad.leftShoulder; - mapper[gamepad_d.RightShoulder] = ipGamepad.rightShoulder; - mapper[gamepad_d.LeftTrigger] = ipGamepad.leftTrigger; - mapper[gamepad_d.RightTrigger] = ipGamepad.rightTrigger; - mapper[gamepad_d.LeftStickPress] = ipGamepad.leftStickButton; - mapper[gamepad_d.RightStickPress] = ipGamepad.rightStickButton; - mapper[gamepad_d.LeftStick] = ipGamepad.leftStick; - mapper[gamepad_d.RightStick] = ipGamepad.rightStick; - } + var ipGamepad = ipdevice as Gamepad; + mapper[gamepad_d.Up] = ipGamepad.dpad.up; + mapper[gamepad_d.Down] = ipGamepad.dpad.down; + mapper[gamepad_d.Left] = ipGamepad.dpad.left; + mapper[gamepad_d.Right] = ipGamepad.dpad.right; + mapper[gamepad_d.Select] = ipGamepad.selectButton; + mapper[gamepad_d.Start] = ipGamepad.startButton; + mapper[gamepad_d.North] = ipGamepad.buttonNorth; + mapper[gamepad_d.South] = ipGamepad.buttonSouth; + mapper[gamepad_d.West] = ipGamepad.buttonWest; + mapper[gamepad_d.East] = ipGamepad.buttonEast; + mapper[gamepad_d.LeftShoulder] = ipGamepad.leftShoulder; + mapper[gamepad_d.RightShoulder] = ipGamepad.rightShoulder; + mapper[gamepad_d.LeftTrigger] = ipGamepad.leftTrigger; + mapper[gamepad_d.RightTrigger] = ipGamepad.rightTrigger; + mapper[gamepad_d.LeftStickPress] = ipGamepad.leftStickButton; + mapper[gamepad_d.RightStickPress] = ipGamepad.rightStickButton; + mapper[gamepad_d.LeftStick] = ipGamepad.leftStick; + mapper[gamepad_d.RightStick] = ipGamepad.rightStick; + } else throw new System.NotImplementedException($"鍒濆鍖栬澶囧け璐,鏈疄鐜扮殑鐗╃悊鎸夐敭鏄犲皠 for {device_d.GetType()}"); } @@ -339,6 +351,6 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem m_deviceMapper.Remove(keyboard_d); } } - } + #endif \ No newline at end of file diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFile.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFile.cs index f9fe714e..6e55d328 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFile.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFile.cs @@ -52,7 +52,7 @@ namespace AxibugEmuOnline.Client } } - public SimpleFSM.State GetState() + public SimpleFSM.State GetCurrentState() { return FSM.CurrentState; } @@ -63,7 +63,7 @@ namespace AxibugEmuOnline.Client /// 瀛樻。椤哄簭鍙,鐢ㄤ簬鍒ゆ柇浜戝瓨妗e拰鏈湴瀛樻。鐨勫悓姝ョ姸鎬,鏄惁瀛樺湪鍐茬獊 public uint Sequecen { get; private set; } - SimpleFSM FSM; + public SimpleFSM FSM { get; private set; } byte[] m_savDataCaches; byte[] m_screenShotCaches; Header m_headerCache; @@ -79,8 +79,10 @@ namespace AxibugEmuOnline.Client FSM.AddState();//锛 FSM.AddState(); FSM.AddState(); + FSM.AddState(); FSM.AddState(); FSM.AddState(); + FSM.AddState(); FSM.OnStateChanged += FSM_OnStateChanged; IsEmpty = !AxiIO.File.Exists(FilePath); @@ -217,7 +219,7 @@ namespace AxibugEmuOnline.Client /// public void TrySync() { - if (FSM.CurrentState is not IdleState && FSM.CurrentState is not SyncedState) return; + if (FSM.CurrentState is not IdleState && FSM.CurrentState is not SyncedState && FSM.CurrentState is not SyncFailedState) return; FSM.ChangeState(); } @@ -234,6 +236,11 @@ namespace AxibugEmuOnline.Client SyncingFilesUtility.Remove(this); } + public override string ToString() + { + return $"{EmuPlatform}|{RomID}|{SlotIndex}"; + } + public static class SyncingFilesUtility { static SyncingFileRecord m_syncFiles = new SyncingFileRecord(); @@ -315,7 +322,6 @@ namespace AxibugEmuOnline.Client var jsonStr = JsonUtility.ToJson(temp); AxiPlayerPrefs.SetString("SYNCING_SAVE", jsonStr); } - } [Serializable] diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/CheckingState.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/CheckingState.cs index 747eff1d..49bc45d4 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/CheckingState.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/CheckingState.cs @@ -29,7 +29,8 @@ namespace AxibugEmuOnline.Client m_timeOut -= Time.deltaTime; if (m_timeOut < 0) //宸茶秴鏃 { - FSM.ChangeState(); + FSM.GetState().Error = "鎷夊彇浜戝瓨妗f暟鎹秴鏃"; + FSM.ChangeState(); } } @@ -44,7 +45,15 @@ namespace AxibugEmuOnline.Client } else { - FSM.ChangeState(); + if (Host.Sequecen > (uint)NetData.Sequence)//鏈湴搴忓垪鍙峰ぇ浜庝簯瀛樻。搴忓垪鍙凤紝瑙嗕负鍐茬獊 + { + FSM.GetState().NetData = NetData; + FSM.ChangeState(); + } + else + { + FSM.ChangeState(); + } } } } diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/ConflictState.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/ConflictState.cs index bda56747..1d510479 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/ConflictState.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/ConflictState.cs @@ -1,4 +1,5 @@ 锘縰sing AxibugEmuOnline.Client.Tools; +using AxibugProtobuf; namespace AxibugEmuOnline.Client { @@ -6,7 +7,7 @@ namespace AxibugEmuOnline.Client { public class ConflictState : SimpleFSM.State { - + public Protobuf_Mine_GameSavInfo NetData { get; set; } } } } \ No newline at end of file diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/DownloadingState.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/DownloadingState.cs index fa3c0924..1194c946 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/DownloadingState.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/DownloadingState.cs @@ -1,5 +1,6 @@ 锘縰sing AxibugEmuOnline.Client.ClientCore; using AxibugEmuOnline.Client.Tools; +using AxibugProtobuf; using System; namespace AxibugEmuOnline.Client @@ -14,14 +15,14 @@ namespace AxibugEmuOnline.Client public override void OnEnter(SimpleFSM.State preState) { - var checkState = preState as CheckingState; - - var netData = checkState.NetData; - - if (Host.Sequecen >= (uint)netData.Sequence) + Protobuf_Mine_GameSavInfo netData = null; + if (preState is CheckingState checkState) { - FSM.ChangeState(); - return; + netData = checkState.NetData; + } + else if (preState is ConflictState conflictState) //鐢卞啿绐佺姸鎬佽浆鎹负涓嬭浇鐘舵侊紝浠h〃浣跨敤缃戠粶瀛樻。瑕嗙洊鏈湴 + { + netData = conflictState.NetData; } m_sequece = (uint)netData.Sequence; @@ -42,7 +43,8 @@ namespace AxibugEmuOnline.Client if (m_downloadTask.downloadHandler.bHadErr) //涓嬭浇澶辫触 { - FSM.ChangeState(); + FSM.GetState().Error = m_downloadTask.downloadHandler.ErrInfo; + FSM.ChangeState(); return; } diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/SyncFailedState.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/SyncFailedState.cs new file mode 100644 index 00000000..85edfd09 --- /dev/null +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/SyncFailedState.cs @@ -0,0 +1,18 @@ +锘縰sing AxibugEmuOnline.Client.ClientCore; +using AxibugEmuOnline.Client.Tools; + +namespace AxibugEmuOnline.Client +{ + public partial class SaveFile + { + public class SyncFailedState : SimpleFSM.State + { + public string Error { get; set; } + + public override void OnEnter(SimpleFSM.State preState) + { + App.log.Error($"鍚屾澶辫触:{Error}"); + } + } + } +} \ No newline at end of file diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/SyncFailedState.cs.meta b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/SyncFailedState.cs.meta new file mode 100644 index 00000000..11efab87 --- /dev/null +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFileSyncStates/SyncFailedState.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 36be8767f260af04ba9ed88d2d4cd775 \ No newline at end of file diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SimpleSFM.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SimpleSFM.cs index fbc21f5b..b33efc73 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SimpleSFM.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Manager/SaveSlotManager/SimpleSFM.cs @@ -7,7 +7,10 @@ namespace AxibugEmuOnline.Client.Tools public partial class SimpleFSM { public event Action OnStateChanged; + private Dictionary m_states = new Dictionary(); + private bool isInTransition = false; // 鏂板锛氭爣璇嗘槸鍚﹀浜庡垏鎹㈣繃绋嬩腑 + private Queue pendingStateQueue = new Queue(); // 鏂板锛氬欢杩熻姹傜殑闃熷垪 public HOST Host { get; private set; } @@ -16,15 +19,15 @@ namespace AxibugEmuOnline.Client.Tools Host = host; } - private State m_current; + private State m_currentState; public State CurrentState { - get => m_current; + get => m_currentState; set { - if (m_current == value) return; + if (m_currentState == value) return; - m_current = value; + m_currentState = value; OnStateChanged?.Invoke(); } } @@ -40,44 +43,59 @@ namespace AxibugEmuOnline.Client.Tools return (T)state; } - public void BackToLast() - { - if (m_current == null) return; - if (m_current.LastState == null) return; - - if (m_states.Values.FirstOrDefault(s => s == m_current.LastState) is State lastState) - { - m_current.LastState = null; - m_current.OnExit(lastState); - - lastState.OnEnter(m_current); - m_current = lastState; - } - } - - public void Stop() - { - if (m_current != null) - { - m_current.OnExit(null); - m_current = null; - } - - foreach (var state in m_states.Values) - state.LastState = null; - } - + public void ChangeState() where T : State, new() { var stateType = typeof(T); - m_states.TryGetValue(stateType, out State nextState); + if (!m_states.ContainsKey(stateType)) + return; + // 濡傛灉澶勪簬鍒囨崲涓紝鍔犲叆闃熷垪绛夊緟鍚庣画澶勭悊 + if (isInTransition) + { + pendingStateQueue.Enqueue(stateType); + return; + } + + // 鏍囪寮濮嬪垏鎹 + isInTransition = true; + InternalChangeState(stateType); + isInTransition = false; // 鍒囨崲缁撴潫 + + // 澶勭悊闃熷垪涓Н绱殑鍒囨崲璇锋眰 + ProcessPendingQueue(); + } + + // 鏂板锛氬疄闄呮墽琛岀姸鎬佸垏鎹㈢殑鏂规硶 + private void InternalChangeState(Type stateType) + { + State nextState = m_states[stateType]; if (nextState == null) return; - if (m_current != null) m_current.OnExit(nextState); - nextState.LastState = m_current; - nextState.OnEnter(m_current); - m_current = nextState; + State preState = CurrentState; + // 閫鍑哄綋鍓嶇姸鎬 + if (preState != null) preState.OnExit(nextState); + + // 鏇存柊褰撳墠鐘舵 + CurrentState = nextState; + CurrentState.LastState = preState; + + // 杩涘叆鏂扮姸鎬 + CurrentState.OnEnter(preState); + } + + // 鏂板锛氬鐞嗛槦鍒椾腑鐨勫垏鎹㈣姹 + private void ProcessPendingQueue() + { + while (pendingStateQueue.Count > 0) + { + Type nextType = pendingStateQueue.Dequeue(); + if (!m_states.ContainsKey(nextType)) continue; + + isInTransition = true; + InternalChangeState(nextType); + isInTransition = false; + } } public T GetState() where T : State, new() @@ -88,11 +106,11 @@ namespace AxibugEmuOnline.Client.Tools public void Update() { - m_current?.OnUpdate(); + CurrentState?.OnUpdate(); foreach (var state in m_states.Values) { - if (state == m_current) continue; - state.AnyStateUpdate(m_current); + if (state == CurrentState) continue; + state.AnyStateUpdate(CurrentState); } } diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Switch/SwitchCommon.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Switch/SwitchCommon.cs index e28f5ee2..d0d6e381 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Switch/SwitchCommon.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/Switch/SwitchCommon.cs @@ -1,9 +1,11 @@ 锘縰sing AxibugEmuOnline.Client; +using AxibugEmuOnline.Client.ClientCore; using UnityEngine; public class SwitchCommon : MonoBehaviour { void Start() { + Debug.Log("SwitchCommon Start"); TickLoop.LoopAction_15s += ApplyCommit; } diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateMenu.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateMenu.cs index 2494aeb1..e235e0eb 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateMenu.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateMenu.cs @@ -33,17 +33,23 @@ namespace AxibugEmuOnline.Client public override Type MenuUITemplateType => typeof(OptionUI_SavSlotItem); public SaveFile SavFile { get; private set; } - List m_subOptions = new List(); public override string Name => SavFile.AutoSave ? "鑷姩瀛樻。" : $"瀛樻。{SavFile.SlotIndex}"; + SaveMenuItem saveMENU; + LoadMenuItem loadMENU; + RetryMenuItem retryMENU; + UseLocalSaveMenuItem useLocalMENU; + UseRemoteSaveMenuItem useRemoteMENU; + public SaveSlotMenu(InGameUI inGameui, SaveFile savFile) { SavFile = savFile; - //闈炶嚜鍔ㄥ瓨妗,澧炲姞淇濆瓨閫夐」 - if (!savFile.AutoSave) m_subOptions.Add(new SaveMenuItem(inGameui, savFile)); - //娣诲姞璇诲彇閫夐」 - m_subOptions.Add(new LoadMenuItem(inGameui, savFile)); + saveMENU = new SaveMenuItem(inGameui, savFile); + loadMENU = new LoadMenuItem(inGameui, savFile); + retryMENU = new RetryMenuItem(inGameui, savFile); + useLocalMENU = new UseLocalSaveMenuItem(inGameui, savFile); + useRemoteMENU = new UseRemoteSaveMenuItem(inGameui, savFile); } public override void OnShow(OptionUI_MenuItem ui) @@ -55,7 +61,21 @@ namespace AxibugEmuOnline.Client protected override List GetOptionMenus() { - return m_subOptions; + var menus = new List(); + + if (SavFile.GetCurrentState() is SaveFile.ConflictState) + { + menus.Add(useRemoteMENU); + menus.Add(useLocalMENU); + } + else + { + if (SavFile.GetCurrentState() is SaveFile.SyncFailedState) menus.Add(retryMENU); + if (!SavFile.AutoSave) menus.Add(saveMENU); + if (!SavFile.IsEmpty) menus.Add(loadMENU); + } + + return menus; } public class SaveMenuItem : ExecuteMenu @@ -111,6 +131,66 @@ namespace AxibugEmuOnline.Client OverlayManager.HideSideBar(); } } + + public class RetryMenuItem : ExecuteMenu + { + SaveFile m_savFile; + InGameUI m_ingameUI; + public override string Name => "閲嶈瘯"; + public override bool Visible => m_savFile.GetCurrentState() is SaveFile.SyncFailedState; + + public RetryMenuItem(InGameUI inGameui, SaveFile savFile) + { + m_ingameUI = inGameui; + m_savFile = savFile; + } + + public override void OnExcute(OptionUI optionUI, ref bool cancelHide) + { + cancelHide = true; + m_savFile.TrySync(); + } + } + + public class UseRemoteSaveMenuItem : ExecuteMenu + { + SaveFile m_savFile; + InGameUI m_ingameUI; + public override string Name => "浣跨敤浜戠瀛樻。"; + + public UseRemoteSaveMenuItem(InGameUI inGameui, SaveFile savFile) + { + m_ingameUI = inGameui; + m_savFile = savFile; + } + + public override void OnExcute(OptionUI optionUI, ref bool cancelHide) + { + if (m_savFile.GetCurrentState() is not SaveFile.ConflictState) return; + cancelHide = true; + m_savFile.FSM.ChangeState(); + } + } + + public class UseLocalSaveMenuItem : ExecuteMenu + { + SaveFile m_savFile; + InGameUI m_ingameUI; + public override string Name => "浣跨敤鏈湴瀛樻。"; + + public UseLocalSaveMenuItem(InGameUI inGameui, SaveFile savFile) + { + m_ingameUI = inGameui; + m_savFile = savFile; + } + + public override void OnExcute(OptionUI optionUI, ref bool cancelHide) + { + if (m_savFile.GetCurrentState() is not SaveFile.ConflictState) return; + cancelHide = true; + m_savFile.FSM.ChangeState(); + } + } } } } \ No newline at end of file diff --git a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/UI/OptionUI/OptionUI_SavSlotItem.cs b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/UI/OptionUI/OptionUI_SavSlotItem.cs index 50eafcac..8bbffddb 100644 --- a/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/UI/OptionUI/OptionUI_SavSlotItem.cs +++ b/AxibugEmuOnline.Client.Switch/Assets/Script/AppMain/UI/OptionUI/OptionUI_SavSlotItem.cs @@ -14,7 +14,10 @@ namespace AxibugEmuOnline.Client public Text UI_SavTime; public GameObject UI_Disconnect; - public GameObject UI_Syncing; + public GameObject UI_DownloadError; + public GameObject UI_Downloading; + public GameObject UI_Uploading; + public GameObject UI_Checking; public GameObject UI_Conflict; public GameObject UI_Synced; @@ -24,12 +27,13 @@ namespace AxibugEmuOnline.Client private void Awake() { - m_stateNodes[typeof(SaveFile.CheckingState)] = UI_Syncing; + m_stateNodes[typeof(SaveFile.CheckingState)] = UI_Checking; m_stateNodes[typeof(SaveFile.ConflictState)] = UI_Conflict; - m_stateNodes[typeof(SaveFile.DownloadingState)] = UI_Syncing; + m_stateNodes[typeof(SaveFile.DownloadingState)] = UI_Downloading; m_stateNodes[typeof(SaveFile.SyncedState)] = UI_Synced; - m_stateNodes[typeof(SaveFile.UploadingState)] = UI_Syncing; + m_stateNodes[typeof(SaveFile.UploadingState)] = UI_Uploading; m_stateNodes[typeof(SaveFile.CheckingNetworkState)] = UI_Disconnect; + m_stateNodes[typeof(SaveFile.SyncFailedState)] = UI_DownloadError; } protected override void OnSetData(InternalOptionMenu menuData) @@ -80,7 +84,7 @@ namespace AxibugEmuOnline.Client private void UpdateStateNode() { - var stateType = MenuData.SavFile.GetState().GetType(); + var stateType = MenuData.SavFile.GetCurrentState().GetType(); foreach (var item in m_stateNodes) {