Как телепортироваться между сценами в Unity

Телепортация между сценами в Unity — полезная функция для перемещения игроков между различными уровнями или областями. В этом руководстве рассматривается, как реализовать телепортацию сцен с помощью аддитивной загрузки сцен, обеспечения сохранения данных игрока и выгрузки старой сцены после телепортации. Такой подход обеспечивает плавный переход без потери данных игрока или объектов.

Настройка сцен и точек телепортации

Сначала мы настроим сцены и обозначим точки телепортации внутри них.

Создание сцен

  1. В Unity перейдите в File > New Scene, чтобы создать новую сцену. Сохраните ее в папке Assets, назвав ее Scene1.
  2. Повторите процесс, чтобы создать еще одну сцену с именем Scene2.
  3. Добавьте обе сцены в настройки сборки, перейдя в Файл > Настройки сборки и нажав Добавить открытые сцены.

Обозначение точек телепортации

Для каждой сцены необходимо обозначить точку, в которой игрок окажется после телепортации.

  1. В Scene1 создайте пустой GameObject и назовите его TeleportPoint1. Пометьте его соответствующим образом, например, как SpawnPoint.
  2. В Scene2 создайте еще один пустой GameObject с именем TeleportPoint2 и пометьте его аналогичным образом.
  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. Создайте новый скрипт C# с именем Teleportation.cs в папке Scripts.
  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. Создайте новый скрипт C# с именем PlayerData.cs и прикрепите его к объекту игрока или отдельному игровому объекту.
  2. Убедитесь, что этот игровой объект не будет уничтожен во время переходов между сценами, используя DontDestroyOnLoad(gameObject).

Заключение

Телепортация между сценами в Unity, особенно с аддитивной загрузкой и выгрузкой сцен, обеспечивает плавный опыт. Этот метод сохраняет важные игровые объекты, такие как игрок, и эффективно управляет ресурсами, выгружая предыдущую сцену. Такой подход особенно полезен в играх с большими или непрерывными средами. Настройте эту настройку далее в соответствии с конкретными требованиями игрового процесса, такими как сохранение данных о состоянии или добавление визуальных эффектов во время переходов.