您的位置:首页 > 移动开发 > Unity3D

Unity3d之异步加载的研究

2016-01-11 15:08 344 查看

Unity加载场景有两种方式,同步加载和异步加载.

同步加载:

第一种:

读取新关卡后立即切换,其参数为所读取新关卡的名称或索引。

Application.LoadLevel ("XXX ");

第二种:

加载一个新的场景,当前场景不会被销毁。

Application.LoadLevelAdditive ("XXX ");

XXX可以是场景名,也可以是加载场景的序号:



这里就可以直接写方法进行场景的跳转,这个方法对于场景小,资源少的情况可以,要是遇到资源大的场景,就会卡,这种情况就要用到异步加载了。

异步加载

异步加载场景的⽅方式分为两种:

第一种:

异步加载新游戏场景,当新场景加载完成后进⼊入新场景并且销毁之前

的场景。

Application.LoadLevelAsync ("XXX");

第二种:

同样异步加载新场景,新场景加载完毕后,保留之前场景的游戏对象

并且进入新场景。

Application.LoadLevelAdditiveAsync ("XXX ");

这里的XXX 我测试用场景编号会有错误,就用了场景名。
这个在游戏里我们会用到进度条。我这里用NGUI做了一个进度条,在UIRoot上挂上如下脚本
using UnityEngine;
using System.Collections;

public class BackVillage : MonoBehaviour {
private AsyncOperation async;//异步加载的对象
private int Progress = 0;//定义进度条数
private UISlider slider;//定义UISlider对象
private GameObject sli;//定义组件sli用来表示进度条
void Awake()
{
//在Awake里初始化
slider = transform.Find("Slider").GetComponent<UISlider>();
sli = GameObject.Find("Slider");
}
void Start()
{   //在Start里将进度条隐藏
sli.SetActive(false);
}

void Back()
{     //按B跳转场景,显示进度条
if (Input.GetKeyDown(KeyCode.B))
{
sli.SetActive(true);
StartCoroutine(LoadAsync());
}
}
IEnumerator LoadAsync()
{
async = Application.LoadLevelAsync("scene1");//加上场景名
async.allowSceneActivation = false;//不激活场景转换
yield return async;
}
void Update()
{
Back();
if (async == null)
{
return;
}
int toProcess;

if (async.progress < 0.9f)
{

toProcess = (int)(async.progress * 100);//因为async是0-1的小数

}
else//当progress大于0.9时,直接给toProcess赋值100,因为这个值不可能到达100
{
toProcess = 100;
}

if (Progress < toProcess)
{
Progress++;
}

slider.value = Progress / 100f;

if (Progress == 100)
{
async.allowSceneActivation = true;
}
}
}

这样就达到了异步加载场景了。要想实现跳转场景后保留一下不想删除的物体,可以用我之前提到的DontDestroyOnLoad()方法,具体怎么用,以前的博客写过,这里就不写了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息