using System; using System.Linq; using System.Reflection; using System.Text.RegularExpressions; namespace XGame.Editor.Build { internal static class BuildUtils { /// /// 回调函数必须是静态的 /// /// /// public static string CallbackToString(Action callback) { return $""; } public static string GetCommandLineArgs() { string[] args = Environment.GetCommandLineArgs(); int index = args.ToList().IndexOf("--args"); if (index >= args.Length) return string.Empty; string res = args[index + 1]; if (res[0] == '-' || res.IndexOf("--") == 0) return string.Empty; return res; } public static void CmdCompleted(BuildErrorCode code, BuildContext context) { BuildLog.Log($"CmdCompleted. Code:{code}"); if (code == BuildErrorCode.CmdCompleted) { var cmd = CmdFactory.Create(context); if (cmd != null) { // 还有Cmd接着执行 cmd.Start(); return; } else { //结束 code = BuildErrorCode.Succeeded; } } else { BuildLog.Warn($"Build Completed. Code:{code}"); } BuildCompleted(context.config.callback, code); BuildLog.Log($"context.config.editor.autoExit: {context.config.editor.autoExit}"); if (context.config.editor.autoExit) { ExitApplication(code); } } public static void BuildCompleted(string callback, BuildErrorCode code) { BuildLog.Log($"OnBuildCompleted. callback:{callback} code:{code}"); if (string.IsNullOrEmpty(callback) == false) { try { Regex regex = new Regex(@"", RegexOptions.Multiline); var match = regex.Match(callback); if (match.Success) { var typeName = match.Groups[1].Value; var methodName = match.Groups[2].Value; Type type = Type.GetType(typeName); var methodInfo = type.GetMethod(methodName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); methodInfo?.Invoke(null, new object[] { (int)code }); } } catch (Exception ex) { BuildLog.Exception(ex); } } } public static void ExitApplication(BuildErrorCode code) { UnityEditor.EditorApplication.Exit(ErrorCodeToInt(code)); } private static int ErrorCodeToInt(BuildErrorCode code) { switch (code) { case BuildErrorCode.Succeeded: return 0; case BuildErrorCode.Unknown: return 1; default: return (int)code; } } } }