Unity 异步加载场景并获取进度教程

目录

Unity 异步加载场景并获取进度教程

一、同步与异步概念

(一)同步执行

(二)异步执行

二、Unity 中通过协程实现异步加载场景

(一)创建脚本和游戏物体

(二)引用名称空间

(三)创建协程方法

(四)在合适的地方启动协程

三、获取场景加载进度

四、控制场景跳转


在游戏开发中,异步加载场景并显示进度条是一个常见的功能。以下将详细介绍如何在 Unity 中实现这一功能。

一、同步与异步概念

(一)同步执行

正常执行代码是按顺序一条线水平执行,从第一行代码开始一行一行执行。例如:

// 示意代码
Debug.Log("...");
int x;
x = 3;

但当遇到加载数据、加载场景或者从网络读取数据等操作时,这些操作会消耗大量时间,因为它们不仅依赖 CPU,还受数据大小、网络状况等因素影响。在同步方式下,程序执行到这些耗时操作时会卡住,直到操作完成才继续执行后续代码。

(二)异步执行

异步执行则是当有耗时操作时,将其交给其他 “人” 去做,主程序继续执行主代码。耗时操作完成后将结果返回给主程序。例如加载场景这个耗时操作,可以交给协程去做,主代码不用操心,继续执行其余代码。

二、Unity 中通过协程实现异步加载场景

(一)创建脚本和游戏物体

  1. 创建一个 C# 脚本,例如命名为 Test
  2. 创建一个新的游戏物体并将脚本挂载到该物体上。

(二)引用名称空间

在脚本中,要做场景操作需要引用场景管理类的名称空间:

using UnityEngine.SceneManagement;

(三)创建协程方法

创建一个协程方法用于加载场景,该方法返回值必须是 IEnumerator 类型,方法名称例如为 LoadScene

IEnumerator LoadScene()
{
    AsyncOperation operation;
    operation = SceneManager.LoadSceneAsync(1);  // 加载 1 号场景,这里传入场景索引
    yield return operation;
}

(四)在合适的地方启动协程

在脚本的合适位置(比如 Start 方法中)启动协程:

void Start()
{
    StartCoroutine(LoadScene());
}

三、获取场景加载进度

可以在 Update 方法中获取加载进度并输出(这里假设学了 UI 后可以用于进度条)。加载进度的值范围是 0 - 0.9,当达到 0.9 时场景加载完成。

void Update()
{
    if (operation!= null)
    {
        Debug.Log(operation.progress);
    }
}

四、控制场景跳转

可以通过设置 AsyncOperation.allowSceneActivation 属性为 false 来阻止场景自动跳转,之后通过计时器或者按键操作等方式再将其设置为 true 实现跳转。

operation.allowSceneActivation = false;
float timer = 0;
void Update()
{
    if (operation!= null)
    {
        Debug.Log(operation.progress);
        timer += Time.deltaTime;
        if (timer >= 5)
        {
            operation.allowSceneActivation = true;
        }
    }
}

通过以上步骤,就可以在 Unity 中实现异步加载场景并获取进度以及控制场景跳转等功能。在实际开发中,可以根据需求进一步优化和扩展。