【Unity3D自学记录】异步加载卡顿问题解决

关于异步加载,很多人都是卡住,然后就进场景了,中间进度条基本没作用了。

雨松大神讲过一篇异步加载的,但是同样也是有问题的,跟直接跳转没什么区别。

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

yield return new WaitForEndOfFrame();
等待直到所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前。


代码如下:


using UnityEngine;  
using System.Collections;  
  
public class Loading : MonoBehaviour {  
  
    private float fps = 10.0f;  
    private float time;  
    //一组动画的贴图,在编辑器中赋值。  
    public Texture2D[] animations;  
    private int nowFram;  
    //异步对象  
    AsyncOperation async;  
  
    //读取场景的进度,它的取值范围在0 - 1 之间。  
    int progress = 0;  
  
    void Start()  
    {  
        //在这里开启一个异步任务,  
        //进入loadScene方法。  
        StartCoroutine(loadScene());  
    }  
  
    //注意这里返回值一定是 IEnumerator  
    IEnumerator loadScene()  
    {  
        yield return new 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);  
  
    }  
  
}  


你可能感兴趣的:(Unity3D,Unity3D_技术)