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

Unity异步加载场景与加载进度条

2017-05-20 17:40 666 查看
异步加载场景分为A、B、C三个场景

A场景是开始场景;B场景是加载场景(进度条加载显示);C场景是目标场景

在A场景中添加一个按钮,触发函数:

//异步加载新场景
public void LoadNewScene()
{
//保存需要加载的目标场景
Globe.nextSceneName = "Scene";

SceneManager.LoadScene("Loading");
}


在B场景中添加一个脚本,挂载到Camera下

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class Globe
{
public static string nextSceneName;
}

public class AsyncLoadScene : MonoBehaviour
{
public Slider loadingSlider;

public Text loadingText;

private float loadingSpeed = 1;

private float targetValue;

private AsyncOperation operation;

// Use this for initialization
void Start ()
{
loadingSlider.value = 0.0f;

if (SceneManager.GetActiveScene().name == "Loading")
{
//启动协程
StartCoroutine(AsyncLoading());
}
}

IEnumerator AsyncLoading()
{
operation = SceneManager.LoadSceneAsync(Globe.nextSceneName);
//阻止当加载完成自动切换
operation.allowSceneActivation = false;

yield return operation;
}

// Update is called once per frame
void Update ()
{
targetValue = operation.progress;

if (operation.progress >= 0.9f)
{
//operation.progress的值最大为0.9
targetValue = 1.0f;
}

if (targetValue != loadingSlider.value)
{
//插值运算
loadingSlider.value = Mathf.Lerp(loadingSlider.value, targetValue, Time.deltaTime * loadingSpeed);
if (Mathf.Abs(loadingSlider.value - targetValue) < 0.01f)
{
loadingSlider.value = targetValue;
}
}

loadingText.text = ((int)(loadingSlider.value * 100)).ToString() + "%";

if ((int)(loadingSlider.value * 100) == 100)
{
//允许异步加载完毕后自动切换场景
operation.allowSceneActivation = true;
}
}
}


这里需要注意的是使用AsyncOperation.allowSceneActivation属性来对异步加载的场景进行控制

为true时,异步加载完毕后将自动切换到C场景

最后附上效果图



个人网站:www.liujunliang.com.cn

博客地址:blog.liujunliang.com.cn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: