异步加载场景

Unity版本 5.2.2

当我们执行场景跳转的时候,经常会出现游戏顿的情况,为了过度掉这段卡顿的情况,我们可以在创建一个新的场景,专门用来加载将要跳转的下一个场景。

通常情况下这个新创建的场景是用来加载下一个即将跳转的场景的,一般使用异步加载。

异步加载需要用到协同加载:

什么是协程:协同进程,在主程序运行开始时同事运行开启另一段逻辑处理,来协同当前程序的执行。但协程不是开启了另一个线程。在Unity中是不允许出现两个线程的。

协程的开启需要到MonoBehavior.StartCoroutine方法开启一个协程;所以协程必须在MonoBehavior或继承自MonoBehavior的类中进行调用;

StartCoroutine(String methodName)和StartCoroutine(IEnumerator Routine)都可以开启一个协程

传参的函数一定要写 yield rerurn;

区别在于:使用字符串作为参数时,开启线程时最多只能传递一个参数,并且性能小号会更大一点,而使用IEnumertor routine 作为参数时则没有这个限制。

在Unity中使用StopCoroutine(String methodName)来终止一个协程,使用StopAllCoroutine来终止所有的协程;

还有一种方法是将协程所在的gameobject对象的active属性设置为false 当再次设置active属性为true的时候,协程不会再开启;但是将协同程序所在脚本的enabled设置为false则不会生效;

异步加载:

第一种异步加载的方法:

  Application.LoadLevelAsync("yourScene"); 这种加载加载完这个界面后会删除上一个界面的缓存;

第二种异步加载的方法:

  Application.LoadLevelAsync("yourScene");这种加载 加载完成后不会删除上一个界面的缓存,会对内存造成一些负担;

这两个加载的方法的返回值是AsyncOperation对象。通过该对象能够获取到游戏加载的进度;

 

 

using UnityEngine;
using System.Collections;


public class LoadingNextScene : MonoBehaviour {
private AsyncOperation asy;
public UIProgressBar progressB;

void Start () {
if(progressB)
progressB.value = 0;
StartCoroutine(loadScene());
}

void Update () {
// asy.progress在等于0.9的时候会跳转,因此在0.9的时候进度条要走满;
if(asy.progress< 0.9f)
progressB.value = asy.progress;
else
progressB.value = 1;
}


IEnumerator loadScene()

{
asy = Application.LoadLevelAsync("Start");
yield return asy;//;¾Đ4”yield return”下M â
}
}

 

posted on 2017-04-12 20:48  FingerCaster  阅读(3238)  评论(0编辑  收藏  举报

导航