using Code.Scripts.HotUpdate.UI; using Cysharp.Threading.Tasks; using PhxhSDK.AOT; using PhxhSDK.AOT.SimpleLoader; using PhxhSDK.AOT.VersionUpdate; using System; using UnityEngine; using UnityEngine.SceneManagement; public class GameLauncher : MonoBehaviour { const string START_SCENE_NAME = "Assets/Scenes/StartScene.unity"; //最大能容忍的下载卡住时长,一旦超过则重新开始下载 // private const float DOWNLOAD_STUCK_TIME_MAX = 10; #if USE_HCLR private HybridCLRHelper _hybridCLRHelper; #endif private VersionUpdateHandle _versionUpdateHandle; private ISimpleLoader _simpleLoader; private IVersionUpdateUI versionUpdateUI; public bool enableHotUpdate = true; private void Start() { Launch(); } private async void Launch() { #if UNITY_EDITOR enableHotUpdate = false; #endif #if USE_YOO await YooAssetHelper.Init(); _simpleLoader = new SimpleLoader_YooAsset(); #else _simpleLoader = new SimpleLoader_Addressables(); #endif Debug.Log($"Launch Game! enableHotUpdate:{enableHotUpdate}"); versionUpdateUI = new TempUIHandle(); _versionUpdateHandle = new VersionUpdateHandle(versionUpdateUI); bool result = await _versionUpdateHandle.CheckUpdate(); if (!result) { Debug.LogError("更新失败!,无法进入游戏"); return; } if (enableHotUpdate) { #if USE_HCLR Debug.Log("需要热更新,开始加载程序集"); _hybridCLRHelper = new HybridCLRHelper(); _hybridCLRHelper.SetDllList(AOTGenericReferences.PatchedAOTAssemblyList); _hybridCLRHelper.RegistLoader(_simpleLoader); await _hybridCLRHelper.LoadAssemblies(); Debug.Log("加载程序集结束!"); #endif } await EnterGame(); } private async UniTask EnterGame() { Debug.Log("开始加载游戏场景"); SimulationProgress(versionUpdateUI.GetCurProgress()); try { Scene scene = await _simpleLoader.LoadSceneAsync(START_SCENE_NAME, LoadSceneMode.Additive); foreach (GameObject go in scene.GetRootGameObjects()) { if ("EventSystem".Equals(go.name)) { Destroy(go); break; } } } catch (Exception e) { Debug.LogError(e); } finally { await LoadOver(); Debug.Log("加载游戏场景结束"); } } private async void SimulationProgress(float startProgress) { versionUpdateUI.UpdateProgressText("初始化游戏..."); versionUpdateUI.UpdateProgress(startProgress); float step = (1f - startProgress) * 0.02f; while (startProgress + step <= 0.99f) { await UniTask.Delay(20); startProgress += step; versionUpdateUI.UpdateProgress(startProgress); } } private async UniTask LoadOver() { while (true) { await UniTask.Yield(); // Debug.Log($"校验是否加载完:{IVersionUpdateUI.IsLoadOver}"); if (IVersionUpdateUI.IsLoadOver) { versionUpdateUI.UpdateProgress(1f); versionUpdateUI.UpdateProgressText("完成"); await UniTask.Delay(200); versionUpdateUI.CloseAll(); return; } } } }