協程及非同步載入資源場景

京城下了一場大雪發表於2020-12-30

同步載入:在主執行緒中進行載入
非同步載入:單獨開闢一個載入的執行緒用來載入資源,不影響主執行緒的進行

協程

協程是在主執行緒執行的同時開啟另一段邏輯處理,來協同當前程式的執行

協程與多執行緒的區別

Unity中雖然可以開啟執行緒但是不能直接呼叫Unity中大部分的Api,協程可以代替執行緒,但協程不是多執行緒,只是在模擬多執行緒。
在多處理器下,從概念上來講,多執行緒程式同時執行多個執行緒,而在任意時刻只有一個協程在執行

協程的開啟

StartCoroutine(“協程函式名”,引數);
StartCoroutine(函式(引數));

協程函式的定義

返回值必須是IEnumerator介面型別的;
程式必須有yield return ;
協程中可以有引數;
協程函式執行先執行yield return之前的程式碼,之後跳轉出該程式,直到等待條件滿足,再跳轉回來執行yield return之後的程式碼。
private IEnumerator Test()
{
yield return 等待條件;
Print(“等待時間結束”);
}
協程函式中yield return 後跟的是等待條件
yield return null 等待一幀;
yield return WaitForSeconds(時間) 等待秒數;
yield break 直接跳出協程;
yield return 物件 等待某個物件完成某種操作,如載入資源,場景

資源

資源的同步載入

Resources.Load<型別>(“相對路徑”);
使用Resources.Load進行載入的時候如果載入的資源過大,因為在同一執行緒內進行載入,所以在載入沒完成之前不會進行以後的程式碼。所以程式會直接卡住。

資源的非同步載入

Resources.LoadAsync<型別>(“相對路徑”);
配合協程可以進行非同步載入資源
IEnumerator LoadResources()
{
ResourceRequest rr = Resources.LoadAsync("");
yield return rr;
}
該程式可以非同步載入資源,ResourceRequest引數中是資源載入過程中的資訊,例如載入是否完成

場景

場景的同步載入

SceneManager.LoadScene(“場景名”);
SceneManager.LoadScene(場景索引);
如果要載入的場景太大的話,程式會卡頓,在玩的遊戲中載入場景時會有一個載入場景進度條,如果在同一程式中載入場景就不能顯示載入進度。所以要用非同步載入。

場景的非同步載入

AsyncOperation 載入過程中的一些引數。
allowSceneActivation:場景載入完是否要直接跳轉。
isDone:載入完場景並且啟用才設定為true
progress:這個是載入進度,利用這個就可以實現進度條。當allowSceneActivation為true 時進度最高位1;當allowSceneActivation為false時進度最高就到0.9,或許是因為沒有啟用總差一點把
在這裡插入圖片描述
非同步載入的實現
在這裡插入圖片描述

相關文章