Optimiza las transiciones entre escenas en Unity con un sistema de spawn preciso, cámara alineada y control de dirección de mirada. Aquí verás cómo crear una Spawn Zone, evitar bucles por colliders solapados, resolver duplicados por Don't Destroy on Load y fijar la facing direction del personaje con C#.
¿Cómo sincronizar el spawn entre escenas en Unity?
Para que el personaje aparezca en el punto correcto al cambiar de escena, crea una Spawn Zone y posiciona allí al jugador y la cámara. La clave: usar referencias a un único PlayerController y CameraFollow que persisten con Don't Destroy on Load.
- Crea un GameObject vacío llamado Spawn Zone. Añade un indicador visual para colocarlo con precisión.
- Evita solaparlo con la Change Zone. Si se superponen los colliders, se crea un bucle de escenas.
- Crea un script C# llamado SpawnZone y asígnalo al GameObject.
- Reposiciona jugador y cámara en Start, ajustando la Z de la cámara a su valor habitual (por ejemplo, -10).
- Elimina Update si no lo usas: solo actuará al cargar la escena.
¿Qué objetos y prefabs necesitas?
- Un GameObject vacío para la Spawn Zone.
- La Change Zone ya existente para el intercambio de escenas.
- Un prefab de Spawn Zone para reutilizar en varias escenas.
¿Qué hace el script Spawn Zone?
- Busca instancias únicas de jugador y cámara con FindObjectOfType.
- Mueve ambos a la posición de la Spawn Zone.
- Mantiene la Z de la cámara y ajusta X e Y al punto de spawn.
using UnityEngine;
public class SpawnZone : MonoBehaviour
{
private PlayerController thePlayer;
private CameraFollow theCamera;
public Vector2 facingDirection = Vector2.zero; // Dirección deseada al entrar.
void Start()
{
thePlayer = FindObjectOfType<PlayerController>();
theCamera = FindObjectOfType<CameraFollow>();
if (thePlayer != null)
{
thePlayer.transform.position = transform.position;
}
if (theCamera != null)
{
Vector3 camPos = theCamera.transform.position;
theCamera.transform.position = new Vector3(transform.position.x, transform.position.y, camPos.z);
}
// Conservar dirección de mirada al entrar.
if (thePlayer != null)
{
thePlayer.lastMovement = facingDirection;
}
}
}
¿Cómo evitar bucles entre colliders?
- No coloques la Spawn Zone encima de la Change Zone.
- Si el collider de Change Zone llega demasiado lejos, reduce su área o desplaza la Spawn Zone hacia fuera.
- Compila y prueba moviendo ambos hasta que no se re-dispare el cambio de escena.
¿Cómo alinear cámara y jugador al entrar a la nueva escena?
El jugador y la cámara deben existir una sola vez. Si en escenas secundarias quedaron copias, aparecerán duplicados y se comportarán de forma impredecible.
- Usa un único PlayerController y CameraFollow con Don't Destroy on Load.
- Elimina de las escenas destino cualquier copia del jugador o la cámara en la jerarquía.
- Revisa que el script de Spawn Zone posicione a ambos correctamente al cargar.
¿Por qué usar FindObjectOfType en Start?
- Solo hay una instancia de cada componente por diseño.
- FindObjectOfType encuentra la referencia activa en la jerarquía.
- Evita null y simplifica el setup del spawn.
¿Cómo corregir duplicados por Don't Destroy on Load?
- Abre la escena de destino y borra el jugador y la cámara locales.
- Guarda la escena y prueba la transición desde la escena principal.
- Verifica que el personaje aparece en el punto de spawn y la cámara acompaña.
¿Cómo conservar la dirección de mirada con facing direction?
Entrar mirando en la dirección equivocada rompe la continuidad. Define una facing direction en cada Spawn Zone y asígnala al campo de movimiento del personaje.
- Añade en SpawnZone:
public Vector2 facingDirection = Vector2.zero.
- Tras reposicionar, asigna:
thePlayer.lastMovement = facingDirection.
- Configura en el Inspector combinaciones de 0, 1 y -1: por ejemplo, (0, 1) para mirar hacia arriba.
¿Cómo configurar el Vector2 facingDirection?
- Arriba: (0, 1).
- Abajo: (0, -1).
- Izquierda: (-1, 0).
- Derecha: (1, 0).
- Úsalo de forma coherente con el grafo del Animator.
¿Cómo preparar entradas y salidas múltiples con change zone?
- Coloca varias Spawn Zone donde necesites instanciar al personaje.
- Crea Change Zone en puertas, escaleras u otras salidas.
- En cada Change Zone, especifica el nombre de la escena destino.
- Asegúrate de que Spawn Zone y Change Zone no se solapan.
¿Te gustaría que revisemos tu configuración de Spawn Zone y facing direction? Comparte dudas y ejemplos en los comentarios.