using System; using System.Collections; using AibisDream.Framework; using AibisDream.Kit; using AibisDream.FixSystem; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.SceneManagement; using DG.Tweening; using AibisDream.UI; namespace AibisDream { public class SceneLoader : Singleton { #region 场景转换参数 private AsyncOperationHandle _loadHandle; private string _sceneToLoad; private bool _isLoading; private readonly SceneData _data = new(); public override void OnSingletonInit() { StorageSystem.Instance.RegisterData(_data); } #endregion /// /// 同步场景转换 /// /// 目标场景 public void LoadScene(string targetScene, Action onComplete = null) { StartCoroutine(LoadSceneAsync(targetScene, onComplete)); } /// /// 异步场景转换 /// /// 目标场景 /// public IEnumerator LoadSceneAsync(string targetScene, Action onComplete = null) { if (_isLoading) { yield return null; } else { // 场景转换参数 _isLoading = true; _sceneToLoad = targetScene; UIManager.Instance.GetPanel().ShowLoading(); // 在卸载场景前清理所有系统 if (!string.IsNullOrEmpty(_data.sceneName)) { // 清理所有DOTween动画 DOTween.KillAll(); // 清理所有系统注册 if (FixSystemCenter.SystemDic != null) { FixSystemCenter.SystemDic.Clear(); } yield return Addressables.UnloadSceneAsync(_loadHandle); } _loadHandle = Addressables.LoadSceneAsync(_sceneToLoad, LoadSceneMode.Additive); yield return _loadHandle; EnumEventSystem.Global.Send(EventEnum.SceneLoad, _sceneToLoad); _data.sceneName = _sceneToLoad; UIManager.Instance.GetPanel().HideLoading(); _isLoading = false; onComplete?.Invoke(); } } public IEnumerator UnloadSceneAsync() { if (_isLoading) { yield return null; } else { _isLoading = true; if (_loadHandle.IsValid()) { yield return Addressables.UnloadSceneAsync(_loadHandle); _data.sceneName = null; } _isLoading = false; } } } [Serializable] [LoadIndex(1)] public class SceneData : IData { public string sceneName; public IEnumerator Load() { // yield return UIManager.Instance.GetPanel().FadeInAsync(); yield return SceneLoader.Instance.LoadSceneAsync(sceneName); } } }