NLDClient-yudde/ProjectNLD/Assets/Editor/Common/BuildLauncher.cs

321 lines
10 KiB
C#
Raw Normal View History

2023-10-19 15:00:19 +08:00
using System;
2024-05-15 17:15:25 +08:00
using UnityEngine;
using UnityEditor;
using UnityEngine.Windows;
2023-10-19 15:00:19 +08:00
using HybridCLR.Editor.Commands;
using PhxhSDK.AOT.VersionUpdate;
2024-05-15 17:15:25 +08:00
using Debug = UnityEngine.Debug;
using System.Collections.Generic;
using HybridCLR.Editor.Installer;
2023-10-19 15:00:19 +08:00
using UnityEditor.SceneManagement;
using BuildTarget = UnityEditor.BuildTarget;
2024-05-15 17:15:25 +08:00
/// <summary>
/// 编辑器下打包
/// </summary>
2023-10-19 15:00:19 +08:00
class BuildLauncher
{
private const string HybirdCLRGenerateDir = "/HybridCLRGenerate";
private const string HybirdCLRGenerateLinkPath = "Assets/HybridCLRGenerate/link.xml";
2023-11-07 19:07:35 +08:00
private const string GameLauncherSceneName = "Assets/Scenes/GameLauncher.unity";
2023-11-23 14:44:42 +08:00
2024-05-15 17:15:25 +08:00
//"/var/www/html/nld/Build/$WORKSPACE/$PLATFORM/$VERSION"
private const string RemotePath = "/var/www/html/nld/Build/{0}/{1}/{2}";
2024-05-15 18:38:52 +08:00
private const string RemoteHost = "132.232.113.98";
private const string RemoteUser = "root";
2023-11-23 14:44:42 +08:00
2024-05-15 17:15:25 +08:00
private static bool enableHotUpdate;
private static bool hasYooAsset = true;
2023-10-19 15:00:19 +08:00
2024-05-15 17:15:25 +08:00
/// <summary>
/// 开启热更
/// </summary>
2023-11-07 19:07:35 +08:00
public static void SetEnableHotUpdate(bool isEnable)
2023-10-19 15:00:19 +08:00
{
2023-11-07 19:07:35 +08:00
Debug.Log($"是否开启热更新:{isEnable}");
var gameLauncherScene = EditorSceneManager.OpenScene(GameLauncherSceneName, OpenSceneMode.Additive);
if (!gameLauncherScene.IsValid())
2023-10-19 15:00:19 +08:00
{
2023-11-07 19:07:35 +08:00
Debug.LogError($"无法加载场景{GameLauncherSceneName}");
return;
2023-10-19 15:00:19 +08:00
}
2024-05-15 17:15:25 +08:00
2023-11-07 19:07:35 +08:00
var gameLauncher = UnityEngine.Object.FindObjectOfType<GameLauncher>();
if (gameLauncher == null)
2023-10-19 15:00:19 +08:00
{
2023-11-07 19:07:35 +08:00
Debug.LogError("找不到GameLauncher");
return;
2023-10-19 15:00:19 +08:00
}
2024-05-15 17:15:25 +08:00
2023-11-07 19:07:35 +08:00
gameLauncher.enableHotUpdate = isEnable;
EditorSceneManager.MarkSceneDirty(gameLauncherScene);
EditorSceneManager.SaveScene(gameLauncherScene);
EditorSceneManager.CloseScene(gameLauncherScene, false);
HybridCLR.Editor.SettingsUtil.Enable = isEnable;
if (!isEnable)
{
//删除HybirdCLR生成的link文件
AssetDatabase.DeleteAsset(HybirdCLRGenerateLinkPath);
}
2023-10-19 15:00:19 +08:00
}
2024-05-15 17:15:25 +08:00
/// <summary>
/// 构建热更
/// </summary>
public static void BuildHotUpdateDlls()
{
var controller = new InstallerController();
if (!controller.HasInstalledHybridCLR())
controller.InstallDefaultHybridCLR();
BuildUtils.SetFileReadable(Application.dataPath + HybirdCLRGenerateDir);
PrebuildCommand.GenerateAll();
HotUpadeEditorHelper.CopyHotUpdateDll();
HotUpadeEditorHelper.CopyMetaDataDll();
}
/// <summary>
/// 打包面板初始化
/// </summary>
public static void Init(BuildTarget buildTarget, string workSpace, string appVersion, string profileName,
bool developmentBuild,
bool hotUpdate)
{
EditorUserBuildSettings.development = developmentBuild;
YooAssetBuildBase.BuildTargetPlatform = buildTarget;
YooAssetBuildBase.profileName = profileName;
YooAssetBuildBase.JudgmentPlatform(buildTarget.ToString());
YooAssetBuildBase.workSpace = string.IsNullOrEmpty(workSpace) ? "WorkSpace" : workSpace;
PlayerSettings.bundleVersion = appVersion;
YooAssetBuildBase.appVersion = appVersion;
enableHotUpdate = hotUpdate;
}
2024-05-21 17:04:32 +08:00
/// <summary>
/// 编辑器下构建资源
/// </summary>
public static void BuildResource()
{
if (hasYooAsset)
{
var info = new UpdateLocalInfo();
info.workSpace = YooAssetBuildBase.workSpace;
info.version = YooAssetBuildBase.appVersion;
info.buildCount = 1;
info.serverUrl = "http://132.232.113.98";
PackDataInst.CreateResourceJson(info);
PackDataInst.CreateBuildCount(info.workSpace, info.version, info.buildCount);
}
SetEnableHotUpdate(enableHotUpdate);
if (enableHotUpdate)
{
BuildHotUpdateDlls();
}
YooAssetBuildBase.BuildResourceInEditor();
}
2024-05-15 17:15:25 +08:00
/// <summary>
/// 编辑器下构建资源和Player
/// </summary>
public static void BuildResourceAndPlayer()
{
if (hasYooAsset)
{
var info = new UpdateLocalInfo();
info.workSpace = YooAssetBuildBase.workSpace;
info.version = YooAssetBuildBase.appVersion;
info.buildCount = 1;
info.serverUrl = "http://132.232.113.98";
PackDataInst.CreateResourceJson(info);
PackDataInst.CreateBuildCount(info.workSpace, info.version, info.buildCount);
}
SetEnableHotUpdate(enableHotUpdate);
if (enableHotUpdate)
{
BuildHotUpdateDlls();
}
YooAssetBuildBase.BuildContentAndPlayerInEditor(RemoteUser, RemoteHost, RemotePath);
}
/// <summary>
/// 只构建Player
/// </summary>
public static void BuildPlayer(BuildTarget buildTarget, bool isDev = false)
{
YooAssetBuildBase.BuildPlayerInEditor();
}
/// <summary>
2024-05-15 18:38:52 +08:00
/// 编辑器下热更
2024-05-15 17:15:25 +08:00
/// </summary>
2024-05-15 18:38:52 +08:00
public static void UpdatePreviousBuild(string workSpace, string version, BuildTarget buildTarget)
2023-10-19 15:00:19 +08:00
{
2024-05-15 18:38:52 +08:00
try
2023-11-28 13:00:46 +08:00
{
2024-05-15 18:38:52 +08:00
if (enableHotUpdate)
BuildHotUpdateDlls();
YooAssetBuildBase.BuildOnlyResUpdate();
YooAssetBuildBase.UploadToServerYooAsset(workSpace, version, buildTarget, RemoteUser, RemoteHost,
RemotePath);
2023-11-28 13:00:46 +08:00
}
2024-05-15 18:38:52 +08:00
catch (Exception e)
2023-10-19 15:00:19 +08:00
{
2024-05-15 18:38:52 +08:00
DebugUtil.LogError($"[Build Exception]:{e.Message} \r\n {e.StackTrace}");
throw;
2023-10-19 15:00:19 +08:00
}
}
}
2024-05-15 17:15:25 +08:00
/// <summary>
/// Jenkins打包
/// </summary>
2023-10-19 15:00:19 +08:00
internal class BatchBuild
{
2024-04-12 18:06:06 +08:00
/// <summary>
/// 批处理更新设置
/// jenkins打包新包时使用该方法
/// </summary>
public static void ApplyPlayerSetting()
{
2024-05-15 17:15:25 +08:00
YooAssetBuildBase.Init();
2023-10-19 15:00:19 +08:00
}
private static string _oldDefines;
2024-05-15 17:15:25 +08:00
private static bool _hasYooAsset;
private static void _InitScriptDefines()
2023-10-19 15:00:19 +08:00
{
var hasYooAsset = false;
// 判断本地是否有define_list.txt文件
var defineListPath = Application.dataPath + "/../define_list.txt";
var appendDefineList = new List<string>();
if (File.Exists(defineListPath))
2023-11-23 14:41:25 +08:00
{
var defineList = System.IO.File.ReadAllLines(defineListPath);
foreach (var define in defineList)
2023-11-23 14:41:25 +08:00
{
if (string.IsNullOrEmpty(define))
continue;
appendDefineList.Add(define);
Debug.Log("追加宏定义:" + define);
if (define == "USE_YOO")
2024-01-24 13:18:47 +08:00
{
hasYooAsset = true;
2024-01-24 13:18:47 +08:00
}
2023-11-23 14:41:25 +08:00
}
}
2024-01-24 13:18:47 +08:00
var currentTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget);
var oldDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(currentTargetGroup);
_oldDefines = oldDefines;
// 判断是否有需要追加的宏
if (appendDefineList.Count > 0)
{
var newDefineList = new List<string>();
newDefineList.AddRange(oldDefines.Split(';'));
for (var i = 0; i < newDefineList.Count; i++)
2024-01-24 13:18:47 +08:00
{
var define = newDefineList[i];
if (string.IsNullOrEmpty(define))
continue;
if (define == "USE_YOO")
2024-01-24 13:18:47 +08:00
{
hasYooAsset = true;
2024-01-24 13:18:47 +08:00
}
2024-05-15 17:15:25 +08:00
if (appendDefineList.Contains(define))
appendDefineList.Remove(define);
2024-01-24 13:18:47 +08:00
}
newDefineList.AddRange(appendDefineList);
PlayerSettings.SetScriptingDefineSymbolsForGroup(currentTargetGroup, string.Join(";", newDefineList));
}
2024-05-15 17:15:25 +08:00
2024-02-27 15:56:29 +08:00
// 现已修改为使用YooAsset
_hasYooAsset = hasYooAsset;
2024-02-27 15:56:29 +08:00
_hasYooAsset = true;
}
2024-05-15 17:15:25 +08:00
private static void _RevertScriptDefines()
{
var currentTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget);
PlayerSettings.SetScriptingDefineSymbolsForGroup(currentTargetGroup, _oldDefines);
}
/// <summary>
2024-05-15 17:15:25 +08:00
/// 批处理构建Resources和Player
/// jenkins打包新包时使用该方法
/// </summary>
public static void BuildContentAndPlayer()
{
try
{
_InitScriptDefines();
2024-05-15 17:15:25 +08:00
var enableHotUpdate = YooAssetBuildBase.Init();
if (_hasYooAsset)
{
// 写入版本信息到Resources/LocalInfo.json
var info = new UpdateLocalInfo();
2024-05-15 17:15:25 +08:00
info.workSpace = YooAssetBuildBase.workSpace;
info.version = YooAssetBuildBase.appVersion;
info.buildCount = 1;
info.serverUrl = "http://132.232.113.98";
PackDataInst.CreateResourceJson(info);
2024-05-15 17:15:25 +08:00
2024-02-26 14:07:57 +08:00
// 写入打包次数
PackDataInst.CreateBuildCount(info.workSpace, info.version, info.buildCount);
}
2024-05-15 17:15:25 +08:00
2024-01-24 13:18:47 +08:00
BuildLauncher.SetEnableHotUpdate(enableHotUpdate);
if (enableHotUpdate)
2023-11-23 14:41:25 +08:00
{
2024-01-24 13:18:47 +08:00
BuildLauncher.BuildHotUpdateDlls();
2023-11-23 14:41:25 +08:00
}
2024-01-24 13:18:47 +08:00
2024-05-15 17:15:25 +08:00
YooAssetBuildBase.BuildContentAndPlayer();
2024-01-24 13:18:47 +08:00
// 还原宏
_RevertScriptDefines();
2023-11-23 14:41:25 +08:00
}
2024-01-24 13:18:47 +08:00
catch (Exception e)
{
2024-01-24 15:51:08 +08:00
//Build Exception用于在日志文件中定位此次打包的异常
2024-01-24 13:18:47 +08:00
Debug.LogError($"[Build Exception]:{e.Message} \r\n {e.StackTrace}");
throw;
}
2023-10-19 15:00:19 +08:00
}
/// <summary>
/// 批处理增量更新资源
/// jenkins打包增量更新时使用该方法
2023-10-19 15:00:19 +08:00
/// </summary>
public static void UpdatePreviousBuild()
{
2024-01-24 15:51:08 +08:00
try
{
_InitScriptDefines();
2024-05-15 17:15:25 +08:00
var enableHotUpdate = YooAssetBuildBase.Init();
2024-01-24 15:51:08 +08:00
if (enableHotUpdate)
BuildLauncher.BuildHotUpdateDlls();
2024-05-15 17:15:25 +08:00
YooAssetBuildBase.BuildOnlyResUpdate();
_RevertScriptDefines();
2024-01-24 15:51:08 +08:00
}
catch (Exception e)
{
//Build Exception用于在日志文件中定位此次打包的异常
Debug.LogError($"[Build Exception]:{e.Message} \r\n {e.StackTrace}");
throw;
}
2023-10-19 15:00:19 +08:00
}
2024-05-15 17:15:25 +08:00
}