diff --git a/UnityProject/Assets/TEngine/Editor/AtlasMakerEditor/AtlasConfiguration.cs b/UnityProject/Assets/TEngine/Editor/AtlasMakerEditor/AtlasConfiguration.cs index 04466208..9a612d0a 100644 --- a/UnityProject/Assets/TEngine/Editor/AtlasMakerEditor/AtlasConfiguration.cs +++ b/UnityProject/Assets/TEngine/Editor/AtlasMakerEditor/AtlasConfiguration.cs @@ -4,8 +4,8 @@ using UnityEngine; using UnityEditor; - [HybridCLR.Editor.Settings.FilePath("ProjectSettings/AtlasConfiguration.asset")] - public class AtlasConfiguration : HybridCLR.Editor.Settings.ScriptableSingleton + [FilePath("ProjectSettings/AtlasConfiguration.asset")] + public class AtlasConfiguration : EditorScriptableSingleton { [Header("目录设置")] [Tooltip("生成的图集输出目录")] diff --git a/UnityProject/Assets/TEngine/Editor/HybridCLR/BuildDLLCommand.cs b/UnityProject/Assets/TEngine/Editor/HybridCLR/BuildDLLCommand.cs index 7b6c33f0..32fbdae0 100644 --- a/UnityProject/Assets/TEngine/Editor/HybridCLR/BuildDLLCommand.cs +++ b/UnityProject/Assets/TEngine/Editor/HybridCLR/BuildDLLCommand.cs @@ -17,7 +17,9 @@ public static class BuildDLLCommand public static void Disable() { ScriptingDefineSymbols.RemoveScriptingDefineSymbol(EnableHybridClrScriptingDefineSymbol); +#if ENABLE_HYBRIDCLR HybridCLR.Editor.SettingsUtil.Enable = false; +#endif // SyncAssemblyContent.RefreshAssembly(); } @@ -29,7 +31,9 @@ public static class BuildDLLCommand { ScriptingDefineSymbols.RemoveScriptingDefineSymbol(EnableHybridClrScriptingDefineSymbol); ScriptingDefineSymbols.AddScriptingDefineSymbol(EnableHybridClrScriptingDefineSymbol); +#if ENABLE_HYBRIDCLR HybridCLR.Editor.SettingsUtil.Enable = true; +#endif // SyncAssemblyContent.RefreshAssembly(); } diff --git a/UnityProject/Assets/TEngine/Editor/Utility/EditorScriptableSingleton.cs b/UnityProject/Assets/TEngine/Editor/Utility/EditorScriptableSingleton.cs new file mode 100644 index 00000000..c85deb6c --- /dev/null +++ b/UnityProject/Assets/TEngine/Editor/Utility/EditorScriptableSingleton.cs @@ -0,0 +1,101 @@ +using System; +using System.IO; +using System.Linq; +using UnityEditorInternal; +using UnityEngine; + +namespace TEngine.Editor +{ + public class EditorScriptableSingleton : ScriptableObject where T : ScriptableObject + { + private static T _instance; + + public static T Instance + { + get + { + if (!_instance) + { + LoadOrCreate(); + } + + return _instance; + } + } + + public static T LoadOrCreate() + { + string filePath = GetFilePath(); + if (!string.IsNullOrEmpty(filePath)) + { + var arr = InternalEditorUtility.LoadSerializedFileAndForget(filePath); + _instance = arr.Length > 0 ? arr[0] as T : _instance ?? CreateInstance(); + } + else + { + Debug.LogError($"save location of {nameof(EditorScriptableSingleton)} is invalid"); + } + + return _instance; + } + + public static void Save(bool saveAsText = true) + { + if (!_instance) + { + Debug.LogError("Cannot save ScriptableSingleton: no instance!"); + return; + } + + string filePath = GetFilePath(); + if (!string.IsNullOrEmpty(filePath)) + { + string directoryName = Path.GetDirectoryName(filePath); + if (!Directory.Exists(directoryName)) + { + if (directoryName != null) + { + Directory.CreateDirectory(directoryName); + } + } + + UnityEngine.Object[] obj = { _instance }; + InternalEditorUtility.SaveToSerializedFileAndForget(obj, filePath, saveAsText); + } + } + + protected static string GetFilePath() + { + return typeof(T).GetCustomAttributes(inherit: true) + .Where(v => v is FilePathAttribute) + .Cast() + .FirstOrDefault() + ?.Filepath; + } + } + + [AttributeUsage(AttributeTargets.Class)] + public class FilePathAttribute : Attribute + { + internal readonly string Filepath; + + /// + /// 单例存放路径。 + /// + /// 相对 Project 路径。 + public FilePathAttribute(string path) + { + if (string.IsNullOrEmpty(path)) + { + throw new ArgumentException("Invalid relative path (it is empty)"); + } + + if (path[0] == '/') + { + path = path.Substring(1); + } + + Filepath = path; + } + } +} \ No newline at end of file diff --git a/UnityProject/Assets/TEngine/Editor/Utility/EditorScriptableSingleton.cs.meta b/UnityProject/Assets/TEngine/Editor/Utility/EditorScriptableSingleton.cs.meta new file mode 100644 index 00000000..c99d229c --- /dev/null +++ b/UnityProject/Assets/TEngine/Editor/Utility/EditorScriptableSingleton.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bec53acfb41d41a29b3664015d318e39 +timeCreated: 1742523496 \ No newline at end of file diff --git a/UnityProject/Assets/TEngine/Editor/Utility/UpdateSettingEditor.cs b/UnityProject/Assets/TEngine/Editor/Utility/UpdateSettingEditor.cs index 446ecbcf..6072c7dc 100644 --- a/UnityProject/Assets/TEngine/Editor/Utility/UpdateSettingEditor.cs +++ b/UnityProject/Assets/TEngine/Editor/Utility/UpdateSettingEditor.cs @@ -1,8 +1,9 @@ +#if ENABLE_HYBRIDCLR using System.Collections.Generic; using System.Linq; -using HybridCLR.Editor.Settings; using UnityEditor; using UnityEngine; +using HybridCLR.Editor.Settings; namespace TEngine.Editor { @@ -68,4 +69,5 @@ namespace TEngine.Editor } } } -} \ No newline at end of file +} +#endif \ No newline at end of file