Come teletrasportarsi tra le scene in Unity

Il teletrasporto tra scene in Unity è una funzionalità utile per far transitare i giocatori tra diversi livelli o aree. Questo tutorial spiega come implementare il teletrasporto di scene utilizzando il caricamento additivo di scene, assicurando la persistenza dei dati dei giocatori e scaricando la vecchia scena dopo il teletrasporto. Questo approccio assicura una transizione fluida senza perdere dati o oggetti dei giocatori.

Impostazione delle scene e dei punti di teletrasporto

Per prima cosa, allestiremo le scene e designeremo i punti di teletrasporto al loro interno.

Creazione di scene

  1. In Unity, vai su File > New Scene per creare una nuova scena. Salvala nella tua cartella Assets, chiamandola Scene1.
  2. Ripetere il procedimento per creare un'altra scena denominata Scena2.
  3. Aggiungi entrambe le scene alle impostazioni di build andando su File > Impostazioni di build e cliccando su Aggiungi scene aperte.

Designazione dei punti di teletrasporto

Ogni scena necessita di un punto designato in cui il giocatore apparirà dopo il teletrasporto.

  1. In Scene1, crea un GameObject vuoto e chiamalo TeleportPoint1. Contrassegnalo in modo appropriato, ad esempio, come SpawnPoint.
  2. In Scene2, crea un altro GameObject vuoto denominato TeleportPoint2 e assegnagli un tag simile.
  3. Questi GameObjects fungeranno da punti di spawn durante la transizione tra le scene.

Creazione di uno script di teletrasporto

Lo script di teletrasporto gestisce la transizione di scena, assicurando che il giocatore si sposti nella posizione corretta nella nuova scena e poi scarica la scena precedente.

Script di teletrasporto

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. Creare un nuovo script C# denominato Teleportation.cs nella cartella Scripts.
  2. Collega questo script a un oggetto che fungerà da attivatore di teletrasporto, come una porta o un portale.
  3. Imposta sceneToLoad sul nome della scena verso cui effettuare la transizione e assicurati che il punto di teletrasporto nella nuova scena sia taggato correttamente.

Gestione dei dati del giocatore tra le scene

Se il tuo gioco richiede la conservazione dei dati dei giocatori (come inventario, salute, ecc.) in più scene, implementa una strategia di persistenza dei dati.

Dati persistenti del giocatore

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. Crea un nuovo script C# denominato PlayerData.cs e associalo all'oggetto player o a un GameObject separato.
  2. Per garantire che questo GameObject non venga distrutto durante le transizioni di scena, utilizzare DontDestroyOnLoad(gameObject).

Conclusione

Il teletrasporto tra le scene in Unity, specialmente con caricamento e scaricamento di scene aggiuntive, fornisce un'esperienza fluida. Questo metodo conserva oggetti di gioco importanti come il giocatore e gestisce le risorse in modo efficiente scaricando la scena precedente. Tale approccio è particolarmente utile nei giochi con ambienti grandi o continui. Personalizza ulteriormente questa configurazione per adattarla a requisiti di gioco specifici, come il mantenimento dei dati di stato o l'aggiunta di effetti visivi durante le transizioni.