| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Xml;
- using UnityEditor;
- using UnityEngine;
- #if YOO_ASSET_EXPERIMENT
- namespace YooAsset.Editor.Experiment
- {
- [InitializeOnLoad]
- public class RspGenerator
- {
- // csc.rsp文件路径
- private static string RspFilePath => Path.Combine(Application.dataPath, "csc.rsp");
- static RspGenerator()
- {
- UpdateRspFile(MacroDefine.Macros, null);
- }
- /// <summary>
- /// 更新csc.rsp文件
- /// </summary>
- private static void UpdateRspFile(List<string> addMacros, List<string> removeMacros)
- {
- var existingDefines = new HashSet<string>();
- var otherLines = new List<string>();
- // 1. 读取现有内容
- ReadRspFile(existingDefines, otherLines);
- // 2. 添加新宏
- if (addMacros != null && addMacros.Count > 0)
- {
- addMacros.ForEach(x =>
- {
- if (existingDefines.Contains(x) == false)
- existingDefines.Add(x);
- });
- }
- // 3. 移除指定宏
- if (removeMacros != null && removeMacros.Count > 0)
- {
- removeMacros.ForEach(x =>
- {
- existingDefines.Remove(x);
- });
- }
- // 4. 重新生成内容
- WriteRspFile(existingDefines, otherLines);
- // 5. 刷新AssetDatabase
- AssetDatabase.Refresh();
- EditorUtility.RequestScriptReload();
- }
- /// <summary>
- /// 读取csc.rsp文件,返回宏定义和其他行
- /// </summary>
- private static void ReadRspFile(HashSet<string> defines, List<string> others)
- {
- if (defines == null)
- defines = new HashSet<string>();
- if (others == null)
- others = new List<string>();
- 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);
- }
- }
- }
- /// <summary>
- /// 重新写入csc.rsp文件
- /// </summary>
- private static void WriteRspFile(HashSet<string> defines, List<string> 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());
- }
- }
- }
- #endif
|