using System;
using System.Collections.Generic;
using System.IO;
using AutoBuild.Helper;
using HybridCLR.Editor;
using HybridCLR.Editor.Commands;
using HybridCLR.Editor.Installer;
using PhxhSDK.AOT.VersionUpdate;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
///
/// 编辑器下打包
///
class BuildLauncher
{
private const string HybirdCLRGenerateDir = "/HybridCLRGenerate";
private const string HybirdCLRGenerateLinkPath = "Assets/HybridCLRGenerate/link.xml";
private const string GameLauncherSceneName = "Assets/Scenes/GameLauncher.unity";
private static bool enableHotUpdate;
///
/// 开启热更
///
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;
if (profileName.Equals("AllLocal"))
{
List appendDefineList = new() { "AllLocal" };
var currentTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget);
var oldDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(currentTargetGroup);
BatchBuild._oldDefines = oldDefines;
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 (appendDefineList.Contains(define))
appendDefineList.Remove(define);
}
newDefineList.AddRange(appendDefineList);
PlayerSettings.SetScriptingDefineSymbolsForGroup(currentTargetGroup, string.Join(";", newDefineList));
}
}
///
/// 编辑器下构建资源
///
public static void BuildResource()
{
UpdateLocalInfo info = new()
{
workSpace = YooAssetBuildBase.workSpace,
accessKeyId = YooAssetBuildBase.appConfigAccessKeyId,
accessKeySecret = YooAssetBuildBase.appConfigAccessKeySecret,
bucketName = YooAssetBuildBase.appConfigBucketName,
configOriginalUrl = YooAssetBuildBase.appConfigURL,
//httpUrl = YooAssetBuildBase.httpURL,
httpAccessKey = YooAssetBuildBase.httpAccessKey,
httpKey = YooAssetBuildBase.httpKey,
version = YooAssetBuildBase.appVersion,
isDev = YooAssetBuildBase.isDev,
buildTicks = DateTime.Now.Ticks,
buildCode = BatchBuild.GetBundleVersionCode(),
};
PackDataInst.CreateResourceJson(info);
BuildTargetGroup currentTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget);
string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(currentTargetGroup);
#if DEVELOPMENT_BUILD || DEBUG
ExtBuildInfoHelper.CreateFirstExtBuildInfo(info.buildTicks, info.workSpace, info.version, info.buildCode, true, defines);
#else
ExtBuildInfoHelper.CreateFirstExtBuildInfo(info.buildTicks, info.workSpace, info.version, false, defines);
#endif
SetEnableHotUpdate(enableHotUpdate);
if (enableHotUpdate)
{
BuildHotUpdateDlls();
}
YooAssetBuildBase.BuildResourceInEditor();
}
///
/// 编辑器下构建资源和Player
///
public static void BuildResourceAndPlayer()
{
UpdateLocalInfo info = new()
{
workSpace = YooAssetBuildBase.workSpace,
accessKeyId = YooAssetBuildBase.appConfigAccessKeyId,
accessKeySecret = YooAssetBuildBase.appConfigAccessKeySecret,
bucketName = YooAssetBuildBase.appConfigBucketName,
configOriginalUrl = YooAssetBuildBase.appConfigURL,
//httpUrl = YooAssetBuildBase.httpURL,
httpAccessKey = YooAssetBuildBase.httpAccessKey,
httpKey = YooAssetBuildBase.httpKey,
version = YooAssetBuildBase.appVersion,
isDev = YooAssetBuildBase.isDev,
buildTicks = DateTime.Now.Ticks,
buildCode = BatchBuild.GetBundleVersionCode(),
};
PackDataInst.CreateResourceJson(info);
BuildTargetGroup currentTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget);
string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(currentTargetGroup);
#if DEVELOPMENT_BUILD || DEBUG
ExtBuildInfoHelper.CreateFirstExtBuildInfo(info.buildTicks, info.workSpace, info.version, info.buildCode, true, defines);
#else
ExtBuildInfoHelper.CreateFirstExtBuildInfo(info.buildTicks, info.workSpace, info.version, false, defines);
#endif
SetEnableHotUpdate(enableHotUpdate);
if (enableHotUpdate)
{
BuildHotUpdateDlls();
}
YooAssetBuildBase.BuildContentAndPlayerInEditor();
ExtBuildInfoHelper.CreateVertifyBuildInfo(info.workSpace, info.version);
if (!string.IsNullOrEmpty(BatchBuild._oldDefines))
BatchBuild._RevertScriptDefines();
var aotDllStorePath = BatchBuild.GetAotDllStorePath(info.workSpace, info.version);
var aotDllPath = SettingsUtil.GetAssembliesPostIl2CppStripDir(EditorUserBuildSettings.activeBuildTarget);
DirectoryInfo dir = new(aotDllPath);
if (Directory.Exists(aotDllStorePath))
Directory.Delete(aotDllStorePath, true);
Directory.CreateDirectory(aotDllStorePath);
FileInfo[] files = dir.GetFiles();
foreach (FileInfo file in files)
{
file.CopyTo(Path.Combine(aotDllStorePath, file.Name), false);
}
}
///
/// 只构建Player
///
public static void BuildPlayer()
{
YooAssetBuildBase.BuildPlayerInEditor();
}
///
/// 编辑器下热更
///
public static void UpdatePreviousBuild(string workSpace, string version, BuildTarget buildTarget)
{
ExtBuildInfoHelper.VertifyExitBuildInfo(YooAssetBuildBase.workSpace, YooAssetBuildBase.appVersion);
Debug.Log("开始检查AOT版本");
if (BatchBuild.CheckAotOutDate(YooAssetBuildBase.workSpace, YooAssetBuildBase.appVersion))
{
Debug.Log("AOT版本检查通过");
BuildHotUpdateDlls();
}
else
{
Debug.LogError("AOT版本不匹配,请重新打AOT包");
}
BuildTargetGroup currentTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget);
string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(currentTargetGroup);
// 写入打包信息到Yoo_Build_Cache
#if DEVELOPMENT_BUILD || DEBUG
ExtBuildInfoHelper.UpdateExtBuildInfo(YooAssetBuildBase.workSpace, YooAssetBuildBase.appVersion, true, defines);
#else
ExtBuildInfoHelper.UpdateExtBuildInfo(YooAssetBuildBase.workSpace, YooAssetBuildBase.appVersion, false, defines);
#endif
YooAssetBuildBase.BuildOnlyResUpdate();
ExtBuildInfoHelper.CreateVertifyBuildInfo(YooAssetBuildBase.workSpace, YooAssetBuildBase.appVersion);
YooAssetBuildBase.UploadToServerYooAsset(workSpace, version, buildTarget);
/*try
{
}
catch (Exception e)
{
DebugUtil.LogError($"[Build Exception]:{e.Message} \r\n {e.StackTrace}");
throw;
}*/
}
public static void UploadToServer(string workSpace, string version, BuildTarget buildTarget)
{
YooAssetBuildBase.UploadToServerYooAsset(workSpace, version, buildTarget);
}
}