Sådan teleporteres mellem scener i enhed

Teleportering mellem scener i Unity er en nyttig funktion til at flytte spillere mellem forskellige niveauer eller områder. Denne vejledning dækker, hvordan man implementerer sceneteleportering ved hjælp af additiv sceneindlæsning, sikring af spillerdatapersistens og aflæsning af den gamle scene efter teleporteringen. Denne tilgang sikrer en glidende overgang uden at miste spillerdata eller objekter.

Opsætning af scener og teleporteringspunkter

Først sætter vi scenerne op og udpeger teleporteringspunkter i dem.

Oprettelse af scener

  1. I Unity skal du gå til File > New Scene for at oprette en ny scene. Gem den i din Assets-mappe, og giv den navnet Scene1.
  2. Gentag processen for at oprette en anden scene ved navn Scene2.
  3. Tilføj begge scener til byggeindstillingerne ved at gå til Filer > Byg indstillinger og klikke på Tilføj åbne scener.

Udpegning af teleportationspunkter

Hver scene har brug for et udpeget punkt, hvor spilleren vises efter teleportering.

  1. I Scene1 skal du oprette et tomt GameObject og navngive det TeleportPoint1. Tag det passende, for eksempel som SpawnPoint.
  2. I Scene2 skal du oprette et andet tomt GameObject ved navn TeleportPoint2 og tagge det på samme måde.
  3. Disse GameObjects vil fungere som spawn-lokationer, når de skifter mellem scener.

Oprettelse af et teleportationsscript

Teleporteringsscriptet styrer sceneovergangen, og sikrer, at spilleren flytter til den korrekte placering i den nye scene, og aflæser derefter den forrige scene.

Teleportation Script

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. Opret et nyt C#-script ved navn Teleportation.cs i mappen Scripts.
  2. Vedhæft dette script til et objekt, der vil fungere som en teleportudløser, såsom en dør eller portal.
  3. Indstil sceneToLoad til navnet på den scene, der skal skiftes til, og sørg for, at teleporteringspunktet i den nye scene er mærket korrekt.

Håndtering af spillerdata på tværs af scener

Hvis dit spil kræver at vedligeholde spillerdata (såsom inventar, sundhed osv.) på tværs af scener, skal du implementere en datapersistensstrategi.

Persistent spillerdata

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. Opret et nyt C#-script ved navn PlayerData.cs og vedhæft det til afspillerobjektet eller et separat GameObject.
  2. Sørg for, at dette GameObject ikke ødelægges under sceneovergange ved at bruge DontDestroyOnLoad(gameObject).

Konklusion

Teleportering mellem scener i Unity, især med additiv sceneindlæsning og aflæsning, giver en problemfri oplevelse. Denne metode bevarer vigtige spilobjekter som spilleren og styrer ressourcer effektivt ved at aflæse den forrige scene. En sådan tilgang er især nyttig i spil med store eller kontinuerlige miljøer. Tilpas denne opsætning yderligere, så den passer til specifikke gameplay-krav, såsom vedligeholdelse af tilstandsdata eller tilføjelse af visuelle effekter under overgange.