BuildHelper.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using System.IO;
  2. using Model;
  3. using UnityEditor;
  4. namespace MyEditor
  5. {
  6. public static class BuildHelper
  7. {
  8. private const string relativeDirPrefix = "../Release";
  9. public static string BuildFolder = "../Release/{0}/StreamingAssets/";
  10. [MenuItem("Tools/编译Hotfix")]
  11. public static void BuildHotfix()
  12. {
  13. System.Diagnostics.Process process = new System.Diagnostics.Process();
  14. string unityDir = System.Environment.GetEnvironmentVariable("Unity");
  15. if (string.IsNullOrEmpty(unityDir))
  16. {
  17. Log.Error("没有设置Unity环境变量!");
  18. return;
  19. }
  20. process.StartInfo.FileName = $@"{unityDir}\Editor\Data\MonoBleedingEdge\bin\mono.exe";
  21. process.StartInfo.Arguments = $@"{unityDir}\Editor\Data\MonoBleedingEdge\lib\mono\xbuild\14.0\bin\xbuild.exe .\Hotfix\Unity.Hotfix.csproj";
  22. process.StartInfo.UseShellExecute = false;
  23. process.StartInfo.WorkingDirectory = @".\";
  24. process.StartInfo.RedirectStandardOutput = true;
  25. process.StartInfo.RedirectStandardError = true;
  26. process.Start();
  27. string info = process.StandardOutput.ReadToEnd();
  28. process.WaitForExit();
  29. process.Close();
  30. Log.Info(info);
  31. }
  32. [MenuItem("Tools/Web资源服务器")]
  33. public static void OpenFileServer()
  34. {
  35. string currentDir = System.Environment.CurrentDirectory;
  36. string path = Path.Combine(currentDir, @"..\FileServer\");
  37. System.Diagnostics.Process process = new System.Diagnostics.Process();
  38. process.StartInfo.FileName = "FileServer.exe";
  39. process.StartInfo.WorkingDirectory = path;
  40. process.StartInfo.CreateNoWindow = true;
  41. process.Start();
  42. }
  43. public static void Build(PlatformType type, BuildOptions options, bool isBuildExe)
  44. {
  45. BuildTarget buildTarget = BuildTarget.StandaloneWindows;
  46. string exeName = "ET";
  47. switch (type)
  48. {
  49. case PlatformType.PC:
  50. buildTarget = BuildTarget.StandaloneWindows;
  51. exeName += ".exe";
  52. break;
  53. case PlatformType.Android:
  54. buildTarget = BuildTarget.Android;
  55. exeName += ".apk";
  56. break;
  57. case PlatformType.IOS:
  58. buildTarget = BuildTarget.iOS;
  59. break;
  60. }
  61. string fold = string.Format(BuildFolder, type);
  62. if (!Directory.Exists(fold))
  63. {
  64. Directory.CreateDirectory(fold);
  65. }
  66. Log.Info("开始资源打包");
  67. BuildPipeline.BuildAssetBundles(fold, BuildAssetBundleOptions.None, buildTarget);
  68. GenerateVersionInfo(fold);
  69. Log.Info("完成资源打包");
  70. if (isBuildExe)
  71. {
  72. string[] levels = {
  73. "Assets/Scenes/Init.unity",
  74. };
  75. Log.Info("开始EXE打包");
  76. BuildPipeline.BuildPlayer(levels, $"{relativeDirPrefix}/{exeName}", buildTarget, options);
  77. Log.Info("完成exe打包");
  78. }
  79. }
  80. private static void GenerateVersionInfo(string dir)
  81. {
  82. VersionConfig versionProto = new VersionConfig();
  83. GenerateVersionProto(dir, versionProto, "");
  84. using (FileStream fileStream = new FileStream($"{dir}/Version.txt", FileMode.Create))
  85. {
  86. byte[] bytes = MongoHelper.ToJson(versionProto).ToByteArray();
  87. fileStream.Write(bytes, 0, bytes.Length);
  88. }
  89. }
  90. private static void GenerateVersionProto(string dir, VersionConfig versionProto, string relativePath)
  91. {
  92. foreach (string file in Directory.GetFiles(dir))
  93. {
  94. if (file.EndsWith(".manifest"))
  95. {
  96. continue;
  97. }
  98. string md5 = MD5Helper.FileMD5(file);
  99. FileInfo fi = new FileInfo(file);
  100. long size = fi.Length;
  101. string filePath = relativePath == "" ? fi.Name : $"{relativePath}/{fi.Name}";
  102. versionProto.FileVersionInfos.Add(new FileVersionInfo
  103. {
  104. File = filePath,
  105. MD5 = md5,
  106. Size = size,
  107. });
  108. }
  109. foreach (string directory in Directory.GetDirectories(dir))
  110. {
  111. DirectoryInfo dinfo = new DirectoryInfo(directory);
  112. string rel = relativePath == "" ? dinfo.Name : $"{relativePath}/{dinfo.Name}";
  113. GenerateVersionProto($"{dir}/{dinfo.Name}", versionProto, rel);
  114. }
  115. }
  116. }
  117. }