Просмотр исходного кода

根据当前的目标平台自动选择打包平台; (#191)

存储打包设置
添加清理文件夹选项
添加切换平台提醒
Hsiung 5 лет назад
Родитель
Сommit
a9b44b68ec

+ 88 - 10
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<string> ParentPaths = new List<string>();
 	}
@@ -30,27 +31,76 @@ namespace ET
 
 	public class BuildEditor : EditorWindow
 	{
-		private readonly Dictionary<string, BundleInfo> dictionary = new Dictionary<string, BundleInfo>();
+        private const string settingAsset = "Assets/Editor/BuildEditor/ETBuildSettings.asset";
 
+        private readonly Dictionary<string, BundleInfo> dictionary = new Dictionary<string, BundleInfo>();
+
+		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<BuildEditor>(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<ETBuildSettings>(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();
+        }
 	}
 }

+ 108 - 102
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);
+            }
+        }
+    }
 }

+ 19 - 0
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

+ 8 - 0
Unity/Assets/Editor/BuildEditor/ETBuildSettings.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8a464fff3e6f5a546bb453ecf8cad8ec
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 14 - 0
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;
+    }
+}

+ 11 - 0
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: