La forma más fiable de reiniciar una partida en Unity 2D es guardar la posición inicial del personaje y restablecer su estado físico al relanzar el juego. Aquí verás cómo implementar un reset sólido con Start, StartGame, PlayerController y GameManager, además de entender por qué en 2D seguimos usando Vector3 y cómo afecta la cámara ortográfica.
¿Cómo implementar el reset del juego en Unity sin errores?
Para reiniciar sin efectos indeseados, primero se registra la posición inicial del jugador en Start y luego, en StartGame, se restaura su posición y se detiene su velocidad. Así evitas que, si estaba cayendo muy rápido, atraviese el suelo al reaparecer.
Guardar la posición inicial con Vector3.
Reposicionar al personaje con StartGame.
Frenar la física con Vector2.zero en el Rigidbody.
Sincronizar GameManager con PlayerController.
¿Cómo guardar la posición inicial con Vector3?
Un juego 2D usa X, Y y también Z: Unity guarda posiciones en 3D.
El personaje reaparece muerto si estaba en estado de muerte.
Se puede reiniciar en cualquier momento con el botón de inicio.
Quedan varios ajustes pendientes para que el ciclo de vida sea consistente.
¿Por qué usar posiciones 3D en un juego 2D?
Aunque la escena se perciba plana, Unity trabaja con X, Y, Z incluso en 2D. La diferencia la marca la cámara: con cámara ortográfica no hay percepción de profundidad y el tamaño aparente no cambia al alejarse o acercarse en Z. En perspectiva, sí hay profundidad y el personaje se ve más pequeño al alejarse.
¿Qué diferencia hay entre cámara ortográfica y perspectiva?
Ortográfica: sin profundidad percibida, tamaño constante. Ideal para 2D.
Perspectiva: profundidad visible; al alejar el objeto, se hace pequeño.
Cambiar entre modos muestra que el mundo sigue siendo 3D.
¿Cómo afecta la coordenada Z en escenas 2D?
Con Z = 0 para objetos, todo queda en el mismo plano.
Mover en Z no cambia el tamaño con cámara ortográfica.
La escena es 3D, pero la jugabilidad opera en plano.
¿Cómo sincronizar GameManager y PlayerController para iniciar partida?
El GameManager debe orquestar el inicio: invoca a StartGame del PlayerController tras preparar el estado del juego. Para ello, crea una referencia al controlador del jugador y asegúrate de que el método sea público.
¿Cómo referenciar al personaje con GameObject.Find o tag?
Puedes usar nombre o tag. En el ejemplo se usa el nombre "player".
Recupera el PlayerController con GetComponent.
publicclassGameManager:MonoBehaviour{privatePlayerController controller;voidAwake()// o Start{ controller = GameObject.Find("player").GetComponent<PlayerController>();}}
¿Cómo exponer StartGame para que el manager lo invoque?
Si StartGame es private, verás el error: no accesible por nivel de protección.
Hazlo public para que otros scripts lo llamen.
publicclassPlayerController:MonoBehaviour{publicvoidStartGame(){/* reposicionar y frenar */}}
¿Cuándo llamar a StartGame desde el manager?
Al entrar al estado de partida, tras configurar variables con SetGameState.
Instrucción clave: controller.StartGame();.
Alinea la escena para jugar y ubica al personaje en su posición inicial.
¿Te quedó alguna duda sobre la integración entre GameManager y PlayerController o sobre la cámara ortográfica? Comparte tu caso en los comentarios y lo revisamos juntos.
Con este video me doy cuenta como puedo mejorar visualmente el juego, si a tus plataformas les asignas en la posición Z el valor 1 y el Player en su posición Z le dejas 0, puedes generar un mejor efecto de que el Player camina sobre las plataformas.
Gran detalle gracias
Que buen aporte! lo vengo preguntando desde el inicio del curso y no había obtenido respuesta! Muchas gracias!
Como habilito autocompletar, o las sugerencias en VSC?
Prueba haciendo click en ese icono de la barra de herramientas, o presiona ctrl + alt + space.
Visual Studio Code es un excelente editor, sin embargo te recomiendo que te descargues el Visual Studio Community (seleccionando la opción de Videojuegos para Unity en el instalador) que ya trae incorporado todas las sugerencias del intellisense (autocompletar y documentación), luego en Unity dentro de las preferencias y editor de código debes setear "Visual Studio Community" como editor predeterminado en vez de la opción "abrir archivos con extensión"
Por que debemos de declarar una variable con Clase:
PlayerControler
Si luego volvemos a colocar **PlayerController **a la hora de buscar un componente?
Es la forma de trabajar con este tipo de lenguajes. Debemos especificar el tipo de dato que queremos obtener, incluso si la variable a la que se lo vamos a asignar ya tiene definido ese mismo tipo de dato.
no es necesario que coloques el tipo de objeto, de hecho puedes utilizar la palabra reservada **var **ej var controller = GameObject.Find( ... etc ) y el compilador deducirá automáticamente el tipo de dato. C# soporta tanto como inferencia implícita como explicita.
like
Porque se inicializa el playercontroller en el start del game manager, no debería ser en el awake?
Como aporte a lo que dijo un compañero abajo. Si al Player le ponemos Z = -1 , el personaje se ve por delante de cada objeto en el juego, con lo cual parece que camina por encima.
De esta forma no hay que cambiar cada objeto a mano, sino simplemente el player.
En el minuto 6 de la clase, se rellena el método Start de la clase GameManager.
Yo he entendido lo siguiente que pongo como comentarios en mi propio código. ¿Qué opináis?
// Start is called before the first frame updatevoidStart(){/*Controller es igual a que la clase GameObject localice (Find) un objeto.
*Como no se puede convertir implicitamente la clase GameObject en "Player"
*(el nombre de nuestro GameObject de personaje en Unity, definido en Hierarchy, panel Jerarquía)
* tenemos que obtener el componente PlayerController del GameObject para que el casting sea posible.
* De modo que invocamos al método "GetComponent" con el nombre de la clase que ya está declarada
* arriba del Awake, "PlayerController", por lo que ahora sí es posible el casting implícito.
* Además, de esta manera el Game Manager tiene localizado a nuestro PlayerController, enlazado con Unity*/ controller =GameObject.Find("Player").GetComponent<PlayerController>();}
crea la posicion inicial (startPosition)
cada vez que se inicia, lo colocamos en la posicion inicial metodo Start() de PlayerController
StartGame reinicia la posicion y velocidad del personaje
obtenemos el player a traves de controller buscandolo con (en mi caso) controller = GameObject.FindWithTag("Player").GetComponent<PlayerController>();
pregunta, mi animacion del muñeco quedo algo rara, pues coloque animacion para Idle, run, die y jump por alguna razon las animacione sno se ejecutan del todo bien, lo que hice es hacer otyro proyecto y al parecer yta funciona la animacion, es posible importar esas animaciones al actual juego y reemplazar la existente?
Yo creo que sí.
Si se pueden importar, se pueden usar algunos assets del store para editar mas facil las animaciones, tambien esta la ventana de Animator, ahi puedes ver como se anima frame por frame y puedes agregar como se mira la animacion por segundo queda mas "Smooth".
Es realmente importante tener claro el manejo de métodos públicos y privados!!