1. 程式人生 > >Unity實戰篇:實現場景切換畫面和進度條

Unity實戰篇:實現場景切換畫面和進度條

我們在進行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