一般来说, 进入场景前默认都是场景加载的时候就已经人物等这些都是原本存在的。
那为什么需要专门有一个场景切换模块呢?
因为在实际的游戏中,游戏场景其实是空的,是通过配置文件去加载游戏场景,通过玩家的信息、选择等,动态创建玩家相应的游戏场景,因此我们需要有一个场景切换的模块,用于传递场景切换的信息给下一个游戏场景。所以场景切换模块是用于提供给外部一个场景切换的接口。
① 同步加载
在场景加载的过程中,不可以继续进行其余操作,要等到场景切换完成才可以。
/// <summary> /// 场景切换管理类 /// </summary> public class SceneLoadManager : Singleton<SceneLoadManager> { /// <summary> /// 场景切换 同步加载(场景加载完之后,再执行其余相关的方法) /// </summary> /// <param name="sceneName">加载的场景</param> /// <param name="func">切换场景要执行的方法</param> public void LoadScene(string sceneName, UnityAction func) { // 切换场景 SceneManager.LoadScene(sceneName); // 场景切换之后再执行相应的其余的加载 func(); }
② 异步加载
在切换场景的时候,通过为切换场景的方法开启协程,可以实现 场景切换的过程中 继续实现其余方法的加载。
在这个过程中,我们还可以利用加载进度 来让玩家知道场景加载时画面并不是卡死的,而且可以在加载过程中 开启协程,向外派发事件供外部监听。
/// <summary> /// 场景切换异步加载的封装 /// </summary> /// <param name="sceneName">加载的场景</param> /// <param name="func">切换场景要执行的方法</param> public void LoadSceneAsync(string sceneName, UnityAction func) { // 利用Mono管理器实现没有继承MonoBehavior开启协程 MonoManeger.GetInstance().StartCoroutine(LoadingSceneAsync(sceneName, func)); } /// <summary> /// 场景切换 异步加载(场景加载的过程中,可以同时执行其余相关的方法) /// </summary> /// <param name="sceneName">加载的场景</param> /// <param name="func">切换场景要执行的方法</param> public IEnumerator LoadingSceneAsync(string sceneName, UnityAction func) { AsyncOperation ao = SceneManager.LoadSceneAsync(sceneName); // 如果没有场景加载完成,通过协程实现进度的更新,可以用于事件分发,供外部监听 while (!ao.isDone) { //EventCenter.GetInstance().EventAddListener("LoadScenePorgress", ao.progress); yield return ao.progress; } yield return ao; func(); }
func方法就是进行动态加载的方法,想写什么都可以写。
转载链接 Unity游戏框架学习笔记——05场景切换模块