Unity版本 5.2.2
當我們執行場景跳轉的時候,經常會出現游戲頓的情況,為了過度掉這段卡頓的情況,我們可以在創建一個新的場景,專門用來加載將要跳轉的下一個場景。
通常情況下這個新創建的場景是用來加載下一個即將跳轉的場景的,一般使用異步加載。
異步加載需要用到協同加載:
什么是協程:協同進程,在主程序運行開始時同事運行開啟另一段邏輯處理,來協同當前程序的執行。但協程不是開啟了另一個線程。在Unity中是不允許出現兩個線程的。
協程的開啟需要到MonoBehavior.StartCoroutine方法開啟一個協程;所以協程必須在MonoBehavior或繼承自MonoBehavior的類中進行調用;
StartCoroutine(String methodName)和StartCoroutine(IEnumerator Routine)都可以開啟一個協程
傳參的函數一定要寫 yield rerurn;
區別在於:使用字符串作為參數時,開啟線程時最多只能傳遞一個參數,並且性能小號會更大一點,而使用IEnumertor routine 作為參數時則沒有這個限制。
在Unity中使用StopCoroutine(String methodName)來終止一個協程,使用StopAllCoroutine來終止所有的協程;
還有一種方法是將協程所在的gameobject對象的active屬性設置為false 當再次設置active屬性為true的時候,協程不會再開啟;但是將協同程序所在腳本的enabled設置為false則不會生效;
異步加載:
第一種異步加載的方法:
Application.LoadLevelAsync("yourScene"); 這種加載加載完這個界面后會刪除上一個界面的緩存;
第二種異步加載的方法:
Application.LoadLevelAsync("yourScene");這種加載 加載完成后不會刪除上一個界面的緩存,會對內存造成一些負擔;
這兩個加載的方法的返回值是AsyncOperation對象。通過該對象能夠獲取到游戲加載的進度;
using UnityEngine;
using System.Collections;
public class LoadingNextScene : MonoBehaviour {
private AsyncOperation asy;
public UIProgressBar progressB;
void Start () {
if(progressB)
progressB.value = 0;
StartCoroutine(loadScene());
}
void Update () {
// asy.progress在等於0.9的時候會跳轉,因此在0.9的時候進度條要走滿;
if(asy.progress< 0.9f)
progressB.value = asy.progress;
else
progressB.value = 1;
}
IEnumerator loadScene()
{
asy = Application.LoadLevelAsync("Start");
yield return asy;//;¾Đ4”yield return”下M â
}
}