Unity實現場景加載功能
unity場景加載分為同步加載和異步加載,供大傢參考,具體內容如下
同步加載 loadScene
首先將前置工作做好。
創建一個項目工程,然後創建三個場景 loading00、loading01、loading02。每個場景分別創建一個cube、Sphere、Capsule 。然後打開File -> Build Settings, 然後將創建的 loading00、loading01、loading02拖拽到Scenes In Build中。如下圖:
然後再創建一個 loading.cs 腳本,然後寫上這段代碼:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class loading : MonoBehaviour { // Start is called before the first frame update void Start() { // 同步加載場景 SceneManager.LoadScene(1, LoadSceneMode.Additive); } // Update is called once per frame void Update() { } }
SceneManager.LoadScene(1, LoadSceneMode.Additive);
第一個參數是表示加載的場景序號,第二個參數是 加載場景後,是否刪除舊場景。
場景序號就是在 BuildSettings 中的序號如下圖:
當然,第一個參數也可以寫場景的路徑:
SceneManager.LoadScene(“Scenes/loading01”, LoadSceneMode.Additive);
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class loading : MonoBehaviour { // Start is called before the first frame update void Start() { // 同步加載場景 SceneManager.LoadScene("Scenes/loading01", LoadSceneMode.Additive); } // Update is called once per frame void Update() { } }
與上述代碼想過是一致的。
異步加載
異步加載需要先介 AsyncOperation 類
SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive) 這個是異步加載的函數,其參數的用法跟同步加載的用法一致,然後,返回值 是一個 As yncOperation 類。
AsyncOperation 的用處:
- AsyncOperation.isDone 這個是用來判斷加載是否完成。這個屬性是加載完並且跳轉成功後才會變成完成
- AsyncOperation.allowSceneActivation 這個是加載完後,是否允許跳轉,當為false時,即使場景加載完瞭,也不會跳轉
- AsyncOperation.progress 這個時表示加載場景的進度。實際上的值時 0 – 0.9, 當值為0.9的時候,場景就已經加載完成瞭。
我們要異步加載場景的話,一般都是需要用協程一起工作
代碼如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class loading : MonoBehaviour { // Start is called before the first frame update void Start() { StartCoroutine(Load()); } IEnumerator Load() { AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive); asyncOperation.allowSceneActivation = false; // 這裡限制瞭跳轉 // 這裡就是循環輸入進度 while(asyncOperation.progress < 0.9f) { Debug.Log(" progress = " + asyncOperation.progress); } asyncOperation.allowSceneActivation = true; // 這裡打開限制 yield return null; if(asyncOperation.isDone) { Debug.Log("完成加載"); } } // Update is called once per frame void Update() { } }
異步和同步的區別
異步不會阻塞線程,可以在加載過程中繼續去執行其他的一些代碼,(比如同時加載進度)而同步會阻塞線程,隻有加載完畢顯示後才能繼續執行之後的一些代碼。
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。