Cómo teletransportarse entre escenas en Unity

La teletransportación entre escenas en Unity es una característica útil para la transición de jugadores entre diferentes niveles o áreas. Este tutorial explica cómo implementar la teletransportación de escenas mediante la carga aditiva de escenas, lo que garantiza la persistencia de los datos del jugador y la descarga de la escena anterior después de la teletransportación. Este enfoque garantiza una transición fluida sin perder datos ni objetos del jugador.

Configuración de escenas y puntos de teletransportación

Primero, configuraremos las escenas y designaremos puntos de teletransportación dentro de ellas.

Creando escenas

  1. En Unity, ve a Archivo > Nueva escena para crear una nueva escena. Guárdala en tu carpeta Recursos y nómbrala Escena1.
  2. Repita el proceso para crear otra escena llamada Escena2.
  3. Agregue ambas escenas a la configuración de compilación yendo a Archivo > Configuración de compilación y haciendo clic en Agregar escenas abiertas.

Designación de puntos de teletransportación

Cada escena necesita un punto designado donde aparecerá el jugador después de la teletransportación.

  1. En Scene1, crea un GameObject vacío y nómbralo TeleportPoint1. Etiquétalo de forma adecuada, por ejemplo, como SpawnPoint.
  2. En Scene2, crea otro GameObject vacío llamado TeleportPoint2 y etiquétalo de manera similar.
  3. Estos GameObjects servirán como lugares de aparición durante la transición entre escenas.

Creando un script de teletransportación

El script de teletransportación gestiona la transición de escena, garantizando que el jugador se mueva a la ubicación correcta en la nueva escena y luego descargue la escena anterior.

Guión de teletransportación

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. Cree un nuevo script de C# llamado Teleportation.cs en la carpeta Scripts.
  2. Adjunte este script a un objeto que actuará como disparador de teletransporte, como una puerta o un portal.
  3. Establezca sceneToLoad en el nombre de la escena a la que se realizará la transición y asegúrese de que el punto de teletransportación en la nueva escena esté etiquetado correctamente.

Manejo de datos de jugadores en distintas escenas

Si su juego requiere mantener datos de los jugadores (como inventario, salud, etc.) en todas las escenas, implemente una estrategia de persistencia de datos.

Datos persistentes de jugadores

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. Cree un nuevo script de C# llamado PlayerData.cs y adjúntelo al objeto de jugador o a un GameObject separado.
  2. Asegúrese de que este GameObject no se destruya durante las transiciones de escena utilizando DontDestroyOnLoad(gameObject).

Conclusión

La teletransportación entre escenas en Unity, especialmente con carga y descarga de escenas aditivas, proporciona una experiencia fluida. Este método conserva objetos importantes del juego, como el jugador, y administra los recursos de manera eficiente al descargar la escena anterior. Este enfoque es particularmente útil en juegos con entornos grandes o continuos. Personaliza aún más esta configuración para que se adapte a los requisitos específicos del juego, como mantener los datos de estado o agregar efectos visuales durante las transiciones.