返回

Unity 使用 Addressables 切换场景,使用一个加载场景作为缓冲,控制显示加载进度条百分比

前端

引言

在游戏开发中,无缝且快速的场景转换至关重要。Unity 的 Addressables 系统提供了一种有效的方法来异步加载和卸载场景,但它可能需要一些额外的技巧来实现平滑的过渡。本文将引导你逐步完成使用 Addressables 切换场景的最佳实践,其中包括使用缓冲场景控制加载进度条百分比。

设置 Addressables

首先,确保已导入 Addressables 系统并已标记要加载的场景。在 Project 设置中导航到“Addressables”选项卡,然后单击“Add Scene”按钮选择要包括的场景。

创建缓冲场景

为了平滑场景转换,我们将创建一个缓冲场景,其中包含加载进度条。这将允许我们在加载目标场景时向用户显示进度。

  1. 创建一个新场景并命名为“LoadingScene”。
  2. 添加一个画布(Canvas)对象并为其创建一个脚本(LoadingSceneManager.cs)。
  3. 在 LoadingSceneManager.cs 脚本中,添加以下代码:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using UnityEngine.Addressables;
using System;

public class LoadingSceneManager : MonoBehaviour
{
    public Slider loadingSlider;
    public string targetSceneName;

    private AsyncOperation loadingOperation;

    public void Start()
    {
        loadingSlider.value = 0f;
        StartCoroutine(LoadTargetScene());
    }

    private IEnumerator LoadTargetScene()
    {
        // 使用 Addressables 加载目标场景
        loadingOperation = Addressables.LoadSceneAsync(targetSceneName, LoadSceneMode.Additive);

        // 等待场景加载完成
        while (!loadingOperation.isDone)
        {
            // 更新加载进度条
            loadingSlider.value = Mathf.Clamp01(loadingOperation.progress);
            yield return null;
        }

        // 激活目标场景
        SceneManager.SetActiveScene(SceneManager.GetSceneByName(targetSceneName));

        // 卸载缓冲场景
        Addressables.UnloadSceneAsync("LoadingScene", false);
    }
}

集成缓冲场景

现在,让我们将缓冲场景集成到场景转换流程中:

  1. 在要切换的场景中,附加一个名为“SceneSwitcher.cs”的脚本。
  2. 在 SceneSwitcher.cs 脚本中,添加以下代码:
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
using UnityEngine.Addressables;
using System;

public class SceneSwitcher : MonoBehaviour
{
    public string targetSceneName;

    public void LoadTargetScene()
    {
        // 先加载缓冲场景
        Addressables.LoadSceneAsync("LoadingScene", LoadSceneMode.Additive, false, OnLoadingSceneLoaded);
    }

    private void OnLoadingSceneLoaded(AsyncOperationHandle<SceneInstance> operation)
    {
        // 获取缓冲场景中的 LoadingSceneManager 脚本
        LoadingSceneManager loadingSceneManager = FindObjectOfType<LoadingSceneManager>();
        
        // 设置目标场景名称
        loadingSceneManager.targetSceneName = targetSceneName;
    }
}

控制加载进度条百分比

通过使用缓冲场景,我们可以控制加载进度条百分比的显示。在 LoadingSceneManager.cs 脚本中,我们使用 Mathf.Clamp01(loadingOperation.progress) 来限制进度条值介于 0 和 1 之间。这将确保进度条准确反映目标场景的加载进度。

结论

使用 Addressables 切换场景时,结合缓冲场景,可以显著提升用户体验,提供平滑的场景转换和可视化的加载进度。本文提供了分步指南,展示了如何实现这一功能。通过遵循这些最佳实践,你可以确保你的 Unity 游戏在切换场景时始终流畅且引人入胜。