Unity管理器-场景跳转

一、简介

       在游戏开发中,场景切换是一个常见而重要的功能。为了更方便地管理场景切换的逻辑,场景跳转管理器就显得尤为重要了,下面我将实现一个简单的场景跳转管理器来实现同步或异步的切换场景。

二、代码实现

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

三、总结

        以上就全部内容,这个场景跳转管理器都旨在简化代码、提高可维护性和代码复用性,并为开发者提供更多掌控场景切换流程的权力。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值