【UGUI】如何制作场景加载进度条

目录

一、步骤

二、异步操作AsyncOperation介绍

三、伪进度条


一、步骤

        首先,小伙伴们要确保至少有两个场景并已添加至“Scenes In Build”(File > Build Settings... > Add Open Scenes),也可以通过拖拽的方式将场景添加,接着创建UI元素,包括按钮、进度条、文本框,按钮用于执行跳转(比如返回菜单、进入下一关卡等等),进度条及文本框用于显示进度百分比及文本提示“按下任意键继续”,样式根据自己需要进行设置。

        第二步,创建一个场景加载器的脚本,命名为UIManager,添加给Canvas,在脚本中使用Unity的异步加载场景API(例如SceneManager.LoadSceneAsync,在第二部分介绍)来加载场景。在加载场景的过程中,使用AsyncOperation类来获取加载进度。可以使用AsyncOperation.progress属性来获取进度百分比。代码如下:

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

public class UIManager : MonoBehaviour
{
    public GameObject progressPanel;//进度条容器面板
    public Slider slider;//进度条
    public TextMeshProUGUI progressText;//进度文本
    public TextMeshProUGUI noticeText;//提示文本

    public void LoadScene()
    {
        StartCoroutine(LoadSceneAsync());
    }
    IEnumerator LoadSceneAsync()
    {
        progressPanel.SetActive(true);//打开进度条面板
        AsyncOperation operation = SceneManager.LoadSceneAsync(1);//跳转场景,根据实际修改
        operation.allowSceneActivation = false;//不要让场景激活,直到你允许它
        while (!operation.isDone)
        {
            float progress = Mathf.Clamp01(operation.progress / 0.9f);//确保进度在0到1之间
            slider.value = progress;
            progressText.text = string.Format("{0}%", progress * 100f);
            if(slider.value == 1.0f)
            {
                noticeText.text = "按下任意键继续";
                if (Input.anyKeyDown)
                {
                    operation.allowSceneActivation = true;//激活场景
                }
            }
            yield return null;//暂停一帧
        }
    }
}

        注意,不要忘记在Button组件下添加点击事件。

二、异步操作AsyncOperation介绍

        Unity官方解释:Unity - Scripting API: AsyncOperation

        AsyncOperation是Unity中用来处理异步操作的基础类。异步操作是指那些需要花费一定时间来完成的操作,例如场景加载、资源加载等。在这些操作中,我们通常不希望阻塞主线程,而是希望使用异步方式来处理它们,以便提高应用程序的响应性和效率。

        AsyncOperation类提供了一些常用的方法和属性,用于管理异步操作的状态和进度。下面是AsyncOperation的一些常用方法和属性:     

        方法:

        AsyncOperation.allowSceneActivation:允许异步加载的场景进行激活。
        AsyncOperation.isDone:判断异步操作是否已完成。
        AsyncOperation.progress:获取异步操作的进度(范围从0到1)。
        AsyncOperation.Start():开始异步操作。

        属性:

        AsyncOperation.allowSceneActivation:获取或设置异步加载的场景是否可以进行激活。
        AsyncOperation.isDone:获取异步操作是否已完成。
        AsyncOperation.progress:获取异步操作的进度(范围从0到1)。

三、伪进度条

        通常,加载一个场景需要一些时间,因为Unity需要读取场景中的所有资源,包括场景中的模型、材质、贴图、声音、动画等等,并将它们实例化到内存中。这个过程需要一些时间,具体取决于场景中包含的资源的数量和大小以及设备的性能。

        如果小伙伴们的进度条在不到1秒的时间内就到达了100%,那么可能是因为你的场景非常小或者只包含很少的资源。另外,如果你只是简单地加载一个场景,而没有考虑到场景中的异步操作或资源加载,也可能导致进度条很快就到达100%。

        伪进度条是一种常用的UI设计技巧,可以增加用户体验,提高应用程序的互动性。在场景加载过程中,你可以使用一个伪进度条来模拟加载的进度,即便我们的场景非常小或只包含很少的资源,也不会让进度条过快的到达100%,同时也增加了场景加载的趣味性。

        代码如下:

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

public class UIManager : MonoBehaviour
{
    public GameObject progressPanel;//进度条容器面板
    public Slider slider;//进度条
    public TextMeshProUGUI progressText;//进度文本
    public TextMeshProUGUI noticeText;//提示文本

    public void LoadScene()
    {
        StartCoroutine(LoadSceneAsync());
    }
    IEnumerator LoadSceneAsync()
    {
        progressPanel.SetActive(true);//打开进度条面板
        AsyncOperation operation = SceneManager.LoadSceneAsync(1);//跳转场景,根据实际修改
        operation.allowSceneActivation = false;//不要让场景激活,直到你允许它
        float timer = 0.0f;
        float duration = 2.0f;
        while (timer < duration)
        {
            timer += Time.deltaTime;
            float progress = Mathf.Lerp(0.0f, 1.0f, timer / duration);
            slider.value = progress;
            progressText.text = string.Format("{0}%", (int)(progress * 100f));
            yield return null;
        }
        slider.value = 1.0f;//设置进度条为100%
        noticeText.text = "按下任意键继续";
        while(!Input.anyKeyDown)
        {
            yield return null;
        }
        operation.allowSceneActivation = true;//激活场景
    }
}

猜你喜欢

转载自blog.csdn.net/m0_51942776/article/details/130457155