解释
SceneMgr
类是一个场景切换管理器,用于在 Unity 中切换场景。它有两种主要功能:同步和异步加载场景。这个管理器的设计基于一个基础的管理器类 BaseManager<T>
, 并包含两个切换场景的方法(同步和异步),支持在切换场景完成后执行回调函数。
主要功能:
-
同步加载场景
LoadScene
:- 使用 Unity 内置的
SceneManager.LoadScene
来同步切换场景。 - 同步切换场景意味着场景会立即切换,执行期间游戏会暂停,直到场景完全加载。
- 可选地执行一个回调函数
callBack
,当场景加载完成后调用。
- 使用 Unity 内置的
-
异步加载场景
LoadSceneAsyn
:- 使用协程 (
Coroutine
) 来异步加载场景,场景的加载在后台进行,不会暂停游戏。场景加载的进度可以逐帧监控。 - 异步加载通过
SceneManager.LoadSceneAsync
,并利用AsyncOperation
检查是否加载完成。 - 每一帧加载进度都会通过事件中心
EventCenter
发送出去,外部可以订阅这个进度事件来更新 UI(比如进度条)。 - 也可以在加载完成后执行回调函数
callBack
。
- 使用协程 (
代码详细解释:
-
同步切换场景
LoadScene
:LoadScene(string name, UnityAction callBack = null)
:- 使用场景名称
name
切换场景。 - 切换完成后,调用可选的
callBack
回调函数。
- 使用场景名称
-
异步切换场景
LoadSceneAsyn
:LoadSceneAsyn(string name, UnityAction callBack = null)
:- 使用协程异步加载场景,通过
MonoMgr
来启动协程。 ReallyLoadSceneAsyn(string name, UnityAction callBack)
:AsyncOperation
对象ao
负责监控异步场景的加载过程,ao.progress
会返回当前加载进度。- 每一帧调用事件中心
EventCenter.Instance.EventTrigger<float>(E_EventType.E_SceneLoadChange, ao.progress);
来触发进度事件,让外部知道当前加载进度。 - 加载完成后,执行回调函数
callBack
。
- 使用协程异步加载场景,通过
案例
假设我们有两个场景 SceneMgrScene1
和 SceneMgrScene2
,在主菜单中点击按钮后,加载游戏关卡场景,并在加载过程中显示进度条。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SceneLoader : MonoBehaviour
{
public Button startButton;
public Slider progressBar;
private void Start()
{
progressBar.gameObject.SetActive(false);
startButton.onClick.AddListener(() =>
{
progressBar.gameObject.SetActive(true);
EventCenter.Instance.AddEventListener<float>(E_EventType.E_SceneLoadChange, UpdateProgress);
SceneMgr.Instance.LoadSceneAsyn("SceneMgrScene2", () =>
{
Debug.Log("加载完成,切换场景成功");
});
});
}
void UpdateProgress(float progress)
{
progressBar.value = progress;
}
private void OnSceneLoadComplete()
{
progressBar.gameObject.SetActive(false);
EventCenter.Instance.RemoveEventListener<float>(E_EventType.E_SceneLoadChange, UpdateProgress);
}
}
解释案例:
-
场景加载:
- 当点击主菜单中的开始按钮时,触发异步加载场景
SceneMgr.Instance.LoadSceneAsyn("SceneMgrScene2")
,并传入OnSceneLoadComplete
作为回调函数,当加载完成时调用此函数。
- 当点击主菜单中的开始按钮时,触发异步加载场景
-
进度条显示:
- 在场景加载过程中,
SceneMgr
会通过事件中心发送加载进度,每一帧更新进度条的值progressBar.value = progress
,进度条会反映加载的实际进度。
- 在场景加载过程中,
-
场景加载完成:
- 当异步场景加载完成后,进度条消失,并取消对进度更新事件的监听。
这个案例展示了如何使用 SceneMgr
进行场景切换,同时展示了异步加载时如何在 UI 上显示进度条。