目录
一、步骤
首先,小伙伴们要确保至少有两个场景并已添加至“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;//激活场景
}
}