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
- En Unity, ve a
Archivo > Nueva escena
para crear una nueva escena. Guárdala en tu carpetaRecursos
y nómbralaEscena1
. - Repita el proceso para crear otra escena llamada
Escena2
. - Agregue ambas escenas a la configuración de compilación yendo a
Archivo > Configuración de compilación
y haciendo clic enAgregar 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.
- En
Scene1
, crea un GameObject vacío y nómbraloTeleportPoint1
. Etiquétalo de forma adecuada, por ejemplo, comoSpawnPoint
. - En
Scene2
, crea otro GameObject vacío llamadoTeleportPoint2
y etiquétalo de manera similar. - 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;
}
}
}
- Cree un nuevo script de C# llamado
Teleportation.cs
en la carpetaScripts
. - Adjunte este script a un objeto que actuará como disparador de teletransporte, como una puerta o un portal.
- 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);
}
}
}
- Cree un nuevo script de C# llamado
PlayerData.cs
y adjúntelo al objeto de jugador o a un GameObject separado. - 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.