// ============================================================================ // YooAssetInitTask.cs — YooAsset 初始化启动任务 // 在 LaunchInHot 的启动流水线中初始化 YooAsset,与 AssetBundleInitTask 并行/替代 // T013: Register YooAssetService as IYooAssetBridge // ============================================================================ using Cysharp.Threading.Tasks; using ProjSG.Resource; using UnityEngine; using YooAsset; public class YooAssetInitTask : LaunchTask { private bool _initStarted = false; private bool _initCompleted = false; public override float expectTime { get { return LocalSave.GetFloat("YooAssetInitTask_ExpectTime", 1f); } protected set { LocalSave.SetFloat("YooAssetInitTask_ExpectTime", value); } } public override void Begin() { LaunchInHot.m_CurrentStage = LaunchStage.AssetBundleInit; duration = Mathf.Max(0.5f, expectTime); if (!_initStarted) { _initStarted = true; RunInitAsync().Forget(); } } private async UniTaskVoid RunInitAsync() { try { // Determine play mode based on AssetSource setting EPlayMode playMode; if (!AssetSource.isUseAssetBundle) { #if UNITY_EDITOR playMode = EPlayMode.EditorSimulateMode; #else playMode = EPlayMode.OfflinePlayMode; #endif } else { playMode = EPlayMode.HostPlayMode; } // Initialize YooAssetService await YooAssetService.Instance.InitializeAsync(playMode); // Register as IYooAssetBridge for Launch assembly cross-assembly access YooAssetBridgeHolder.Register(YooAssetService.Instance); // US4 T042: Register default preload configs and execute StartupEssential preload ResourcePreloader.Instance.RegisterDefaultConfigs(); await ResourcePreloader.Instance.PreloadAsync("StartupEssential"); Debug.Log("[YooAssetInitTask] YooAssetService initialized, bridge registered, StartupEssential preloaded."); _initCompleted = true; } catch (System.Exception ex) { Debug.LogError($"[YooAssetInitTask] Failed: {ex}"); _initCompleted = true; // Mark done even on failure to avoid blocking pipeline } } public override void Update() { timer += Time.deltaTime; if (_initCompleted) { done = true; progress = 1f; } else { progress = Mathf.Clamp01(timer / duration); } ExceptionReport(); } public override void End() { expectTime = timer; Debug.LogFormat("{0}执行时长:{1};", GetType().Name, timer); } }