diff --git a/.gitignore b/.gitignore index b38cfe63..9764a0ca 100644 --- a/.gitignore +++ b/.gitignore @@ -72,4 +72,6 @@ sysinfo.txt # Crashlytics generated file crashlytics-build.properties -*.vsconfig \ No newline at end of file +*.vsconfig +Assets/csc.rsp +Assets/csc.rsp.meta diff --git a/Assets/YooAsset/Editor/Assembly/MacrosProcessor.cs b/Assets/YooAsset/Editor/Assembly/MacrosProcessor.cs index 3ad49de6..17e24a28 100644 --- a/Assets/YooAsset/Editor/Assembly/MacrosProcessor.cs +++ b/Assets/YooAsset/Editor/Assembly/MacrosProcessor.cs @@ -1,18 +1,20 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text; using System.Xml; using UnityEditor; +using UnityEditor.PackageManager; +using UnityEngine; +using static UnityEditor.PlayerSettings; namespace YooAsset.Editor { [InitializeOnLoad] public class MacrosProcessor : AssetPostprocessor { - static MacrosProcessor() - { - } - + // csc.rsp 文件路径 + private static string RspFilePath => Path.Combine(Application.dataPath, "csc.rsp"); /// /// YooAsset版本宏定义 /// @@ -23,6 +25,12 @@ namespace YooAsset.Editor "YOO_ASSET_2_3_OR_NEWER", }; + static MacrosProcessor() + { + //添加到全局宏定义 + UpdateRspFile(YooAssetMacros); + } + static string OnGeneratedCSProject(string path, string content) { XmlDocument xmlDoc = new XmlDocument(); @@ -105,5 +113,102 @@ namespace YooAsset.Editor return false; } + /// + /// 更新csc.rsp文件 + /// + /// + /// + private static void UpdateRspFile(List macrosToAdd = null, List macrosToRemove = null) + { + HashSet existingDefines = new HashSet(); + List otherLines = new List(); + // 1. 读取现有内容 + ReadRspFile(ref existingDefines, ref otherLines); + // 2. 添加新宏 + if (macrosToAdd != null && macrosToAdd.Count > 0) + { + macrosToAdd.ForEach(x => + { + if (existingDefines.Contains(x) == false) + existingDefines.Add(x); + }); + } + // 3. 移除指定宏 + if (macrosToRemove != null && macrosToRemove.Count > 0) + { + macrosToRemove.ForEach(x => + { + existingDefines.Remove(x); + }); + } + // 4. 重新生成内容 + WriteRspFile(existingDefines, otherLines); + // 5. 刷新AssetDatabase + AssetDatabase.Refresh(); + EditorUtility.RequestScriptReload(); + } + /// + /// 读取csc.rsp文件,返回宏定义和其他行 + /// + /// + /// + private static void ReadRspFile(ref HashSet defines, ref List others) + { + if (defines == null) + { + defines = new HashSet(); + } + + if (others == null) + { + others = new List(); + } + + if (File.Exists(RspFilePath) == false) + { + return; + } + + foreach (string line in File.ReadAllLines(RspFilePath)) + { + if (line.StartsWith("-define:")) + { + string[] parts = line.Split(new[] { ':' }, 2); + if (parts.Length == 2) + { + defines.Add(parts[1].Trim()); + } + } + else + { + others.Add(line); + } + } + } + /// + /// 重写入出csc.rsp文件 + /// + /// + /// + private static void WriteRspFile(HashSet defines, List others) + { + + StringBuilder sb = new StringBuilder(); + if (others != null && others.Count > 0) + { + others.ForEach(o => sb.AppendLine(o)); + } + + if (defines != null && defines.Count > 0) + { + foreach (string define in defines) + { + sb.AppendLine($"-define:{define}"); + } + } + + File.WriteAllText(RspFilePath, sb.ToString()); + } + } }