using System; using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine; namespace Amanotes.Core { internal partial class AmaDevSettings { [SerializeField] internal SymbolDefineConfig symbolDefine = new SymbolDefineConfig(); [Serializable] internal class SymbolDefineConfig { public List symbols = new List(); public void Read() { var enabledSymbols = CscRspFile.Parse(); AddSymbols(enabledSymbols, SymbolSource.Csc); SyncEnabled(enabledSymbols); ReadPlayerSettings(); } public void Write(List loggerTags) { var list = symbols .Where(item => item.enabled && item.source == SymbolSource.Csc) .Union(loggerTags ?? Enumerable.Empty()) .Where(item => item.enabled) .Select(item => item.name) .Distinct() .ToArray(); string content = list.Length > 0 ? $"-define:{string.Join(";", list)}" : string.Empty; System.IO.File.WriteAllText("Assets/csc.rsp", content); } internal HashSet ReadCscSymbols() => CscRspFile.Parse(); internal void ReadPlayerSettings() { var group = EditorUserBuildSettings.selectedBuildTargetGroup; if (group == BuildTargetGroup.Unknown) return; #if UNITY_2023_2_OR_NEWER var target = UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup(group); var defines = PlayerSettings.GetScriptingDefineSymbols(target); #else var defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(group); #endif if (string.IsNullOrEmpty(defines)) return; var parts = defines.Split(';'); var existing = new HashSet(); for (int i = 0; i < symbols.Count; i++) existing.Add(symbols[i].name); for (int i = 0; i < parts.Length; i++) { var s = parts[i].Trim(); if (s.Length == 0 || existing.Contains(s)) continue; symbols.Add(new SymbolInfo { name = s, enabled = true, source = SymbolSource.PlayerSettings }); existing.Add(s); } } internal void AddNewSymbol(string name) { for (int i = 0; i < symbols.Count; i++) if (symbols[i].name == name) return; symbols.Add(new SymbolInfo { name = name, enabled = true, source = SymbolSource.Csc }); } internal void RemoveSymbol(string name) { for (int i = symbols.Count - 1; i >= 0; i--) { if (symbols[i].name != name) continue; symbols.RemoveAt(i); return; } } private void SyncEnabled(HashSet enabledSymbols) { for (var i = 0; i < symbols.Count; i++) { if (symbols[i].source == SymbolSource.PlayerSettings) continue; symbols[i].enabled = enabledSymbols.Contains(symbols[i].name); } } private void AddSymbols(IEnumerable newSymbols, SymbolSource source) { var existing = new HashSet(); for (int i = 0; i < symbols.Count; i++) existing.Add(symbols[i].name); foreach (string symbol in newSymbols) { if (existing.Contains(symbol)) continue; symbols.Add(new SymbolInfo { name = symbol, enabled = true, source = source }); existing.Add(symbol); } } } internal enum SymbolSource { Csc, PlayerSettings } [Serializable] internal class SymbolInfo { public string name; public bool enabled; public SymbolSource source; } } }