From a9b44b68ecc3c325be81f71217712e07266df58b Mon Sep 17 00:00:00 2001 From: Hsiung <848277602@qq.com> Date: Mon, 14 Sep 2020 22:01:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=BD=93=E5=89=8D=E7=9A=84?= =?UTF-8?q?=E7=9B=AE=E6=A0=87=E5=B9=B3=E5=8F=B0=E8=87=AA=E5=8A=A8=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E6=89=93=E5=8C=85=E5=B9=B3=E5=8F=B0;=20(#191)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 存储打包设置 添加清理文件夹选项 添加切换平台提醒 --- .../Assets/Editor/BuildEditor/BuildEditor.cs | 98 +++++++- .../Assets/Editor/BuildEditor/BuildHelper.cs | 210 +++++++++--------- .../Editor/BuildEditor/ETBuildSettings.asset | 19 ++ .../BuildEditor/ETBuildSettings.asset.meta | 8 + .../Editor/BuildEditor/ETBuildSettings.cs | 14 ++ .../BuildEditor/ETBuildSettings.cs.meta | 11 + 6 files changed, 248 insertions(+), 112 deletions(-) create mode 100644 Unity/Assets/Editor/BuildEditor/ETBuildSettings.asset create mode 100644 Unity/Assets/Editor/BuildEditor/ETBuildSettings.asset.meta create mode 100644 Unity/Assets/Editor/BuildEditor/ETBuildSettings.cs create mode 100644 Unity/Assets/Editor/BuildEditor/ETBuildSettings.cs.meta diff --git a/Unity/Assets/Editor/BuildEditor/BuildEditor.cs b/Unity/Assets/Editor/BuildEditor/BuildEditor.cs index fb83c7df..7b2f9d93 100644 --- a/Unity/Assets/Editor/BuildEditor/BuildEditor.cs +++ b/Unity/Assets/Editor/BuildEditor/BuildEditor.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; @@ -8,7 +9,7 @@ using Object = UnityEngine.Object; namespace ET { - public class BundleInfo + public class BundleInfo { public List ParentPaths = new List(); } @@ -30,27 +31,76 @@ namespace ET public class BuildEditor : EditorWindow { - private readonly Dictionary dictionary = new Dictionary(); + private const string settingAsset = "Assets/Editor/BuildEditor/ETBuildSettings.asset"; + private readonly Dictionary dictionary = new Dictionary(); + + private PlatformType activePlatform; private PlatformType platformType; + private bool clearFolder; private bool isBuildExe; private bool isContainAB; private BuildType buildType; - private BuildOptions buildOptions = BuildOptions.AllowDebugging | BuildOptions.Development; + private BuildOptions buildOptions; private BuildAssetBundleOptions buildAssetBundleOptions = BuildAssetBundleOptions.None; + private ETBuildSettings buildSettings; + [MenuItem("Tools/打包工具")] public static void ShowWindow() { - GetWindow(typeof(BuildEditor)); + EditorWindow window = GetWindow(true, "打包工具"); + window.minSize = new Vector2(420, 220); + window.maxSize = new Vector2(700, 400); } - private void OnGUI() + private void OnEnable() + { +#if UNITY_ANDROID + activePlatform = PlatformType.Android; +#elif UNITY_IOS + activePlatform = PlatformType.IOS; +#elif UNITY_STANDALONE_WIN + activePlatform = PlatformType.PC; +#elif UNITY_STANDALONE_OSX + activePlatform = PlatformType.MacOS; +#else + activePlatform = PlatformType.None; +#endif + platformType = activePlatform; + + if (!File.Exists(settingAsset)) + { + buildSettings = new ETBuildSettings(); + AssetDatabase.CreateAsset(buildSettings, settingAsset); + } + else + { + buildSettings = AssetDatabase.LoadAssetAtPath(settingAsset); + + clearFolder = buildSettings.clearFolder; + isBuildExe = buildSettings.isBuildExe; + isContainAB = buildSettings.isContainAB; + buildType = buildSettings.buildType; + buildAssetBundleOptions = buildSettings.buildAssetBundleOptions; + } + } + + private void OnDisable() + { + SaveSettings(); + } + + private void OnGUI() { + EditorGUILayout.LabelField("打包平台:"); this.platformType = (PlatformType)EditorGUILayout.EnumPopup(platformType); + this.clearFolder = EditorGUILayout.Toggle("清理资源文件夹: ", clearFolder); this.isBuildExe = EditorGUILayout.Toggle("是否打包EXE: ", this.isBuildExe); this.isContainAB = EditorGUILayout.Toggle("是否同将资源打进EXE: ", this.isContainAB); this.buildType = (BuildType)EditorGUILayout.EnumPopup("BuildType: ", this.buildType); + EditorGUILayout.LabelField("BuildAssetBundleOptions(可多选):"); + this.buildAssetBundleOptions = (BuildAssetBundleOptions)EditorGUILayout.EnumFlagsField(this.buildAssetBundleOptions); switch (buildType) { @@ -61,18 +111,46 @@ namespace ET this.buildOptions = BuildOptions.None; break; } - - this.buildAssetBundleOptions = (BuildAssetBundleOptions)EditorGUILayout.EnumFlagsField("BuildAssetBundleOptions(可多选): ", this.buildAssetBundleOptions); - if (GUILayout.Button("开始打包")) + GUILayout.Space(5); + + if (GUILayout.Button("开始打包", GUILayout.ExpandHeight(true))) { if (this.platformType == PlatformType.None) { - Log.Error("请选择打包平台!"); + ShowNotification(new GUIContent("请选择打包平台!")); return; } - BuildHelper.Build(this.platformType, this.buildAssetBundleOptions, this.buildOptions, this.isBuildExe, this.isContainAB); + if (platformType != activePlatform) + { + switch (EditorUtility.DisplayDialogComplex("警告!", $"当前目标平台为{activePlatform}, 如果切换到{platformType}, 可能需要较长加载时间", "切换", "取消", "不切换")) + { + case 0: + activePlatform = platformType; + break; + case 1: + return; + case 2: + platformType = activePlatform; + break; + } + } + BuildHelper.Build(this.platformType, this.buildAssetBundleOptions, this.buildOptions, this.isBuildExe, this.isContainAB, this.clearFolder); } + + GUILayout.Space(5); } + + private void SaveSettings() + { + buildSettings.clearFolder = clearFolder; + buildSettings.isBuildExe = isBuildExe; + buildSettings.isContainAB = isContainAB; + buildSettings.buildType = buildType; + buildSettings.buildAssetBundleOptions = buildAssetBundleOptions; + + EditorUtility.SetDirty(buildSettings); + AssetDatabase.SaveAssets(); + } } } diff --git a/Unity/Assets/Editor/BuildEditor/BuildHelper.cs b/Unity/Assets/Editor/BuildEditor/BuildHelper.cs index 39972bf9..e43fb5ce 100644 --- a/Unity/Assets/Editor/BuildEditor/BuildHelper.cs +++ b/Unity/Assets/Editor/BuildEditor/BuildHelper.cs @@ -4,106 +4,112 @@ using UnityEditor; namespace ET { - public static class BuildHelper - { - private const string relativeDirPrefix = "../Release"; - - public static string BuildFolder = "../Release/{0}/StreamingAssets/"; - - - [MenuItem("Tools/web资源服务器")] - public static void OpenFileServer() - { - ProcessHelper.Run("dotnet", "FileServer.dll", "../FileServer/"); - } - - public static void Build(PlatformType type, BuildAssetBundleOptions buildAssetBundleOptions, BuildOptions buildOptions, bool isBuildExe, bool isContainAB) - { - BuildTarget buildTarget = BuildTarget.StandaloneWindows; - string exeName = "ET"; - switch (type) - { - case PlatformType.PC: - buildTarget = BuildTarget.StandaloneWindows64; - exeName += ".exe"; - break; - case PlatformType.Android: - buildTarget = BuildTarget.Android; - exeName += ".apk"; - break; - case PlatformType.IOS: - buildTarget = BuildTarget.iOS; - break; - case PlatformType.MacOS: - buildTarget = BuildTarget.StandaloneOSX; - break; - } - - string fold = string.Format(BuildFolder, type); - if (!Directory.Exists(fold)) - { - Directory.CreateDirectory(fold); - } - - Log.Info("开始资源打包"); - BuildPipeline.BuildAssetBundles(fold, buildAssetBundleOptions, buildTarget); - - GenerateVersionInfo(fold); - Log.Info("完成资源打包"); - - if (isContainAB) - { - FileHelper.CleanDirectory("Assets/StreamingAssets/"); - FileHelper.CopyDirectory(fold, "Assets/StreamingAssets/"); - } - - if (isBuildExe) - { - AssetDatabase.Refresh(); - string[] levels = { - "Assets/Scenes/Init.unity", - }; - Log.Info("开始EXE打包"); - BuildPipeline.BuildPlayer(levels, $"{relativeDirPrefix}/{exeName}", buildTarget, buildOptions); - 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 = JsonHelper.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)) - { - string md5 = MD5Helper.FileMD5(file); - FileInfo fi = new FileInfo(file); - long size = fi.Length; - string filePath = relativePath == "" ? fi.Name : $"{relativePath}/{fi.Name}"; - - versionProto.FileInfoDict.Add(filePath, 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); - } - } - } + public static class BuildHelper + { + private const string relativeDirPrefix = "../Release"; + + public static string BuildFolder = "../Release/{0}/StreamingAssets/"; + + + [MenuItem("Tools/web资源服务器")] + public static void OpenFileServer() + { + ProcessHelper.Run("dotnet", "FileServer.dll", "../FileServer/"); + } + + public static void Build(PlatformType type, BuildAssetBundleOptions buildAssetBundleOptions, BuildOptions buildOptions, bool isBuildExe, bool isContainAB, bool clearFolder) + { + BuildTarget buildTarget = BuildTarget.StandaloneWindows; + string exeName = "ET"; + switch (type) + { + case PlatformType.PC: + buildTarget = BuildTarget.StandaloneWindows64; + exeName += ".exe"; + break; + case PlatformType.Android: + buildTarget = BuildTarget.Android; + exeName += ".apk"; + break; + case PlatformType.IOS: + buildTarget = BuildTarget.iOS; + break; + case PlatformType.MacOS: + buildTarget = BuildTarget.StandaloneOSX; + break; + } + + string fold = string.Format(BuildFolder, type); + + if (clearFolder && Directory.Exists(fold)) + { + Directory.Delete(fold, true); + Directory.CreateDirectory(fold); + } + else + { + Directory.CreateDirectory(fold); + } + + Log.Info("开始资源打包"); + BuildPipeline.BuildAssetBundles(fold, buildAssetBundleOptions, buildTarget); + + GenerateVersionInfo(fold); + Log.Info("完成资源打包"); + + if (isContainAB) + { + FileHelper.CleanDirectory("Assets/StreamingAssets/"); + FileHelper.CopyDirectory(fold, "Assets/StreamingAssets/"); + } + + if (isBuildExe) + { + AssetDatabase.Refresh(); + string[] levels = { + "Assets/Scenes/Init.unity", + }; + Log.Info("开始EXE打包"); + BuildPipeline.BuildPlayer(levels, $"{relativeDirPrefix}/{exeName}", buildTarget, buildOptions); + 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 = JsonHelper.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)) + { + string md5 = MD5Helper.FileMD5(file); + FileInfo fi = new FileInfo(file); + long size = fi.Length; + string filePath = relativePath == "" ? fi.Name : $"{relativePath}/{fi.Name}"; + + versionProto.FileInfoDict.Add(filePath, 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); + } + } + } } diff --git a/Unity/Assets/Editor/BuildEditor/ETBuildSettings.asset b/Unity/Assets/Editor/BuildEditor/ETBuildSettings.asset new file mode 100644 index 00000000..c21183e2 --- /dev/null +++ b/Unity/Assets/Editor/BuildEditor/ETBuildSettings.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 11500000, guid: b216745cd6e9bc94da5bdf9fe8aae6d1, type: 3} + m_Name: ETBuildSettings + m_EditorClassIdentifier: + clearFolder: 0 + isBuildExe: 0 + isContainAB: 0 + buildType: 1 + buildAssetBundleOptions: 0 diff --git a/Unity/Assets/Editor/BuildEditor/ETBuildSettings.asset.meta b/Unity/Assets/Editor/BuildEditor/ETBuildSettings.asset.meta new file mode 100644 index 00000000..6fb8c0e2 --- /dev/null +++ b/Unity/Assets/Editor/BuildEditor/ETBuildSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8a464fff3e6f5a546bb453ecf8cad8ec +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity/Assets/Editor/BuildEditor/ETBuildSettings.cs b/Unity/Assets/Editor/BuildEditor/ETBuildSettings.cs new file mode 100644 index 00000000..a2238915 --- /dev/null +++ b/Unity/Assets/Editor/BuildEditor/ETBuildSettings.cs @@ -0,0 +1,14 @@ +using UnityEditor; +using UnityEngine; + +namespace ET +{ + public class ETBuildSettings : ScriptableObject + { + public bool clearFolder = false; + public bool isBuildExe = false; + public bool isContainAB = false; + public BuildType buildType = BuildType.Release; + public BuildAssetBundleOptions buildAssetBundleOptions = BuildAssetBundleOptions.None; + } +} diff --git a/Unity/Assets/Editor/BuildEditor/ETBuildSettings.cs.meta b/Unity/Assets/Editor/BuildEditor/ETBuildSettings.cs.meta new file mode 100644 index 00000000..3f926c0d --- /dev/null +++ b/Unity/Assets/Editor/BuildEditor/ETBuildSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b216745cd6e9bc94da5bdf9fe8aae6d1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: -- GitLab