120 lines
3.4 KiB
C#
120 lines
3.4 KiB
C#
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<SceneLoader>
|
|
{
|
|
#region 场景转换参数
|
|
|
|
private AsyncOperationHandle _loadHandle;
|
|
private string _sceneToLoad;
|
|
private bool _isLoading;
|
|
|
|
private readonly SceneData _data = new();
|
|
|
|
public override void OnSingletonInit()
|
|
{
|
|
StorageSystem.Instance.RegisterData(_data);
|
|
}
|
|
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// 同步场景转换
|
|
/// </summary>
|
|
/// <param name="targetScene">目标场景</param>
|
|
public void LoadScene(string targetScene, Action onComplete = null)
|
|
{
|
|
StartCoroutine(LoadSceneAsync(targetScene, onComplete));
|
|
}
|
|
|
|
/// <summary>
|
|
/// 异步场景转换
|
|
/// </summary>
|
|
/// <param name="targetScene">目标场景</param>
|
|
/// <returns></returns>
|
|
public IEnumerator LoadSceneAsync(string targetScene, Action onComplete = null)
|
|
{
|
|
if (_isLoading)
|
|
{
|
|
yield return null;
|
|
}
|
|
else
|
|
{
|
|
// 场景转换参数
|
|
_isLoading = true;
|
|
_sceneToLoad = targetScene;
|
|
|
|
UIManager.Instance.GetPanel<InfoPanel>().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<InfoPanel>().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<PlayToolPanel>().FadeInAsync();
|
|
yield return SceneLoader.Instance.LoadSceneAsync(sceneName);
|
|
}
|
|
}
|
|
} |