So teleportieren Sie in Unity zwischen Szenen

Das Teleportieren zwischen Szenen in Unity ist eine nützliche Funktion für den Wechsel von Spielern zwischen verschiedenen Levels oder Bereichen. Dieses Tutorial beschreibt, wie man Szenenteleportation durch additives Laden von Szenen implementiert, die Persistenz der Spielerdaten sicherstellt und die alte Szene nach der Teleportation entlädt. Dieser Ansatz gewährleistet einen reibungslosen Übergang ohne Verlust von Spielerdaten oder -objekten.

Einrichten von Szenen und Teleportationspunkten

Zuerst richten wir die Szenen ein und legen darin Teleportationspunkte fest.

Szenen erstellen

  1. Gehen Sie in Unity zu Datei > Neue Szene, um eine neue Szene zu erstellen. Speichern Sie sie in Ihrem Ordner Assets und nennen Sie sie Szene1.
  2. Wiederholen Sie den Vorgang, um eine weitere Szene mit dem Namen Szene2 zu erstellen.
  3. Fügen Sie beide Szenen zu den Build-Einstellungen hinzu, indem Sie zu Datei > Build-Einstellungen gehen und auf Offene Szenen hinzufügen klicken.

Festlegen von Teleportationspunkten

Jede Szene benötigt einen bestimmten Punkt, an dem der Spieler nach der Teleportation erscheint.

  1. Erstellen Sie in Scene1 ein leeres GameObject und nennen Sie es TeleportPoint1. Kennzeichnen Sie es entsprechend, zum Beispiel als SpawnPoint.
  2. Erstellen Sie in Scene2 ein weiteres leeres GameObject mit dem Namen TeleportPoint2 und kennzeichnen Sie es auf ähnliche Weise.
  3. Diese GameObjects dienen beim Übergang zwischen Szenen als Spawn-Standorte.

Erstellen eines Teleportationsskripts

Das Teleportationsskript verwaltet den Szenenübergang, stellt sicher, dass der Spieler an die richtige Stelle in der neuen Szene wechselt, und lädt dann die vorherige Szene herunter.

Teleportationsskript

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. Erstellen Sie ein neues C#-Skript mit dem Namen Teleportation.cs im Ordner Scripts.
  2. Hängen Sie dieses Skript an ein Objekt an, das als Teleportauslöser fungiert, beispielsweise eine Tür oder ein Portal.
  3. Setzen Sie sceneToLoad auf den Namen der Szene, zu der gewechselt werden soll, und stellen Sie sicher, dass der Teleportationspunkt in der neuen Szene richtig markiert ist.

Szenenübergreifender Umgang mit Spielerdaten

Wenn Ihr Spiel die Verwaltung von Spielerdaten (wie Inventar, Gesundheit usw.) über mehrere Szenen hinweg erfordert, implementieren Sie eine Strategie zur Datenpersistenz.

Dauerhafte Spielerdaten

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. Erstellen Sie ein neues C#-Skript mit dem Namen PlayerData.cs und hängen Sie es an das Player-Objekt oder ein separates GameObject an.
  2. Stellen Sie mit DontDestroyOnLoad(gameObject) sicher, dass dieses GameObject während Szenenübergängen nicht zerstört wird.

Abschluss

Das Teleportieren zwischen Szenen in Unity, insbesondere mit additivem Laden und Entladen von Szenen, bietet ein nahtloses Erlebnis. Diese Methode behält wichtige Spielobjekte wie den Spieler bei und verwaltet Ressourcen effizient, indem die vorherige Szene entladen wird. Ein solcher Ansatz ist insbesondere in Spielen mit großen oder kontinuierlichen Umgebungen nützlich. Passen Sie dieses Setup weiter an, um es an bestimmte Gameplay-Anforderungen anzupassen, z. B. das Beibehalten von Statusdaten oder das Hinzufügen visueller Effekte während Übergängen.