Unity中进行异步加载场景以及进度条显示加载进度

如有谬误,欢迎指正!
当我们进行游戏开发时,时常会进行场景切换,如果下个场景较大,切换时就会出现卡顿现象,甚至看起来像是"死机",非常影响用户体验,我们这时就可以运用异步加载,在界面上显示加载的进度条以提升用户体验,接下来我们就简略聊聊异步加载吧.
我要实现的功能是这样的:首先,第一个场景是一个UI界面,点击"开始加载"按钮进行加载下一场景,场景加载完成后自动跳转,通过文本和进度条显示加载进度,如图:

然后,第二个场景,也就是我们要加载的场景名为"Demo Valley",注意此场景必须加入到unity的build中才行(File->Build Setting):

接下来就该上代码了,如下(此脚本挂于Canvas上):

using UnityEngine;
using UnityEngine.SceneManagement;//注意引用命名空间
using System;
using UnityEngine.UI;

public class LoadScene : MonoBehaviour
{
    Slider slider;//滑动条
    Text text;//文本
    Button but;//按钮
    // 加载进度
    float loadPro = 0;

    // 用以接受异步加载的返回值
    AsyncOperation  AsyncOp = null;
    
    void Start()
    {
        Debug.Log("开始加载");

        slider = transform.Find("Slider"). GetComponent<Slider>();
        slider.value = 0;
        text = transform.Find("Text").GetComponent<Text>();
        but = transform.Find("Button").GetComponent<Button>();
        but.onClick.AddListener(StartLoad);//绑定按钮事件

    }

    //点击按钮,开始加载下一场景,文本和进度条显示加载进度
    void StartLoad()
    {
        AsyncOp = SceneManager.LoadSceneAsync("Demo Valley",LoadSceneMode.Single);//异步加载场景名为"Demo Valley"的场景,LoadSceneMode.Single表示不保留现有场景
        AsyncOp.allowSceneActivation = false;//allowSceneActivation =true表示场景加载完成后自动跳转,经测,此值默认为true
    }

    void Update()
    {
        if (AsyncOp!=null)//如果已经开始加载
        {
            loadPro = AsyncOp.progress; //获取加载进度,此处特别注意:加载场景的progress值最大为0.9!!!
        }
        if (loadPro >= 0.9f)//因为progress值最大为0.9,所以我们需要强制将其等于1
        {
            loadPro = 1;
        }
          slider.value = Mathf.Lerp(slider.value, loadPro,1*Time.deltaTime);//滑动块的value以插值的方式紧跟进度值
        if (slider.value > 0.99f)
        {
            slider.value = 1;
            AsyncOp.allowSceneActivation = true;
        }
        text.text =string.Format("{0:F0}%", slider.value*100);//文本中以百分比的格式显示加载进度
    }
}

此处需要注意的地方有以下几点:

  1. 加载场景的progress值最大为0.9!!!不知道其用意为何.
  2. AsyncOp.allowSceneActivation 表示场景加载完成后,是否自动跳转,为true时自动跳转.网上有说当其为false时,场景进度只加载至0.9不再加载,当将其更改为true后,继续加载剩下的0.1,因为没有想出合适的检测方法,所有没有检测真假。
  3. 本文提到的异步加载本身就是运用的协程进行的加载!网上有些用Coroutine和LoadSceneAsync合用进行的异步加载,不明其意.
  4. 在实际开发中,进度条的显示有可能会安排在一个新建的过度场景中,原理跟本文的原理相同,无非就是把异步加载的脚本挂在过度场景的Start()函数中而已.
  5. 此案例中加载场景我们用的SceneManager.LoadSceneAsync()来加载场景,当我们只加载一些预制体时,Resources.LoadAsync()的用法和注意事项与其基本相同.
  6. 我们之所以在StartLoad函数中将AsyncOp.allowSceneActivation = false,等slider.value > 0.99f时再使其为true,是为了避免UI中进度条还未达到100%时场景已经跳转的情况出现;而使用插值的方式使进度条的值趋近实际的加载进度是为了避免UI中进度条已经达到100%,但是场景还未加载完成的情况出现,也就是说,我们使用插值实际上就是在为场景加载的最后0.1争取时间.
    另有一篇博客供参考:unity所谓的异步加载几乎全部是协程,不是线程;MAP3加载时解压非常慢
  • 12
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Unity异步加载场景显示进度可以通过以下步骤实现: 1. 创建一个UI界面,用于显示加载进度。 2. 使用SceneManager.LoadSceneAsync()方法异步加载场景。 3. 在加载场景的同,使用AsyncOperation.progress属性获取加载进度,并将其显示在UI界面上。 4. 在场景加载完成后,隐藏UI界面。 下面是一个示例代码: ```csharp using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; using System.Collections; public class SceneLoader : MonoBehaviour { public Slider progressBar; public Text progressText; void Start() { StartCoroutine(LoadSceneAsync()); } IEnumerator LoadSceneAsync() { AsyncOperation operation = SceneManager.LoadSceneAsync("MyScene"); while (!operation.isDone) { float progress = Mathf.Clamp01(operation.progress / 0.9f); progressBar.value = progress; progressText.text = "Loading..." + (int)(progress * 100) + "%"; yield return null; } progressBar.gameObject.SetActive(false); progressText.gameObject.SetActive(false); } } ``` 在这个示例,我们使用了Slider和Text UI元素来显示加载进度。在Start()方法启动了一个协程来异步加载场景。在协程,我们使用AsyncOperation.progress属性获取加载进度,并将其转换为0到1之间的值。最后,我们使用SetActive()方法隐藏进度条和文本UI元素。 需要注意的是,AsyncOperation.progress属性的值在0到0.9之间,因为在此阶段Unity会在后台加载所有场景数据。只有在最后10%的间内,Unity才会开始实际加载场景,此AsyncOperation.progress的值将达到1。因此,在计算进度,我们需要将AsyncOperation.progress除以0.9来获得0到1之间的值。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五星出东方.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值