Unity實戰篇:實現場景切換畫面和進度條
阿新 • • 發佈:2018-11-26
我們在進行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