Unity游戏框架学习笔记——05场景切换模块
场景切换模块
要说在前头的话
今天发现唐老湿的教程收费了,但是B站前两个模块依旧是可以让大家免费看完的,完整的视频放在泰课了。
菜鸡我个人是不介意花钱学知识,别人本身也没有义务免费教你,干货满满的视频收费是无可厚非的,希望大家多多支持吧,菜鸡我是真的觉得很有用!
换了地址的指路牌:https://www.taikr.com/course/1062/task/31006/show.
正文
一般来说, 进入场景前默认都是场景加载的时候就已经人物等这些都是原本存在的。
那为什么需要专门有一个场景切换模块呢?
因为在实际的游戏中,游戏场景其实是空的,是通过配置文件去加载游戏场景,通过玩家的信息、选择等,动态创建玩家相应的游戏场景,因此我们需要有一个场景切换的模块,用于传递场景切换的信息给下一个游戏场景。所以场景切换模块是用于提供给外部一个场景切换的接口。
实现
① 同步加载
在场景加载的过程中,不可以继续进行其余操作,要等到场景切换完成才可以。
代码
/// <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();
}
在这个过程中,我们还可以利用加载进度来让玩家知道场景加载时画面并不是卡死的,而且可以在加载过程中开启协程,向外派发事件供外部监听。
补充
如果用到Unity自带的场景切换方法,即SceneManager.LoadScene()这些的时候,要在面板中选择Build Setting:
打开后将要进行切换的场景都添加进去:
否则Unity会报错。