如何在 Unity 中实现场景间传送

Unity 中的场景间传送是玩家在不同关卡或区域间转换的有用功能。本教程介绍如何使用附加场景加载实现场景传送、确保玩家数据持久性以及在传送后卸载旧场景。此方法可确保平稳过渡,而不会丢失玩家数据或对象。

设置场景和传送点

首先,我们将设置场景并在其中指定传送点。

创建场景

  1. 在 Unity 中,转到 File > New Scene 创建一个新场景。将其保存在 Assets 文件夹中,并将其命名为 Scene1
  2. 重复该过程创建另一个名为 Scene2 的场景。
  3. 通过转到 File > Build Settings 并单击 Add Open Scenes,将两个场景添加到构建设置中。

指定传送点

每个场景都需要一个指定点,玩家传送后将出现在此点。

  1. Scene1 中,创建一个空的 GameObject 并将其命名为 TeleportPoint1。为其添加适当的标签,例如 SpawnPoint
  2. Scene2中,创建另一个名为TeleportPoint2的空GameObject并对其进行类似标记。
  3. 这些游戏对象将作为场景间转换时的生成位置。

创建传送脚本

传送脚本管理场景转换,确保玩家移动到新场景中的正确位置,然后卸载前一个场景。

传送脚本

using UnityEngine;
using UnityEngine.SceneManagement;

public class Teleportation : MonoBehaviour
{
    public string sceneToLoad; // Name of the scene to load
    public string spawnPointTag = "SpawnPoint"; // Tag for identifying the spawn point

    private string currentSceneName; // To track the current scene

    void Start()
    {
        currentSceneName = SceneManager.GetActiveScene().name;
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            DontDestroyOnLoad(other.gameObject); // Prevent player object from being destroyed

            SceneManager.LoadScene(sceneToLoad, LoadSceneMode.Additive); // Load new scene additively
            SceneManager.sceneLoaded += OnSceneLoaded; // Register callback for scene load completion
        }
    }

    void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        if (scene.name == sceneToLoad)
        {
            // Find the spawn point in the newly loaded scene
            GameObject spawnPoint = GameObject.FindWithTag(spawnPointTag);
            if (spawnPoint != null)
            {
                GameObject player = GameObject.FindWithTag("Player");
                if (player != null)
                {
                    // Teleport the player to the spawn point
                    player.transform.position = spawnPoint.transform.position;
                }
            }

            // Unload the previous scene
            SceneManager.UnloadSceneAsync(currentSceneName);

            // Update the current scene name and unregister the event handler
            currentSceneName = sceneToLoad;
            SceneManager.sceneLoaded -= OnSceneLoaded;
        }
    }
}
  1. Scripts 文件夹中创建一个名为 Teleportation.cs 的新 C# 脚本。
  2. 将此脚本附加到将充当传送触发器的对象,例如门或门户。
  3. sceneToLoad 设置为要转换到的场景的名称,并确保新场景中的传送点被正确标记。

跨场景处理玩家数据

如果您的游戏需要跨场景维护玩家数据(如库存、健康状况等),请实施数据持久性策略。

持久玩家数据

using UnityEngine;

public class PlayerData : MonoBehaviour
{
    public static PlayerData instance;

    public int health = 100;

    void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
}
  1. 创建一个名为PlayerData.cs的新 C# 脚本并将其附加到玩家对象或单独的游戏对象。
  2. 使用 DontDestroyOnLoad(gameObject) 确保此 GameObject 在场景转换期间不会被破坏。

结论

在 Unity 中,场景之间的传送(尤其是使用附加场景加载和卸载)可提供无缝体验。此方法保留了玩家等重要游戏对象,并通过卸载前一个场景来有效管理资源。这种方法在具有大型或连续环境的游戏中特别有用。进一步自定义此设置以满足特定的游戏要求,例如在过渡期间维护状态数据或添加视觉效果。