using System.Collections.Generic; using System.Linq; using Cysharp.Threading.Tasks; using PhxhSDK; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.ResourceManagement.ResourceProviders; using UnityEngine.SceneManagement; namespace Gameplay.SubSystems { /// /// 游戏场景的底层逻辑 /// public class GameSceneManager : Singlenton { public class SceneHandle { public Scene Scene { get; private set; } public SceneHandle(Scene scene) { Scene = scene; } public Camera SceneMainCamera => CommonUtils.GetSceneRootComponent(Scene); } private Dictionary> _sceneOpDic = new(); private string GetPostProcessedScenePath(string scenePath) => PostProcessData.Instance[scenePath]; public async UniTask LoadSceneAsync(string scenePath, LoadSceneMode mode = LoadSceneMode.Single) { scenePath = GetPostProcessedScenePath(scenePath); if (string.IsNullOrEmpty(scenePath)) { DebugUtil.LogError($"ScenePath is null!"); return null; } if (mode == LoadSceneMode.Single) _sceneOpDic.Clear(); if (!_sceneOpDic.TryGetValue(scenePath, out var op)) { op = Addressables.LoadSceneAsync(scenePath, mode); _sceneOpDic.Add(scenePath, op); } await op.ToUniTask(); return new(op.Result.Scene); } public async UniTask UnLoadSceneAsync(string scenePath) { scenePath = GetPostProcessedScenePath(scenePath); if (string.IsNullOrEmpty(scenePath)) { DebugUtil.LogError($"ScenePath is null!"); return; } if (!_sceneOpDic.TryGetValue(scenePath, out var op)) { Debug.LogError($"该场景没有被加载过 scenePath:{scenePath}"); return; } _sceneOpDic.Remove(scenePath); await Addressables.UnloadSceneAsync(op).ToUniTask(); } /// /// 返回场景加载的进度 /// /// /// 0-100的浮点数 public float GetSceneLoadingProgress(string scenePath) { scenePath = GetPostProcessedScenePath(scenePath); if (_sceneOpDic.TryGetValue(scenePath, out var op)) { return op.PercentComplete * 100; } return 0; } } }