非同步載入卡頓問題解決
阿新 • • 發佈:2019-02-05
關於非同步載入,很多人都是卡住,然後就進場景了,中間進度條基本沒作用了。
雨鬆大神講過一篇非同步載入的,但是同樣也是有問題的,跟直接跳轉沒什麼區別。
但事實上,只要加上一句話就可以完成了。
- yield returnnew WaitForEndOfFrame();
程式碼如下:
- using UnityEngine;
- using System.Collections;
- publicclass Loading : MonoBehaviour {
-
privatefloat fps = 10.0f;
- privatefloat time;
- //一組動畫的貼圖,在編輯器中賦值。
- public Texture2D[] animations;
- privateint nowFram;
- //非同步物件
- AsyncOperation async;
- //讀取場景的進度,它的取值範圍在0 - 1 之間。
- int progress = 0;
- void Start()
- {
- //在這裡開啟一個非同步任務,
- //進入loadScene方法。
-
StartCoroutine(loadScene());
- }
- //注意這裡返回值一定是 IEnumerator
- IEnumerator loadScene()
- {
- yield returnnew WaitForEndOfFrame();//加上這麼一句就可以先顯示載入畫面然後再進行載入
- async = Application.LoadLevelAsync(Globe.loadName);
- //讀取完畢後返回, 系統會自動進入C場景
- yield return async;
- }
-
void OnGUI()
- {
- //因為在非同步讀取場景,
- //所以這裡我們可以重新整理UI
- DrawAnimation(animations);
- }
- void Update()
- {
- //在這裡計算讀取的進度,
- //progress 的取值範圍在0.1 - 1之間, 但是它不會等於1
- //也就是說progress可能是0.9的時候就直接進入新場景了
- //所以在寫進度條的時候需要注意一下。
- //為了計算百分比 所以直接乘以100即可
- progress = (int)(async.progress *100);
- //有了讀取進度的數值,大家可以自行製作進度條啦。
- Debug.Log("xuanyusong" +progress);
- }
- //這是一個簡單繪製2D動畫的方法,沒什麼好說的。
- void DrawAnimation(Texture2D[] tex)
- {
- time += Time.deltaTime;
- if(time >= 1.0 / fps){
- nowFram++;
- time = 0;
- if(nowFram >= tex.Length)
- {
- nowFram = 0;
- }
- }
- GUI.DrawTexture(new Rect( 100,100,40,60) ,tex[nowFram] );
- //在這裡顯示讀取的進度。
- GUI.Label(new Rect( 100,180,300,60), "lOADING!!!!!" + progress);
- }
- }