Application.LoadLevel("SceneName")
因為這個方法比較懶和方便,但隨著場景內的東東越來多,轉場需時也開始越來越長,也因此在轉場時有了是不是卡住了或死機了的感覺。有見及此,小弟要開始製作一個有進度條的過場效果。然後找到Unity3D有以下的方法可以用:
Application.LoadLevelAsync ("SceneName");
剛開始滿失望的因為看到Unity Pro才可以用,然後發覺得原來Unity5已經可以免費使用了!關於它的API請到這裏:http://docs.unity3d.com/ScriptReference/Application.LoadLevelAsync.html
好了我們開始製作了~
首先我們要準備一個讀取畫面的Prefab,它需要
1. 一段說明文字,例如:讀取中......
2. 一個Slider
(順帶一提這是用uGui製作的,記得放在Canvas底下喔)
大約是這樣:
效果如下,自己整理好位置:
然後我把這個Prefab偷偷放在轉場前的場景,並偷偷用SetActive(false)先把它隱藏
首先我們需要在腳本建立以下三個變數,記得對應Prefab裏LoadingImage和loadingBar喔
public Slider loadingBar;
public GameObject loadingImage;
private AsyncOperation _async;
按下按鈕後就可以把隱藏的LoadingImage秀出來,並用StartCoroutine執行LoadKevelWithBar
loadingImage.SetActive (true);
StartCoroutine (LoadLevelWithBar ("MainMenuScene"));
然後就是LoadingLevelAsync出場的時間!Async就是Asynchronous非同步的意思,所以它可以在後台做不影響程式讀取資源,也因此用到Enumerator函式,可以isDone檢查讀取完成與否~
想了解一下StartCoroutine可以到這裏:
http://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html
LoadingBar是Slider的關係,可以把它的value跟_async.progress對等就好了~
IEnumerator LoadLevelWithBar (string level)
{
_async = Application.LoadLevelAsync(level);
while(!_async.isDone)
{
loadingBar.value=_async.progress;
yield return null;
}
}
然後就做好了啦~效果圖如下:
哈哈~因為遊戲介面還不好意思秀出來,跟你們開個玩笑,歡迎留言回應呀 XD (圖源:靠北遊戲業)
------------------------------------------------------------------------------------------------------------------
後記
有網友問到進度條君卡在0.9 / 90%是什麼原因,小弟問過Google大神發現很多時候是把allowSceneActivation設定為false,把它設定為true就好了。然後,
小弟發現一個很完善的讀取畫面教學!!!
除了卡在0.9 / 90%的問題,他還處理了進度條君成長不順暢的問題,而且很詳㚼!
大神快拜!
謝謝您的教學
回覆刪除收穫良多