Як телепортуватися між сценами в Unity

Телепортація між сценами в Unity є корисною функцією для переходу гравців між різними рівнями або областями. У цьому посібнику описано, як реалізувати телепортацію сцени за допомогою додаткового завантаження сцени, забезпечення збереження даних гравця та вивантаження старої сцени після телепортації. Такий підхід забезпечує плавний перехід без втрати даних або об’єктів гравця.

Налаштування сцен і точок телепортації

Спочатку ми налаштуємо сцени та позначимо в них точки телепортації.

Створення сцен

  1. У Unity перейдіть до Файл > Нова сцена, щоб створити нову сцену. Збережіть його у папці Assets, назвавши його Scene1.
  2. Повторіть процес, щоб створити іншу сцену під назвою Scene2.
  3. Додайте обидві сцени до налаштувань збірки, перейшовши до Файл > Параметри збірки і натиснувши Додати відкриті сцени.

Призначення точок телепортації

Для кожної сцени потрібна визначена точка, де гравець з’явиться після телепортації.

  1. У Scene1 створіть порожній GameObject і назвіть його TeleportPoint1. Позначте його відповідним тегом, наприклад, як SpawnPoint.
  2. У Scene2 створіть ще один порожній GameObject під назвою TeleportPoint2 і позначте його подібним чином.
  3. Ці GameObjects слугуватимуть місцями появи під час переходу між сценами.

Створення сценарію телепортації

Сценарій телепортації керує переходом сцени, забезпечуючи переміщення гравця в правильне місце в новій сцені, а потім вивантажує попередню сцену.

Скрипт телепортації

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 і приєднайте його до об’єкта гравця або окремого GameObject.
  2. Переконайтеся, що цей GameObject не знищено під час переходів між сценами за допомогою DontDestroyOnLoad(gameObject).

Висновок

Телепортація між сценами в Unity, особливо з додатковим завантаженням і вивантаженням сцени, забезпечує безперебійний досвід. Цей метод зберігає важливі ігрові об’єкти, такі як гравець, і ефективно керує ресурсами, вивантажуючи попередню сцену. Такий підхід особливо корисний в іграх із великим або безперервним середовищем. Додатково налаштуйте це налаштування відповідно до конкретних вимог гри, як-от збереження даних про стан або додавання візуальних ефектів під час переходів.