Files
aibis-dream/Assets/Scripts/Game Loop/SceneLoader.cs
T
dingyuntian 9f20ef52d8 UI工具翻新
1. 增加UI工具
2. 增加设置页面
3. GameLoop更新
4. 导入ActionKit工具
2025-04-21 18:53:30 +08:00

105 lines
2.8 KiB
C#

using System;
using System.Collections;
using AibisDream.Framework;
using AibisDream.Kit;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.SceneManagement;
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)
{
StartCoroutine(LoadSceneAsync(targetScene));
}
/// <summary>
/// 异步场景转换
/// </summary>
/// <param name="targetScene">目标场景</param>
/// <returns></returns>
public IEnumerator LoadSceneAsync(string targetScene)
{
if (_isLoading)
{
yield return null;
}
else
{
// 场景转换参数
_isLoading = true;
_sceneToLoad = targetScene;
if (!string.IsNullOrEmpty(_data.sceneName))
{
yield return Addressables.UnloadSceneAsync(_loadHandle);
}
_loadHandle = Addressables.LoadSceneAsync(_sceneToLoad, LoadSceneMode.Additive);
yield return _loadHandle;
EnumEventSystem.Global.Send(EventEnum.SceneLoad, _sceneToLoad);
_data.sceneName = _sceneToLoad;
_isLoading = false;
}
}
public IEnumerator UnloadSceneAsync()
{
if (_isLoading)
{
yield return null;
}
else
{
_isLoading = true;
if (_loadHandle.IsValid())
{
yield return Addressables.UnloadSceneAsync(_loadHandle);
_data.sceneName = null;
EnumEventSystem.Global.Send(EventEnum.SceneUnload);
}
_isLoading = false;
}
}
public void UnloadScene()
{
StartCoroutine(UnloadSceneAsync());
}
}
[Serializable]
[LoadIndex(1)]
public class SceneData : IData
{
public string sceneName;
public IEnumerator Load()
{
yield return SceneLoader.Instance.LoadSceneAsync(sceneName);
}
}
}