一、简介
在游戏开发中,场景切换是一个常见而重要的功能。为了更方便地管理场景切换的逻辑,场景跳转管理器就显得尤为重要了,下面我将实现一个简单的场景跳转管理器来实现同步或异步的切换场景。
二、代码实现
using System.Collections;
using Mr.Le.Utility.Singleton;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
namespace Mr.Le.Utility.Manager
{
/// <summary>
/// 场景跳转管理器
/// </summary>
public class LoadSceneManager : NoMonoSingleton<LoadSceneManager>
{
/// <summary>
/// 重新切换到当前场景
/// </summary>
public void LoadActiveScene()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
/// <summary>
/// 切换到下一个场景
/// </summary>
/// <param name="isCyclical">是否循环切换</param>
public void LoadNextScene(bool isCyclical = false)
{
int buildIndex = SceneManager.GetActiveScene().buildIndex + 1;
if (buildIndex > SceneManager.sceneCountInBuildSettings - 1)
{
if (isCyclical)
buildIndex = 0;
else
{
Debug.LogError($"加载场景失败!需要加载的场景索引超出!");
return;
}
}
SceneManager.LoadScene(buildIndex);
}
/// <summary>
/// 切换到上一个场景
/// </summary>
/// <param name="isCyclical">是否循环切换</param>
public void LoadPreviousScene(bool isCyclical = false)
{
int buildIndex = SceneManager.GetActiveScene().buildIndex - 1;
if (buildIndex < 0)
{
if (isCyclical)
buildIndex = SceneManager.sceneCountInBuildSettings - 1;
else
{
Debug.LogError($"加载场景失败!需要加载的场景索引超出!");
return;
}
}
SceneManager.LoadScene(buildIndex);
}
/// <summary>
/// 通过场景名异步加载场景
/// </summary>
/// <param name="sceneName">需要跳转的场景索引</param>
/// <param name="loading">场景加载中执行的回调函数</param>
/// <param name="completed">场景加载完成后执行的回调函数</param>
/// <param name="setActiveAfterCompleted">手动控制场景加载完成后是否跳转</param>
/// <param name="mode">场景加载的模式(叠加/不叠加),默认不叠加</param>
public void LoadSceneAsync(string sceneName, UnityAction<float> loading = null,
UnityAction<AsyncOperation> completed = null, bool setActiveAfterCompleted = true,
LoadSceneMode mode = LoadSceneMode.Single)
{
MonoManager.Instance.StartCoroutine(LoadSceneCoroutine(sceneName, loading, completed,
setActiveAfterCompleted, mode));
}
IEnumerator LoadSceneCoroutine(string sceneName, UnityAction<float> loading = null,
UnityAction<AsyncOperation> completed = null, bool setActiveAfterCompleted = true,
LoadSceneMode mode = LoadSceneMode.Single)
{
//开始异步加载资源
AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(sceneName, mode);
asyncOperation.allowSceneActivation = false;
//等待资源加载完毕
while (asyncOperation.progress < .9f)
{
loading?.Invoke(asyncOperation.progress);
yield return null;
}
//当asyncOperation.allowSceneActivation为false,则asyncOperation.progress最多只能达到0.9,我们人为把它凑成1,方便进度条显示
loading?.Invoke(1);
asyncOperation.allowSceneActivation = setActiveAfterCompleted;
//加载资源完毕后需要执行的逻辑
completed?.Invoke(asyncOperation);
}
/// <summary>
/// 通过索引异步加载场景
/// </summary>
/// <param name="sceneIndex">需要跳转的场景索引</param>
/// <param name="loading">场景加载中执行的回调函数</param>
/// <param name="completed">场景加载完成后执行的回调函数</param>
/// <param name="setActiveAfterCompleted">手动控制场景加载完成后是否跳转</param>
/// <param name="mode">场景加载的模式(叠加/不叠加),默认不叠加</param>
public void LoadSceneAsync(int sceneIndex, UnityAction<float> loading = null,
UnityAction<AsyncOperation> completed = null, bool setActiveAfterCompleted = true,
LoadSceneMode mode = LoadSceneMode.Single)
{
MonoManager.Instance.StartCoroutine(LoadSceneCoroutine(sceneIndex, loading, completed,
setActiveAfterCompleted, mode));
}
IEnumerator LoadSceneCoroutine(int sceneIndex, UnityAction<float> loading = null,
UnityAction<AsyncOperation> completed = null, bool setActiveAfterCompleted = true,
LoadSceneMode mode = LoadSceneMode.Single)
{
//开始异步加载资源
AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(sceneIndex, mode);
asyncOperation.allowSceneActivation = false;
//等待资源加载完毕
while (asyncOperation.progress < .9f)
{
loading?.Invoke(asyncOperation.progress);
yield return null;
}
//当asyncOperation.allowSceneActivation为false,则asyncOperation.progress最多只能达到0.9,我们人为把它凑成1,方便进度条显示
loading?.Invoke(1);
asyncOperation.allowSceneActivation = setActiveAfterCompleted;
//加载资源完毕后需要执行的逻辑
completed?.Invoke(asyncOperation);
}
}
}
三、总结
以上就全部内容,这个场景跳转管理器都旨在简化代码、提高可维护性和代码复用性,并为开发者提供更多掌控场景切换流程的权力。