📜  unity 场景切换 - C# (1)

📅  最后修改于: 2023-12-03 15:05:45.122000             🧑  作者: Mango

Unity 场景切换 - C#

在 Unity3D 中,场景(Scene)是游戏中的不同界面、关卡等区域,场景之间的切换是游戏中重要的一部分,本文将介绍如何在 C# 代码中实现 Unity 场景切换。

场景的加载与卸载

在 Unity 中,使用 SceneManager 类来进行场景的加载和卸载操作。首先,在使用 SceneManager 之前,需要在代码中添加如下的命名空间:

using UnityEngine.SceneManagement;
加载场景

要加载一个场景,可以使用 SceneManager 的 LoadScene 方法。如果要加载的场景是另一个名称不同的场景,可以提供一个场景名称:

SceneManager.LoadScene("MyOtherScene");

也可以使用场景在 Build Settings 中的索引来加载场景:

SceneManager.LoadScene(1);

如果你想在加载时指定加载方式,可以将加载场景的方式作为一个可选参数传入 LoadScene 方法中。例如,如果你想要使用 Additive 方式加载场景,可以这样调用:

SceneManager.LoadScene("MyOtherScene", LoadSceneMode.Additive);

有三种加载方式可供选择:

  • LoadSceneMode.Single:此方式直接替换当前场景,不考虑当前场景是否保存过。
  • LoadSceneMode.Additive:此方式将新场景加载到现有场景之上。可以多次调用此方法来加载多个场景。
  • LoadSceneMode.Single,Async:此方式是异步的,它会在后台加载场景并返回一个 AsyncOperation 对象。使用此对象可以检查加载进度和取消操作。
卸载场景

卸载场景同样使用 SceneManager 类的 UnloadSceneAsync 方法。与 LoadScene 方法一样,可以指定要卸载的场景的名称或构建索引。例如:

SceneManager.UnloadSceneAsync("MyScene");

可以指定多个场景进行卸载:

SceneManager.UnloadSceneAsync("MyScene1");
SceneManager.UnloadSceneAsync("MyScene2");
场景的切换

Unity 的场景切换分为两个阶段:加载新场景和卸载旧场景。

切换场景

SceneManager 类的 LoadScene 方法是直接替换当前场景。如果你想要进行场景切换,需要手动卸载旧场景并加载新场景。下面是一种方式实现场景切换:

public void ChangeScene(string sceneName)
{
    StartCoroutine(LoadSceneCoroutine(sceneName));
}

private IEnumerator LoadSceneCoroutine(string sceneName)
{
    // 开始异步加载新场景
    AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Single);

    // 等待新场景加载完成
    while (!asyncLoad.isDone)
    {
        Debug.Log($"加载新场景 {sceneName} 进度:{asyncLoad.progress * 100}%");
        yield return null;
    }

    // 卸载旧场景
    SceneManager.UnloadSceneAsync(SceneManager.GetActiveScene().name);
}

这个方法开启了一个协程,异步地加载新场景,并将进度输出到日志中。当新场景加载完成后,该方法会卸载旧场景。如果你需要在切换场景之前做一些其他操作,可以在开始加载新场景之前的任何时候执行它们,只要在执行 UnloadSceneAsync 方法时等待旧场景的卸载即可。

场景之间的数据传递

在场景之间传递数据需要使用某种方法。这里介绍三种常见的方法:

  • 使用 PlayerPrefs:这是 Unity 内置的一种数据持久化方案。你可以将数据存储在 PlayerPrefs 中,并在其他场景中通过键名获取数据。这种方法适用于存储一些简单的数据,例如游戏设置、玩家分数等。
  • 使用静态类或单例:将一些数据或代码存储在静态类或单例对象中,以便在其他场景中访问。这种方法适用于中等大小的数据或一些常见的方法或函数。
  • 使用场景加载事件:在要传递数据的两个场景中,分别为每个场景创建脚本,然后使用 UnityEvent 等系统事件,实现场景之间的通信。这种方法适用于所有情况,但需要一些额外的设置和精细调整。

下面是 PlayerPrefs 的示例。

// 在切换场景之前设置玩家积分
PlayerPrefs.SetInt("Score", 1000);
SceneManager.LoadScene("MyOtherScene");

// 在另一个场景中检索玩家积分
int score = PlayerPrefs.GetInt("Score");
总结

在本文中,我们介绍了 SceneManager 类的用法,并说明了如何使用它来加载和卸载场景。我们还展示了一种方式来切换场景,并说明了如何在场景之间传递数据。希望这篇文章对你有帮助!