using System.IO; using Model; using UnityEditor; namespace MyEditor { public static class BuildHelper { private const string relativeDirPrefix = "../Release"; public static string BuildFolder = "../Release/{0}/StreamingAssets/"; [MenuItem("Tools/编译Hotfix")] public static void BuildHotfix() { System.Diagnostics.Process process = new System.Diagnostics.Process(); string unityDir = System.Environment.GetEnvironmentVariable("Unity"); if (string.IsNullOrEmpty(unityDir)) { Log.Error("没有设置Unity环境变量!"); return; } process.StartInfo.FileName = $@"{unityDir}\Editor\Data\MonoBleedingEdge\bin\mono.exe"; process.StartInfo.Arguments = $@"{unityDir}\Editor\Data\MonoBleedingEdge\lib\mono\xbuild\14.0\bin\xbuild.exe .\Hotfix\Unity.Hotfix.csproj"; process.StartInfo.UseShellExecute = false; process.StartInfo.WorkingDirectory = @".\"; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; process.Start(); string info = process.StandardOutput.ReadToEnd(); process.WaitForExit(); process.Close(); Log.Info(info); } [MenuItem("Tools/Web资源服务器")] public static void OpenFileServer() { string currentDir = System.Environment.CurrentDirectory; string path = Path.Combine(currentDir, @"..\FileServer\"); System.Diagnostics.Process process = new System.Diagnostics.Process(); process.StartInfo.FileName = "FileServer.exe"; process.StartInfo.WorkingDirectory = path; process.StartInfo.CreateNoWindow = true; process.Start(); } public static void Build(PlatformType type, BuildOptions options, bool isBuildExe) { BuildTarget buildTarget = BuildTarget.StandaloneWindows; string exeName = "ET"; switch (type) { case PlatformType.PC: buildTarget = BuildTarget.StandaloneWindows; exeName += ".exe"; break; case PlatformType.Android: buildTarget = BuildTarget.Android; exeName += ".apk"; break; case PlatformType.IOS: buildTarget = BuildTarget.iOS; break; } string fold = string.Format(BuildFolder, type); if (!Directory.Exists(fold)) { Directory.CreateDirectory(fold); } Log.Info("开始资源打包"); BuildPipeline.BuildAssetBundles(fold, BuildAssetBundleOptions.None, buildTarget); GenerateVersionInfo(fold); Log.Info("完成资源打包"); if (isBuildExe) { string[] levels = { "Assets/Scenes/Init.unity", }; Log.Info("开始EXE打包"); BuildPipeline.BuildPlayer(levels, $"{relativeDirPrefix}/{exeName}", buildTarget, options); Log.Info("完成exe打包"); } } private static void GenerateVersionInfo(string dir) { VersionConfig versionProto = new VersionConfig(); GenerateVersionProto(dir, versionProto, ""); using (FileStream fileStream = new FileStream($"{dir}/Version.txt", FileMode.Create)) { byte[] bytes = MongoHelper.ToJson(versionProto).ToByteArray(); fileStream.Write(bytes, 0, bytes.Length); } } private static void GenerateVersionProto(string dir, VersionConfig versionProto, string relativePath) { foreach (string file in Directory.GetFiles(dir)) { if (file.EndsWith(".manifest")) { continue; } string md5 = MD5Helper.FileMD5(file); FileInfo fi = new FileInfo(file); long size = fi.Length; string filePath = relativePath == "" ? fi.Name : $"{relativePath}/{fi.Name}"; versionProto.FileVersionInfos.Add(new FileVersionInfo { File = filePath, MD5 = md5, Size = size, }); } foreach (string directory in Directory.GetDirectories(dir)) { DirectoryInfo dinfo = new DirectoryInfo(directory); string rel = relativePath == "" ? dinfo.Name : $"{relativePath}/{dinfo.Name}"; GenerateVersionProto($"{dir}/{dinfo.Name}", versionProto, rel); } } } }