场景管理器

解释

SceneMgr 类是一个场景切换管理器,用于在 Unity 中切换场景。它有两种主要功能:同步和异步加载场景。这个管理器的设计基于一个基础的管理器类 BaseManager<T>, 并包含两个切换场景的方法(同步和异步),支持在切换场景完成后执行回调函数。

主要功能:

  1. 同步加载场景 LoadScene

    • 使用 Unity 内置的 SceneManager.LoadScene 来同步切换场景。
    • 同步切换场景意味着场景会立即切换,执行期间游戏会暂停,直到场景完全加载。
    • 可选地执行一个回调函数 callBack,当场景加载完成后调用。
  2. 异步加载场景 LoadSceneAsyn

    • 使用协程 (Coroutine) 来异步加载场景,场景的加载在后台进行,不会暂停游戏。场景加载的进度可以逐帧监控。
    • 异步加载通过 SceneManager.LoadSceneAsync,并利用 AsyncOperation 检查是否加载完成。
    • 每一帧加载进度都会通过事件中心 EventCenter 发送出去,外部可以订阅这个进度事件来更新 UI(比如进度条)。
    • 也可以在加载完成后执行回调函数 callBack

代码详细解释:

  1. 同步切换场景 LoadScene

    • LoadScene(string name, UnityAction callBack = null)
      • 使用场景名称 name 切换场景。
      • 切换完成后,调用可选的 callBack 回调函数。
  2. 异步切换场景 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

案例

假设我们有两个场景 SceneMgrScene1SceneMgrScene2,在主菜单中点击按钮后,加载游戏关卡场景,并在加载过程中显示进度条。

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);
    }
}

解释案例:

  1. 场景加载

    • 当点击主菜单中的开始按钮时,触发异步加载场景 SceneMgr.Instance.LoadSceneAsyn("SceneMgrScene2"),并传入 OnSceneLoadComplete 作为回调函数,当加载完成时调用此函数。
  2. 进度条显示

    • 在场景加载过程中,SceneMgr 会通过事件中心发送加载进度,每一帧更新进度条的值 progressBar.value = progress,进度条会反映加载的实际进度。
  3. 场景加载完成

    • 当异步场景加载完成后,进度条消失,并取消对进度更新事件的监听。

这个案例展示了如何使用 SceneMgr 进行场景切换,同时展示了异步加载时如何在 UI 上显示进度条。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值