Unity实战篇:实现场景切换画面和进度条

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15020543/article/details/84289872

我们在进行Unity开发时,场景切换是不可避免的。例如MOBA从组队房间到游戏场景,MMO传送,以及吃鸡的从素质广场到荒岛,场景的切换势必要加载大量的数据以及各个模块的初始化工作。那么,如果要加载的场景过大,而用户的硬盘或者其他硬件性能不够强劲,那么画面就会卡住,等待很长一段时间,非常影响用户体验

场景切换中间的过渡就在所难免。

比如这个(很赞吧~哈哈哈(旁白:又犯病了))

那么我们今天也实现一下

首先是场景制作

注意要在每一个场景都要加上这些组件。并且将他们初始设为不可见

然后是代码,用到了SceneManager的异步加载,不了解的小伙伴可以去看一下

https://blog.csdn.net/qq_15020543/article/details/84261358

代码(无需挂载)

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

namespace Scenes.Scripts.StatePattern.RealSample
{
    public class SceneStateController
    {
        private ISceneState m_State;
        private bool m_bRunBegin = false;

        /// <summary>
        /// 异步加载
        /// </summary>
        private AsyncOperation _asyncOperation;

        /// <summary>
        /// 加载UI
        /// </summary>
        private GameObject _loadingPanel;

        /// <summary>
        /// 加载进度条
        /// </summary>
        private Slider _loadingSlider;

        /// <summary>
        /// 文本
        /// </summary>
        private Text _loadingText;

        public SceneStateController()
        {
        }

        public void SetState(ISceneState state, string LoadSceneName)
        {
            m_bRunBegin = false;
            LoadScene(LoadSceneName);

            if (m_State != null)
            {
                m_State.StateEnd();
            }

            m_State = state;
        }

        /// <summary>
        /// 加载场景
        /// </summary>
        /// <param name="loadSceneName">场景名</param>
        private void LoadScene(string loadSceneName)
        {
            if (string.IsNullOrEmpty(loadSceneName))
            {
                return;
            }

            _loadingPanel = GameObject.Find("Canvas").transform.Find("Loading").gameObject;
            _loadingPanel.SetActive(true);
            _loadingSlider = _loadingPanel.transform.Find("Slider").GetComponent<Slider>();
            _loadingText = _loadingPanel.transform.Find("Slider/Text").GetComponent<Text>();
            _asyncOperation = SceneManager.LoadSceneAsync(loadSceneName);
        }

        /// <summary>
        /// 每帧更新
        /// </summary>
        public void StateUpdate()
        {
            //如果上一个场景还没有加载完,那就让他继续加载
            if (_asyncOperation != null)
            {
                _asyncOperation.allowSceneActivation = false;
                //因为场景很小,所以一下子就加载完了,所以这里让它加载完不自动跳转,等用户按下鼠标左键再跳转
                if (_asyncOperation.progress >= 0.85)
                {
                    _loadingSlider.value = 1;
                }
                else
                {
                    _loadingSlider.value = _asyncOperation.progress;
                }

                if (_loadingText)
                {
                    if (_loadingSlider.value != 1.0f)
                        _loadingText.text = "加载中。。。" + (_loadingSlider.value * 100).ToString() + "%";
                }

                if (Input.GetMouseButtonDown(0))
                {
                    _asyncOperation.allowSceneActivation = true;
                }

                if (!_asyncOperation.isDone)
                    return;
            }

            if (m_State != null && m_bRunBegin == false)
            {
                m_State.StateBegin();
                m_bRunBegin = true;
            }

            if (m_State != null)
            {
                m_State.StateUpdate();
            }
        }
    }
}

运行截图

可能有的小伙伴没看懂,欢迎提问。

完整工程

https://gitee.com/NKG/DesignPatterns/blob/master/DesignPatterns.unitypackage

猜你喜欢

转载自blog.csdn.net/qq_15020543/article/details/84289872