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 â
}
}