Hur man teleporterar mellan scener i Unity

Teleportering mellan scener i Unity är en användbar funktion för att flytta spelare mellan olika nivåer eller områden. Denna handledning tar upp hur man implementerar scenteleportering med hjälp av additiv scenladdning, säkerställer spelardatabeständighet och avlastning av den gamla scenen efter teleporteringen. Detta tillvägagångssätt säkerställer en smidig övergång utan att förlora spelardata eller objekt.

Ställa in scener och teleporteringspunkter

Först kommer vi att ställa in scenerna och utse teleporteringspunkter inom dem.

Skapa scener

  1. I Unity, gå till File > New Scene för att skapa en ny scen. Spara den i mappen Assets och döp den till Scene1.
  2. Upprepa processen för att skapa en annan scen med namnet Scene2.
  3. Lägg till båda scenerna till bygginställningarna genom att gå till Arkiv > Bygginställningar och klicka på Lägg till öppna scener.

Utse teleporteringspunkter

Varje scen behöver en angiven punkt där spelaren kommer att dyka upp efter teleportering.

  1. I Scene1, skapa ett tomt GameObject och döp det till TeleportPoint1. Tagga det på lämpligt sätt, till exempel som SpawnPoint.
  2. I Scene2, skapa ett annat tomt GameObject med namnet TeleportPoint2 och tagga det på liknande sätt.
  3. Dessa GameObjects kommer att fungera som spawn-platser vid övergång mellan scener.

Skapa ett teleporteringsskript

Teleporteringsskriptet hanterar scenövergången, säkerställer att spelaren flyttar till rätt plats i den nya scenen, och laddar sedan ur den föregående scenen.

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. Skapa ett nytt C#-skript med namnet Teleportation.cs i mappen Scripts.
  2. Bifoga det här skriptet till ett objekt som kommer att fungera som en teleportutlösare, till exempel en dörr eller portal.
  3. Ställ in sceneToLoad till namnet på scenen att övergå till och se till att teleporteringspunkten i den nya scenen är korrekt taggad.

Hantera spelardata över scener

Om ditt spel kräver underhåll av spelardata (som inventering, hälsa, etc.) över scener, implementera en databeständighetsstrategi.

Persistent spelardata

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. Skapa ett nytt C#-skript med namnet PlayerData.cs och bifoga det till spelarobjektet eller ett separat GameObject.
  2. Se till att detta GameObject inte förstörs under scenövergångar genom att använda DontDestroyOnLoad(gameObject).

Slutsats

Teleportering mellan scener i Unity, särskilt med additiv scenladdning och urladdning, ger en sömlös upplevelse. Den här metoden behåller viktiga spelobjekt som spelaren och hanterar resurser effektivt genom att ta bort den föregående scenen. Ett sådant tillvägagångssätt är särskilt användbart i spel med stora eller kontinuerliga miljöer. Anpassa den här inställningen ytterligare för att passa specifika spelkrav, som att underhålla tillståndsdata eller lägga till visuella effekter under övergångar.