未验证 提交 a9b44b68 编写于 作者: Hsiung's avatar Hsiung 提交者: GitHub

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

存储打包设置
添加清理文件夹选项
添加切换平台提醒
上级 33860994
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();
}
}
}
......@@ -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);
}
}
}
}
%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
fileFormatVersion: 2
guid: 8a464fff3e6f5a546bb453ecf8cad8ec
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:
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;
}
}
fileFormatVersion: 2
guid: b216745cd6e9bc94da5bdf9fe8aae6d1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册