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();
}
}
}