2025-04-21 21:14:23 +08:00

249 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Linq;
using UnityEditor;
using UnityEditor.Build.Reporting;
using UnityEngine;
using YooAsset;
using YooAsset.Editor;
using BuildResult = UnityEditor.Build.Reporting.BuildResult;
namespace TEngine
{
/// <summary>
/// 打包工具类。
/// <remarks>通过CommandLineReader可以不前台开启Unity实现静默打包以及CLI工作流详见CommandLineReader.cs example1</remarks>
/// </summary>
public static class ReleaseTools
{
public static void BuildDll()
{
string platform = CommandLineReader.GetCustomArgument("platform");
if (string.IsNullOrEmpty(platform))
{
Debug.LogError($"Build Asset Bundle Errorplatform is null");
return;
}
BuildTarget target = GetBuildTarget(platform);
// BuildDLLCommand.BuildAndCopyDlls(target);
}
public static void BuildAssetBundle()
{
string outputRoot = CommandLineReader.GetCustomArgument("outputRoot");
if (string.IsNullOrEmpty(outputRoot))
{
Debug.LogError($"Build Asset Bundle ErroroutputRoot is null");
return;
}
string packageVersion = CommandLineReader.GetCustomArgument("packageVersion");
if (string.IsNullOrEmpty(packageVersion))
{
Debug.LogError($"Build Asset Bundle ErrorpackageVersion is null");
return;
}
string platform = CommandLineReader.GetCustomArgument("platform");
if (string.IsNullOrEmpty(platform))
{
Debug.LogError($"Build Asset Bundle Errorplatform is null");
return;
}
BuildTarget target = GetBuildTarget(platform);
BuildInternal(target, outputRoot);
Debug.LogWarning($"Start BuildPackage BuildTarget:{target} outputPath:{outputRoot}");
}
[MenuItem("TEngine/Build/一键打包AssetBundle")]
public static void BuildCurrentPlatformAB()
{
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
BuildInternal(target, Application.dataPath + "/../Builds/", packageVersion: GetBuildPackageVersion());
AssetDatabase.Refresh();
}
private static BuildTarget GetBuildTarget(string platform)
{
BuildTarget target = BuildTarget.NoTarget;
switch (platform)
{
case "Android":
target = BuildTarget.Android;
break;
case "IOS":
target = BuildTarget.iOS;
break;
case "Windows":
target = BuildTarget.StandaloneWindows64;
break;
case "MacOS":
target = BuildTarget.StandaloneOSX;
break;
case "Linux":
target = BuildTarget.StandaloneLinux64;
break;
case "WebGL":
target = BuildTarget.WebGL;
break;
case "Switch":
target = BuildTarget.Switch;
break;
case "PS4":
target = BuildTarget.PS4;
break;
case "PS5":
target = BuildTarget.PS5;
break;
}
return target;
}
private static void BuildInternal(BuildTarget buildTarget, string outputRoot, string packageVersion = "1.0",
EBuildPipeline buildPipeline = EBuildPipeline.ScriptableBuildPipeline)
{
Debug.Log($"开始构建 : {buildTarget}");
IBuildPipeline pipeline = null;
BuildParameters buildParameters = null;
if (buildPipeline == EBuildPipeline.BuiltinBuildPipeline)
{
// 构建参数
BuiltinBuildParameters builtinBuildParameters = new BuiltinBuildParameters();
// 执行构建
pipeline = new BuiltinBuildPipeline();
buildParameters = builtinBuildParameters;
builtinBuildParameters.CompressOption = ECompressOption.LZ4;
}
else
{
ScriptableBuildParameters scriptableBuildParameters = new ScriptableBuildParameters();
// 执行构建
pipeline = new ScriptableBuildPipeline();
buildParameters = scriptableBuildParameters;
scriptableBuildParameters.CompressOption = ECompressOption.LZ4;
}
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
buildParameters.BuildPipeline = buildPipeline.ToString();
buildParameters.BuildTarget = buildTarget;
buildParameters.BuildBundleType = (int)EBuildBundleType.AssetBundle;
buildParameters.PackageName = "DefaultPackage";
buildParameters.PackageVersion = packageVersion;
buildParameters.VerifyBuildingResult = true;
// 启用共享资源打包
buildParameters.EnableSharePackRule = true;
buildParameters.FileNameStyle = EFileNameStyle.BundleName_HashName;
buildParameters.BuildinFileCopyOption = EBuildinFileCopyOption.ClearAndCopyAll;
buildParameters.BuildinFileCopyParams = string.Empty;
buildParameters.EncryptionServices = CreateEncryptionInstance("DefaultPackage",buildPipeline);
buildParameters.ClearBuildCacheFiles = false; //不清理构建缓存,启用增量构建,可以提高打包速度!
buildParameters.UseAssetDependencyDB = true; //使用资源依赖关系数据库,可以提高打包速度!
var buildResult = pipeline.Run(buildParameters, true);
if (buildResult.Success)
{
Debug.Log($"构建成功 : {buildResult.OutputPackageDirectory}");
}
else
{
Debug.LogError($"构建失败 : {buildResult.ErrorInfo}");
}
}
/// <summary>
/// 创建加密类实例
/// </summary>
private static IEncryptionServices CreateEncryptionInstance(string packageName, EBuildPipeline buildPipeline)
{
var encryptionClassName = AssetBundleBuilderSetting.GetPackageEncyptionClassName(packageName, buildPipeline);
var encryptionClassTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices));
var classType = encryptionClassTypes.Find(x => x.FullName != null && x.FullName.Equals(encryptionClassName));
if (classType != null)
{
Debug.Log($"Use Encryption {classType}");
return (IEncryptionServices)Activator.CreateInstance(classType);
}
else
{
return null;
}
}
[MenuItem("TEngine/Build/一键打包Window", false, 30)]
public static void AutomationBuild()
{
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
// BuildDLLCommand.BuildAndCopyDlls(target);
AssetDatabase.Refresh();
BuildInternal(target, Application.dataPath + "/../Builds/Windows", packageVersion: GetBuildPackageVersion());
AssetDatabase.Refresh();
BuildImp(BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows64, $"{Application.dataPath}/../Build/Windows/Release_Windows.exe");
}
// 构建版本相关
private static string GetBuildPackageVersion()
{
int totalMinutes = DateTime.Now.Hour * 60 + DateTime.Now.Minute;
return DateTime.Now.ToString("yyyy-MM-dd") + "-" + totalMinutes;
}
[MenuItem("TEngine/Build/一键打包Android", false, 30)]
public static void AutomationBuildAndroid()
{
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
// BuildDLLCommand.BuildAndCopyDlls(target);
AssetDatabase.Refresh();
BuildInternal(target, outputRoot: Application.dataPath + "/../Bundles", packageVersion: GetBuildPackageVersion());
AssetDatabase.Refresh();
BuildImp(BuildTargetGroup.Android, BuildTarget.Android, $"{Application.dataPath}/../Build/Android/{GetBuildPackageVersion()}Android.apk");
// BuildImp(BuildTargetGroup.Android, BuildTarget.Android, $"{Application.dataPath}/../Build/Android/Android.apk");
}
[MenuItem("TEngine/Build/一键打包IOS", false, 30)]
public static void AutomationBuildIOS()
{
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
// BuildDLLCommand.BuildAndCopyDlls(target);
AssetDatabase.Refresh();
BuildInternal(target, outputRoot: Application.dataPath + "/../Bundles", packageVersion: GetBuildPackageVersion());
AssetDatabase.Refresh();
BuildImp(BuildTargetGroup.iOS, BuildTarget.iOS, $"{Application.dataPath}/../Build/IOS/XCode_Project");
}
public static void BuildImp(BuildTargetGroup buildTargetGroup, BuildTarget buildTarget, string locationPathName)
{
EditorUserBuildSettings.SwitchActiveBuildTarget(buildTargetGroup, BuildTarget.StandaloneWindows64);
AssetDatabase.Refresh();
BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions
{
scenes = EditorBuildSettings.scenes.Select(scene => scene.path).ToArray(),
locationPathName = locationPathName,
targetGroup = buildTargetGroup,
target = buildTarget,
options = BuildOptions.None
};
var report = BuildPipeline.BuildPlayer(buildPlayerOptions);
BuildSummary summary = report.summary;
if (summary.result == BuildResult.Succeeded)
{
Debug.Log($"Build success: {summary.totalSize / 1024 / 1024} MB");
}
else
{
Debug.Log($"Build Failed" + summary.result);
}
}
}
}