using System; using System.Collections; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.AddressableAssets.ResourceLocators; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.ResourceManagement.ResourceProviders; using UnityEngine.SceneManagement; namespace MuHua { /// /// 加载可寻址场景 /// public class AAScene { public readonly string name; public readonly LoadSceneMode loadSceneMode; public readonly bool activateOnLoad; public Action OnProgress; public Action OnError; public Action OnComplete; /// 加载可寻址场景 public AAScene(string name, LoadSceneMode loadSceneMode = LoadSceneMode.Single, bool activateOnLoad = true) { this.name = name; this.loadSceneMode = loadSceneMode; this.activateOnLoad = activateOnLoad; } /// 获取异步句柄 public AsyncOperationHandle Handle() { return Addressables.LoadSceneAsync(name, loadSceneMode, activateOnLoad); } /// 加载场景 public async void Load() => await ALoad(); /// 加载场景 public async Task ALoad() { AsyncOperationHandle handle = Handle(); if (handle.Status == AsyncOperationStatus.Failed) { OnError?.Invoke($"无法加载场景!({name})"); return; } while (!handle.IsDone) { float downloadProgress = handle.GetDownloadStatus().Percent; float loadProgress = handle.PercentComplete; float totalProgress = (downloadProgress + loadProgress) / 2.0f; // Debug.Log($"下载进度: {downloadProgress * 100}% , 加载进度: {loadProgress * 100}% , 总进度: {totalProgress * 100}%"); OnProgress?.Invoke(totalProgress); await Task.Delay(100); } OnComplete?.Invoke(); } /// 加载场景 public IEnumerator ILoad() { AsyncOperationHandle handle = Handle(); if (handle.Status == AsyncOperationStatus.Failed) { OnError?.Invoke($"无法加载场景!({name})"); yield break; } while (!handle.IsDone) { float downloadProgress = handle.GetDownloadStatus().Percent; float loadProgress = handle.PercentComplete; float totalProgress = (downloadProgress + loadProgress) / 2.0f; OnProgress?.Invoke(totalProgress); yield return new WaitForEndOfFrame(); } OnComplete?.Invoke(); } } }