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.
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.
Sale error en la camara con el script DontDestroyOnLoad cambiar el Start por Awake
voidAwake(){//Si el player no esta cargado, no destruye el objecto que trae este scriptif(!PlayerController.playerCreated){DontDestroyOnLoad(this.transform.gameObject);}else{Destroy(gameObject);}}```
Gracias!
Estoy usando Unity 2021.2.1a7f1 y desde la clase pasada tengo muchos problemas con el DontDestroyOnLoad, el conejo no aparecia, o la camara se eliminaba, despues de un rato buscando pude solucionarlo, pero en esta clase sigue el problema, el conejo desaparece, si le hago un cambio al script sale el conejo pero si cargo de nuevo el juego desaparece.
Al hacer el cambio de escena se va a otro lado que no es el SpawnZone.
El curso y el profe son MUY buenos, pero es imposible seguir el curso de esta forma, no entiendo porque en Platzi no actualizan estos cursos o no sacan minimo 1 al año, ya que Unity avanza muy rapido.
Espero algun dia mejoren este tema tan importante para muchos que queremos dedicarnos a esto y tener una buena certificacion de Unity.
Comparto, no tuve el problema que mencionas pero si es un poco frustrante el hecho de que le den tan poca bola al desarrollo de videojuegos. Son cursos con mucho tiempo y nadie responde los comentarios. Me terminé comprando cursos en otras plataformas por este problema.
Siento que el movimiento del personaje es bastante feo. Cuando uno apreta en diagonal y luego sin soltar la tecla mantiene uno de las flechas horizontales, el personaje se sigue moviedo en diagonal.
Hola, me pasaba lo mismo como a varios y alguien dio con la solucion en una sola linea. En el PlayerController, en el Update justo debajo de cargar false al walking pone:
playerRigidbody.velocity = Vector2.zero;
Estas reiniciando ambas velocidades y solo va a tomar la que estes presionando.
si usas cinemachine que sepas que la camara se va directamente al pleyer no necesitas llamarla en el spawnZone
Cuando agrego el script SpawnZone me deja de cargar la cámara.
Ya pude arreglarlo, solo le quite el script DontDestroyOnLoad a la cámara y se lo volví a poner, y con es eso soluciono.
Alguna idea de porque pasa ese error? Me pasó 2 veces y el metodo que explicas si funciona pero nose como podria arreglarlo para no hacerlo cada vez que quiero ejecutar el programa.
Tengo 2 problemas:
1: La camara no carga cuando le doy Play, y se arregla quitando el script de dontdrestroy y volviendolo a colocar, pero tengo que hacerlo cada vez que cambio entre escenas.
2: Mi conejo desaparece como si estuviera hasta abajo en los sorting layers, lo cual lo tengo hasta arriba.
Yo tuve los mismos problemas:
1.En el PlayerController le puse hice una función en donde se ejecutaba:
private void DonDestroy(){
playerCreated = true;
DontDestroyOnLoad(this.transform.gameObject);
}
y luego en el Start() del PlayerController la invocó a través del Invoke.
2.En el script SpawnZone en el Start() sustituí la linea de código thePlayer.transform.position = this.transform.position por lo siguiente:
thePlayer.transform.position = new Vector3(this.transform.position.x,this.transform.position.y,thePlayer.transform.position.z);
Espero le sea de ayuda
Cuando entré a la nueca escena a pesar de que se veia la cama y el player en el menú de la izquierda no se veia el player, lo arreglé colocándole posición z = 0 al SpawnZone que al parecer por defecto queda en la misma posición que la cámara -10 en z.
Para aquellos que sí les carga el jugador en la escena y no la cámara, el problema es que la cámara está en la posición z=0. Cambien el archivo de RespawnZone
De: theCamera.transform.position = new Vector3(this.transform.position.x, this.transform.position.y, this.transform.position.z);
.
A: theCamera.transform.position = new Vector3(this.transform.position.x, this.transform.position.y, -10);
Fue la única forma en que me ayudo, muchas gracias
Para los que les da el problema que desaparece la Camara cuando renderizan el juego, mi solución de momento es igualar el propio Script al Script del PlayerController, de esta forma:
qué versión de Unity utilizas?¡
La 2019.1.11f1
Cuando se corrige el bug del conejo?
Tengo un problema totalmente diferente. El DontDestroyOnLoad trae tanto al jugador como la cámara, pero el jugador no se muestra en la pestaña de game. Sin embargo, si se muestra en la pestaña de Scene ¿Alguien puede ayudarme?
Recuerda que debes de acomodar el sorting layer de los objetos, ya que sin importar que profundidad tenga en el mundo 3D tiene mas
prioridad el manejo de capas.
Hola Johnny. Muchas gracias por contestarme. No se si es un bug de la versión de unity, pero aunque organice las capas, este seguía sin aparecer. Así que imaginé que se podía obtener la posición de un gameobject vacío en la escena. De esa manera cree estos GameObjects en cada nivel que he creado, y basta con solo asignarle esa misma posición al player para que aparezca. Asumo que no es la mejor solución, pero, quería avanzar y los layers, como te digo, así los organizase, no funcionaba.
Hola. Cuando entro a la casa y se muestra esa escena todo va muy bien. Pero cuando salgo para llegar de nuevo a la escena principal, se crea otra cámara que enfoca a la parte del escenario donde salía primero el personaje y éste ya no se ve. ¿Cómo puedo solucionar eso?