自动化打包
简介
每个手游项目在测试阶段都需要在对应的手机平台上进行游戏包体测试,关乎项目的各种适配和问题测试,加上Unity项目打包需要分为资源包和游戏包,这会耗费 大量的时间 在等待打包上,所以一般来说每个项目组会配备有一个 打包机,只需要在打包机上执行打包,负责打包的人就可以继续去做自己的事。但是因为 打包的需求 可能会随时变化,而且不可能每次都由程序去打包,所以需要一个简单易懂的操作方式,让测试人员能够按照自己的需求来打包,所以选择
Jenkins
作为自动化平台,它能够支持多参配置,也支持自定义打包。
环境搭建
平台搭建
环境设置
Unity内工具脚本
因为Jenkins无法直接调用Unity的API,所以一般会以bat(批处理文件)调用Unity函数去做打包操作,具体的文档可以参考:Unity手册,Unity内部需要的操作就比较简单了,只需要提供一个静态接口供外部调用,可以参考以下代码:
打包工具类
/// <summary>
/// 打包工具类
/// </summary>
public class BuildTool : EditorWindow {
/// <summary>
/// HybridCLR安装控制器
/// </summary>
static InstallerController _controller;
/// <summary>
/// 导出路径
/// </summary>
static string buildPath = "../../../PackageExport";
/// <summary>
/// 显示打包工具窗口
/// </summary>
[MenuItem("BuildTool/BuildAssets")]
private static void ShowWindow() {
var window = GetWindow<BuildTool>();
window.titleContent = new GUIContent("BuildTool");
window.Show();
}
private void OnGUI() {
if (GUILayout.Button("一键打包")) {
BuildUIAssets();
BuildTextureAssets();
HybridCLRDllCreateAndCopy();
ExportPackInfo();
if (EditorUtility.DisplayDialog("Build Done!", "一键打包完成!", "OK")) {
Process.Start("explorer.exe", Application.streamingAssetsPath);
}
}
}
/// <summary>
/// 构建UI资源
/// </summary>
private static void BuildUIAssets() {
//具体打包逻辑
EditorUtility.ClearProgressBar();
}
/// <summary>
/// 构建Texture资源
/// </summary>
private static void BuildTextureAssets() {
//具体打包逻辑
EditorUtility.ClearProgressBar();
}
/// <summary>
/// HybridCLR安装控制器属性
/// </summary>
private static InstallerController controller {
get {
if (_controller == null) {
_controller = new InstallerController();
}
return _controller;
}
}
/// <summary>
/// HybridCLR DLL创建和复制
/// </summary>
private static void HybridCLRDllCreateAndCopy() {
controller.InstallDefaultHybridCLR();
CompileDllCommand.CompileDllActiveBuildTarget();
PrebuildCommand.GenerateAll();
HybridCLRTool.CopyAOTAssemblies();
HybridCLRTool.CopyHotUpdateAssemblies();
HybridCLRTool.CopyEditorHotUpdateAssemblies();
Debug.Log("HybridCLR Dll Create and Copy completed.");
}
/// <summary>
/// 导出包信息(设置有构建选项:平台、导出路径、打包结果等)
/// </summary>
private static void ExportPackInfo() {
EditorUserBuildSettings.exportAsGoogleAndroidProject = true;
BuildPlayerOptions options = new BuildPlayerOptions();
options.locationPathName = buildPath;
options.target = BuildTarget.Android;
options.options = BuildOptions.None;
var report = BuildPipeline.BuildPlayer(options);
if (report.summary.result == BuildResult.Succeeded) {
Debug.Log($"Exported package to {buildPath}");
} else {
Debug.LogError("Failed to export package.");
}
}
/// <summary>
/// 一键打包接口(外部调用)
/// </summary>
public static void BuildAll() {
BuildUIAssets();
BuildTextureAssets();
HybridCLRDllCreateAndCopy();
ExportPackInfo();
Debug.Log("Build All completed.");
}
}
外部bat脚本
rem 设置变量
set "unityPath=C:\Program Files\Unity\Hub\Editor\2022.3.55f1c1\Editor\Unity.exe"
set "projectPath=D:\Work\Client\clientCpoy"
set "logPath=D:\Build.log"
rem 进程查找(判断是否Unity在运行中,否则命令行打开Unity会失败)
tasklist /v /s localhost /u %username%>tmp_process_list.txt
type tmp_process_list.txt |find "Unity.exe"
if %errorlevel% neq 0 (
goto UnityIsRuning
) else (
goto StartUnity
)
rem 杀掉Unity进程
:UnityIsRuning
taskkill /f /im Unity.exe
goto StartUnity
rem 执行调用Unity打包函数
:StartUnity
%unityPath% ^
-quit ^
-batchmode ^
-projectPath %projectPath% ^
-executeMethod BuildTool.BuildAll ^
-logFile %logPath%