1. 程式人生 > >非同步載入卡頓問題解決

非同步載入卡頓問題解決

關於非同步載入,很多人都是卡住,然後就進場景了,中間進度條基本沒作用了。

雨鬆大神講過一篇非同步載入的,但是同樣也是有問題的,跟直接跳轉沒什麼區別。

但事實上,只要加上一句話就可以完成了。

  1. yield returnnew WaitForEndOfFrame();  
等待直到所有的攝像機和GUI被渲染完成後,在該幀顯示在螢幕之前。

程式碼如下:

  1. using UnityEngine;    
  2. using System.Collections;    
  3. publicclass Loading : MonoBehaviour {    
  4.     privatefloat fps = 10.0f;    
  5.     privatefloat time;    
  6.     //一組動畫的貼圖,在編輯器中賦值。  
  7.     public Texture2D[] animations;    
  8.     privateint nowFram;    
  9.     //非同步物件  
  10.     AsyncOperation async;    
  11.     //讀取場景的進度,它的取值範圍在0 - 1 之間。  
  12.     int progress = 0;    
  13.     void Start()    
  14.     {    
  15.         //在這裡開啟一個非同步任務,  
  16.         //進入loadScene方法。  
  17.         StartCoroutine(loadScene());    
  18.     }    
  19.     //注意這裡返回值一定是 IEnumerator  
  20.     IEnumerator loadScene()    
  21.     {    
  22.         yield returnnew WaitForEndOfFrame();//加上這麼一句就可以先顯示載入畫面然後再進行載入
  23.         async = Application.LoadLevelAsync(Globe.loadName);    
  24.         //讀取完畢後返回, 系統會自動進入C場景  
  25.         yield return async;    
  26.     }    
  27.     void OnGUI()    
  28.     {    
  29.         //因為在非同步讀取場景,  
  30.         //所以這裡我們可以重新整理UI  
  31.         DrawAnimation(animations);    
  32.     }    
  33.     void Update()    
  34.     {    
  35.         //在這裡計算讀取的進度,  
  36.         //progress 的取值範圍在0.1 - 1之間, 但是它不會等於1  
  37.         //也就是說progress可能是0.9的時候就直接進入新場景了  
  38.         //所以在寫進度條的時候需要注意一下。  
  39.         //為了計算百分比 所以直接乘以100即可  
  40.         progress =  (int)(async.progress *100);    
  41.         //有了讀取進度的數值,大家可以自行製作進度條啦。  
  42.         Debug.Log("xuanyusong" +progress);    
  43.     }    
  44.     //這是一個簡單繪製2D動畫的方法,沒什麼好說的。  
  45.     void   DrawAnimation(Texture2D[] tex)    
  46.     {    
  47.         time += Time.deltaTime;    
  48.          if(time >= 1.0 / fps){    
  49.              nowFram++;    
  50.              time = 0;    
  51.              if(nowFram >= tex.Length)    
  52.              {    
  53.                 nowFram = 0;    
  54.              }    
  55.         }    
  56.         GUI.DrawTexture(new Rect( 100,100,40,60) ,tex[nowFram] );    
  57.         //在這裡顯示讀取的進度。  
  58.         GUI.Label(new Rect( 100,180,300,60), "lOADING!!!!!" + progress);    
  59.     }    
  60. }