Unity教程之-解决异步加载Scene场景卡顿的问题

 

本篇unity3d教程我们来学下如何解决异步加载场景Scene卡顿的问题,关于异步加载,很多人都是卡住,然后就进场景了,中间进度条基本没作用了。
雨松大神讲过一篇异步加载的,但是同样也是有问题的,跟直接跳转没什么区别。
但事实上,只要加上一句话就可以完成了。


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教程到此结束,下篇再会