Spawn Zone: sincronizar entrada entre escenas

Clase 18 de 60Curso Avanzado de Creación de RPGs con Unity

Resumen

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.