2016年3月29日星期二

[Unity3D]讀取畫面之簡單進度條制作(Loading Screen)

之前轉換場景一直是用以下的方法:

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%的問題,他還處理了進度條君成長不順暢的問題,而且很詳㚼!

大神快拜!

1 則留言: