场景异步加载

场景异步加载

版权声明:本文为博主原创文章,未经博主允许不得转载。blog.liujunliang.com.cn https://blog.csdn.net/qq_33747722/article/details/72582213
异步加载场景分为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场景

最后附上效果图


---------------------
作者:即步
来源:CSDN
原文:https://blog.csdn.net/qq_33747722/article/details/72582213
版权声明:本文为博主原创文章,转载请附上博文链接!