Unity笔记——异步加载场景

本文详细介绍了Unity异步加载场景的原理和实现方法,旨在解决场景切换时的卡顿问题。通过创建加载场景B,异步加载目标场景C,确保游戏流程的平滑过渡。

1.什么是异步加载场景?

异步加载场景:顾名思义就是不影响当前游戏场景的运行的前提下加载新的场景。

其方法如下:

第一种加载方案:

Application.LoadLevelAsync("LoadScene");//销毁原场景

第二种加载方案:

Application.LoadLevelAdditiveAsync("loadScene");//不销毁原场景

以上两种方案已经过时目前本文所提及的是第三种方案:

UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(nextSceneName);  

2.为什么要异步加载场景

 

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

3. 异步加载场景的实现

通过将场景分为A、B、C三个场景,A场景开始;B场景诗加载场景;C场景是目标场景;

首先定义一个公共信息类,在类中定义一个静态变量用于存储需要加载的场景名字。

public class AppDefine
{
    public static string nextSceneName;
}

然后在A场景中添加代码触发场景切换:

//异步加载新场景  
public void LoadNewScene()  
{  
    //保存需要加载的目标场景  
    Appdefine.nextSceneName = "C";  
  
    SceneManager.LoadScene("B");        
}  

最后在B场景中添加脚本挂在Camera下:

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

public class AsyncLoadScene : MonoBehaviour  
{  
    public Slider loadingSlider;  //加载场景进度条,B场景中使用UGUI实现
  
    public Text loadingText;  //显示加载进度 %
  
    private float loadingSpeed = 1;  //加载速度,这里是进度条的读取速度
  
    private float targetValue;  //进度条目标的值/异步加载进度的值
  
    private AsyncOperation asyncLoad;  //定义异步加载的引用
  
    // Use this for initialization  
    void Start ()  
    {  
        loadingSlider.value = 0.0f;  //初始化进度条
  
        if (SceneManager.GetActiveScene().name == "B")  //如果当前活动场景是B
        {  
            //启动协程  
            StartCoroutine(AsyncLoading());  //开启协程进行异步加载
        }  
    }  
  
    IEnumerator AsyncLoading()  
    {  
        asyncLoad = SceneManager.LoadSceneAsync(Globe.nextSceneName);  
//阻止当加载完成自动切换
        asyncLoad.allowSceneActivation = false; 
        yield return operation; 
    } // Update is called once per frame 

    void Update()
    {
        targetValue = asyncLoad.progress;
        if (asyncLoad.progress >= 0.9f)
        {
            //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)
            //如果当前进度条value和目标值接近 设置进度条value为目标值 
            { loadingSlider.value = targetValue; }
        }
        loadingText.text = ((int)(loadingSlider.value * 100)).ToString() + "%"; if ((int)(loadingSlider.value * 100) == 100)
        //当进度条读取到百分之百时允许场景切换 
        { //允许异步加载完毕后自动切换场景 
            asyncLoad.allowSceneActivation = true;
        }
    }
} 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值