Jak teleportować się między scenami w Unity

Teleportacja między scenami w Unity to przydatna funkcja do przenoszenia graczy między różnymi poziomami lub obszarami. Ten samouczek opisuje, jak zaimplementować teleportację sceny za pomocą addytywnego ładowania sceny, zapewniając trwałość danych gracza i rozładowując starą scenę po teleportacji. Takie podejście zapewnia płynne przejście bez utraty danych gracza lub obiektów.

Konfigurowanie scen i punktów teleportacji

Najpierw przygotujemy sceny i wyznaczymy w nich punkty teleportacji.

Tworzenie scen

  1. W Unity przejdź do Plik > Nowa scena, aby utworzyć nową scenę. Zapisz ją w folderze Assets, nadając mu nazwę Scene1.
  2. Powtórz ten proces, aby utworzyć inną scenę o nazwie Scene2.
  3. Dodaj obie sceny do ustawień kompilacji, przechodząc do Plik > Ustawienia kompilacji i klikając Dodaj otwarte sceny.

Wyznaczanie punktów teleportacji

Każda scena wymaga wyznaczonego punktu, w którym gracz pojawi się po teleportacji.

  1. W Scene1 utwórz pusty GameObject i nazwij go TeleportPoint1. Oznacz go odpowiednio, na przykład jako SpawnPoint.
  2. W Scene2 utwórz kolejny pusty obiekt GameObject o nazwie TeleportPoint2 i oznacz go podobnie.
  3. Te obiekty gry będą służyć jako miejsca odradzania się podczas przechodzenia między scenami.

Tworzenie skryptu teleportacji

Skrypt teleportacji zarządza przejściem między scenami, zapewniając, że gracz przeniesie się do właściwego miejsca w nowej scenie, a następnie wyłączy poprzednią scenę.

Skrypt teleportacji

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. Utwórz nowy skrypt C# o nazwie Teleportation.cs w folderze Scripts.
  2. Dołącz ten skrypt do obiektu, który będzie działał jako wyzwalacz teleportu, np. drzwi lub portal.
  3. Ustaw sceneToLoad na nazwę sceny, do której chcesz przejść, i upewnij się, że punkt teleportacji w nowej scenie jest prawidłowo oznaczony.

Obsługa danych gracza w różnych scenach

Jeśli Twoja gra wymaga przechowywania danych gracza (takich jak ekwipunek, zdrowie itp.) na różnych scenach, wdróż strategię trwałości danych.

Trwałe dane gracza

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. Utwórz nowy skrypt C# o nazwie PlayerData.cs i dołącz go do obiektu gracza lub oddzielnego obiektu GameObject.
  2. Upewnij się, że ten GameObject nie zostanie zniszczony podczas przejść między scenami, używając polecenia DontDestroyOnLoad(gameObject).

Wniosek

Teleportacja między scenami w Unity, zwłaszcza z dodatkowym ładowaniem i rozładowywaniem scen, zapewnia płynne działanie. Ta metoda zachowuje ważne obiekty gry, takie jak gracz, i efektywnie zarządza zasobami, rozładowując poprzednią scenę. Takie podejście jest szczególnie przydatne w grach z dużymi lub ciągłymi środowiskami. Dostosuj tę konfigurację dalej, aby odpowiadała konkretnym wymaganiom rozgrywki, takim jak utrzymywanie danych stanu lub dodawanie efektów wizualnych podczas przejść.