using System; using UnityEngine; using UnityEditor; using UnityEngine.Windows; using HybridCLR.Editor.Commands; using PhxhSDK.AOT.VersionUpdate; using Debug = UnityEngine.Debug; using System.Collections.Generic; using HybridCLR.Editor.Installer; using UnityEditor.SceneManagement; using BuildTarget = UnityEditor.BuildTarget; /// /// 编辑器下打包 /// class BuildLauncher { private const string HybirdCLRGenerateDir = "/HybridCLRGenerate"; private const string HybirdCLRGenerateLinkPath = "Assets/HybridCLRGenerate/link.xml"; private const string GameLauncherSceneName = "Assets/Scenes/GameLauncher.unity"; //"/var/www/html/nld/Build/$WORKSPACE/$PLATFORM/$VERSION" private const string RemotePath = "/var/www/html/nld/Build/{0}/{1}/{2}"; private const string RemoteHost = "132.232.113.98"; private const string RemoteUser = "root"; private static bool enableHotUpdate; private static bool hasYooAsset = true; /// /// 开启热更 /// public static void SetEnableHotUpdate(bool isEnable) { Debug.Log($"是否开启热更新:{isEnable}"); var gameLauncherScene = EditorSceneManager.OpenScene(GameLauncherSceneName, OpenSceneMode.Additive); if (!gameLauncherScene.IsValid()) { Debug.LogError($"无法加载场景{GameLauncherSceneName}"); return; } var gameLauncher = UnityEngine.Object.FindObjectOfType(); if (gameLauncher == null) { Debug.LogError("找不到GameLauncher"); return; } 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); } } /// /// 构建热更 /// public static void BuildHotUpdateDlls() { var controller = new InstallerController(); if (!controller.HasInstalledHybridCLR()) controller.InstallDefaultHybridCLR(); BuildUtils.SetFileReadable(Application.dataPath + HybirdCLRGenerateDir); PrebuildCommand.GenerateAll(); HotUpadeEditorHelper.CopyHotUpdateDll(); HotUpadeEditorHelper.CopyMetaDataDll(); } /// /// 打包面板初始化 /// 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; } /// /// 编辑器下构建资源 /// 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(); } /// /// 编辑器下构建资源和Player /// 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); } /// /// 只构建Player /// public static void BuildPlayer(BuildTarget buildTarget, bool isDev = false) { YooAssetBuildBase.BuildPlayerInEditor(); } /// /// 编辑器下热更 /// public static void UpdatePreviousBuild(string workSpace, string version, BuildTarget buildTarget) { try { if (enableHotUpdate) BuildHotUpdateDlls(); YooAssetBuildBase.BuildOnlyResUpdate(); YooAssetBuildBase.UploadToServerYooAsset(workSpace, version, buildTarget, RemoteUser, RemoteHost, RemotePath); } catch (Exception e) { DebugUtil.LogError($"[Build Exception]:{e.Message} \r\n {e.StackTrace}"); throw; } } } /// /// Jenkins打包 /// internal class BatchBuild { /// /// 批处理更新设置 /// jenkins打包新包时使用该方法 /// public static void ApplyPlayerSetting() { YooAssetBuildBase.Init(); } private static string _oldDefines; private static bool _hasYooAsset; private static void _InitScriptDefines() { var hasYooAsset = false; // 判断本地是否有define_list.txt文件 var defineListPath = Application.dataPath + "/../define_list.txt"; var appendDefineList = new List(); if (File.Exists(defineListPath)) { var defineList = System.IO.File.ReadAllLines(defineListPath); foreach (var define in defineList) { if (string.IsNullOrEmpty(define)) continue; appendDefineList.Add(define); Debug.Log("追加宏定义:" + define); if (define == "USE_YOO") { hasYooAsset = true; } } } var currentTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget); var oldDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(currentTargetGroup); _oldDefines = oldDefines; // 判断是否有需要追加的宏 if (appendDefineList.Count > 0) { var newDefineList = new List(); newDefineList.AddRange(oldDefines.Split(';')); for (var i = 0; i < newDefineList.Count; i++) { var define = newDefineList[i]; if (string.IsNullOrEmpty(define)) continue; if (define == "USE_YOO") { hasYooAsset = true; } if (appendDefineList.Contains(define)) appendDefineList.Remove(define); } newDefineList.AddRange(appendDefineList); PlayerSettings.SetScriptingDefineSymbolsForGroup(currentTargetGroup, string.Join(";", newDefineList)); } // 现已修改为使用YooAsset _hasYooAsset = hasYooAsset; _hasYooAsset = true; } private static void _RevertScriptDefines() { var currentTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget); PlayerSettings.SetScriptingDefineSymbolsForGroup(currentTargetGroup, _oldDefines); } /// /// 批处理构建Resources和Player /// jenkins打包新包时使用该方法 /// public static void BuildContentAndPlayer() { try { _InitScriptDefines(); var enableHotUpdate = YooAssetBuildBase.Init(); if (_hasYooAsset) { // 写入版本信息到Resources/LocalInfo.json 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); } BuildLauncher.SetEnableHotUpdate(enableHotUpdate); if (enableHotUpdate) { BuildLauncher.BuildHotUpdateDlls(); } YooAssetBuildBase.BuildContentAndPlayer(); // 还原宏 _RevertScriptDefines(); } catch (Exception e) { //Build Exception用于在日志文件中定位此次打包的异常 Debug.LogError($"[Build Exception]:{e.Message} \r\n {e.StackTrace}"); throw; } } /// /// 批处理增量更新资源 /// jenkins打包增量更新时使用该方法 /// public static void UpdatePreviousBuild() { try { _InitScriptDefines(); var enableHotUpdate = YooAssetBuildBase.Init(); if (enableHotUpdate) BuildLauncher.BuildHotUpdateDlls(); YooAssetBuildBase.BuildOnlyResUpdate(); _RevertScriptDefines(); } catch (Exception e) { //Build Exception用于在日志文件中定位此次打包的异常 Debug.LogError($"[Build Exception]:{e.Message} \r\n {e.StackTrace}"); throw; } } }