From 019766b2c02cabe861e7d3d3bd3edae41779fff0 Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Thu, 13 Mar 2025 15:48:29 +0800 Subject: [PATCH] add DefineUtility --- src/DebugUtils/DefinesUtility.cs | 51 ++++++++++++++++++ src/DebugUtils/DefinesUtility.cs.meta | 11 ++++ src/DebugUtils/Editor/SettingsEditor.cs | 70 +++++-------------------- 3 files changed, 75 insertions(+), 57 deletions(-) create mode 100644 src/DebugUtils/DefinesUtility.cs create mode 100644 src/DebugUtils/DefinesUtility.cs.meta diff --git a/src/DebugUtils/DefinesUtility.cs b/src/DebugUtils/DefinesUtility.cs new file mode 100644 index 0000000..227df24 --- /dev/null +++ b/src/DebugUtils/DefinesUtility.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEditor; + +namespace DCFApixels.DragonECS.Unity.Internal +{ + internal static class DefinesUtility + { + public static Symbols[] LoadDefines(Type defineConstsType) + { + const BindingFlags REFL_FLAGS = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; + var fields = defineConstsType.GetFields(REFL_FLAGS); + return fields.Where(o => o.FieldType == typeof(bool)).Select(o => new Symbols(o.Name, (bool)o.GetValue(null))).ToArray(); + } + + public static void ApplyDefines(IEnumerable defines) + { + BuildTargetGroup group = EditorUserBuildSettings.selectedBuildTargetGroup; +#if UNITY_6000_0_OR_NEWER + string symbolsString = PlayerSettings.GetScriptingDefineSymbols(NamedBuildTarget.FromBuildTargetGroup(group)); +#else + string symbolsString = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone); +#endif + + foreach (var define in defines) + { + symbolsString = symbolsString.Replace(define.Name, ""); + } + + symbolsString += ";" + string.Join(';', defines.Where(o => o.flag).Select(o => o.Name)); +#if UNITY_6000_0_OR_NEWER + PlayerSettings.SetScriptingDefineSymbols(NamedBuildTarget.FromBuildTargetGroup(group), symbolsString); +#else + PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone, symbolsString); +#endif + } + + public class Symbols + { + public readonly string Name; + public bool flag; + public Symbols(string name, bool flag) + { + Name = name; + this.flag = flag; + } + } + } +} diff --git a/src/DebugUtils/DefinesUtility.cs.meta b/src/DebugUtils/DefinesUtility.cs.meta new file mode 100644 index 0000000..236195c --- /dev/null +++ b/src/DebugUtils/DefinesUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 488a62edebd480247b8eab1f153c237d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/DebugUtils/Editor/SettingsEditor.cs b/src/DebugUtils/Editor/SettingsEditor.cs index 4511f44..e50c171 100644 --- a/src/DebugUtils/Editor/SettingsEditor.cs +++ b/src/DebugUtils/Editor/SettingsEditor.cs @@ -1,8 +1,8 @@ #if UNITY_EDITOR +using DCFApixels.DragonECS.Unity.Internal; +using System.Collections.Generic; using System.Linq; -using System.Reflection; using UnityEditor; -using UnityEditor.Build; using UnityEngine; namespace DCFApixels.DragonECS.Unity.Editors @@ -17,22 +17,12 @@ namespace DCFApixels.DragonECS.Unity.Editors wnd.Show(); } - private DefineSymbolsInfo[] _defineSymbols = null; + private IEnumerable _defineSymbols = null; private void InitDefines() { - string symbolsString = PlayerSettings.GetScriptingDefineSymbols(NamedBuildTarget.Standalone);//TODO - _defineSymbols = - typeof(EcsDefines).GetFields(BindingFlags.Static | BindingFlags.Public).Select(o => new DefineSymbolsInfo(o.Name, false)) - .Concat(typeof(EcsUnityDefines).GetFields(BindingFlags.Static | BindingFlags.Public).Select(o => new DefineSymbolsInfo(o.Name, false))) - .ToArray(); - for (int i = 0; i < _defineSymbols.Length; i++) - { - var symbol = _defineSymbols[i]; - if (symbolsString.Contains(symbol.name)) - { - symbol.isOn = true; - } - } + if (_defineSymbols != null) { return; } + _defineSymbols = DefinesUtility.LoadDefines(typeof(EcsDefines)); + _defineSymbols = _defineSymbols.Concat(DefinesUtility.LoadDefines(typeof(EcsUnityDefines))); } private void OnGUI() { @@ -88,59 +78,25 @@ namespace DCFApixels.DragonECS.Unity.Editors rect = GUILayoutUtility.GetLastRect(); rect.xMin += 9f; GUI.Label(rect, "Scripting Define Symbols", EditorStyles.whiteLargeLabel); - if (_defineSymbols == null) - { - InitDefines(); - } + + InitDefines(); + EditorGUI.BeginChangeCheck(); - for (int i = 0; i < _defineSymbols.Length; i++) + foreach (var symbol in _defineSymbols) { - GUILayout.BeginHorizontal(); - var symbol = _defineSymbols[i]; - - string text = symbol.name == "DEBUG" ? symbol.name + " (Build Only)" : symbol.name; - symbol.isOn = EditorGUILayout.ToggleLeft(text, symbol.isOn); - - GUILayout.EndHorizontal(); + symbol.flag = EditorGUILayout.ToggleLeft(symbol.Name, symbol.flag); } + if (EditorGUI.EndChangeCheck()) { } if (GUILayout.Button("Apply")) { - BuildTargetGroup group = EditorUserBuildSettings.selectedBuildTargetGroup; -#if UNITY_6000_0_OR_NEWER - string symbolsString = PlayerSettings.GetScriptingDefineSymbols(NamedBuildTarget.FromBuildTargetGroup(group)); - for (int i = 0; i < _defineSymbols.Length; i++) - { - symbolsString = symbolsString.Replace(_defineSymbols[i].name, ""); - } - symbolsString += ";" + string.Join(';', _defineSymbols.Where(o => o.isOn).Select(o => o.name)); - PlayerSettings.SetScriptingDefineSymbols(NamedBuildTarget.FromBuildTargetGroup(group), symbolsString); -#else - string symbolsString = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone); - for (int i = 0; i < _defineSymbols.Length; i++) - { - symbolsString = symbolsString.Replace(_defineSymbols[i].name, ""); - } - symbolsString += ";" + string.Join(';', _defineSymbols.Where(o => o.isOn).Select(o => o.name)); - PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone, symbolsString); -#endif + DefinesUtility.ApplyDefines(_defineSymbols); InitDefines(); } GUILayout.EndVertical(); EditorGUIUtility.labelWidth = labelWidth; } - private class DefineSymbolsInfo - { - public string name; - public bool isOn; - public DefineSymbolsInfo(string name, bool isOn) - { - this.name = name; - this.isOn = isOn; - } - public static implicit operator DefineSymbolsInfo(string a) => new DefineSymbolsInfo(a, false); - } } } #endif \ No newline at end of file