Un breve tutorial explicando como hacer un clon de un personaje en tercera persona que sea capaz de replicar todos sus movimientos. Hablaremos sobre algunos detalles de la clase Player Controller de Unreal Engine 4 y cómo funciona.
Podemos empezar aprendiendo algunos conceptos sobre la clase Third Person Character o personaje en tercera persona, que viene con la plantilla de proyecto Third Person incluida en el motor.
Un Third Person Character es un Pawn que puede moverse por el nivel. Y un Pawn es un Actor que puede ser «poseído» y recibir la entrada de un controlador.
Un detalle importante es que un Pawn debe estar poseído para que sea capaz de moverse. Puede ser poseído por un Player Controller, en cuyo caso acepta y procesa la entrada de un usuario, o un AI Controller, con el que tendríamos que programar el movimiento nosotros mismos.
En la pestaña Details del blueprint Third Person Character podemos encontrar la sección del Pawn encargada de la posesión inicial.
Aqui tenemos dos parametros importantes para controlar la primera posesión. Primero tenemos que saber que un Pawn puede ser poseído sólo por un Controller de cualquier tipo. No podemos tener un Pawn controlado por un player y un AI Controller al mismo tiempo.
Nota: Si seleccionamos todos los parámetros de Auto Possess a Disabled tendremos que utilizar el nodo Spawn Default Controller. Este nodo añade un objeto AI Controller al nivel y lo utiliza para controlar el pawn que se le indica en su parámetro Target.
Debemos tener cuidado con este nodo porque con cada llamada crea un nuevo Controller pero deja el anterior en el nivel sin destruir, resultando en un gasto de recursos al quedar ese AI controller sin hacer nada.
Para nuestro propósito no vamos a necesitar este nodo. Vamos a añadir ambos Third Person Character a nuestro nivel con el valor de Auto Possess AI establecido en Placed in World.
Cuando el nivel comienza sin un Pawn poseído por un jugador entonces un Pawn por defecto es creado automáticamente y el jugador toma su control. Esta es la clase que podemos encontrar en en Default Pawn Class del objeto GameMode de nuestro proyecto.
Para nuestro ejemplo vamos a utilizar la clase Default Pawn pero esconderemos su malla (la esfera) y desactivaremos su colisión también, así evitamos ver una esfera en el nivel cuando es creado.
Nuestro Third Person Character
Queremos ser capaces de intercambiar los roles de jugador y clon en cualquier momento, para ello necesitamos guardar en cada personaje una referencia su AI Controller, que utilizará cuando el personaje sea el clon. Utilizando el nodo Possess hacemos que el Controller aportado en el parámetro Target tome el control del Pawn (nuestro personaje) del parámetro In Pawn. Lo utilizaremos cuando el personaje tenga que convertirse a clon.
Para el controlador del jugador no necesitamos guardar ninguna referencia ya que podemos acceder directamente a el utilizando el nodo Get Player Controller y el índice del jugador. Esta opción será la que usemos cuando queramos tomar el control del personaje.
Cada personaje tendrá una referencia al otro personaje para facilitar el intercambio de roles. Y con esto la función que inicializa el personaje queda así:
En el Blueprint del nivel tenemos que llamar a esta función Initialize Character con cada uno de los Third Person Character para interconectar ambos y poseer uno de ellos con el Player Controller.
Ahora podemos continuar con los eventos de movimiento. Empezaremos con el evento de salto, una manera sencilla de ver como vamos a distribuir la entrada del jugador.
Una anotación importante: Los eventos de entrada solo se activan en el personaje controlado por el jugador, por lo tanto tenemos que tomar la referencia al otro personaje y propagar el movimiento a ambos personajes. Las acciones sobre un Pawn, Como pueden ser Saltar o Entrada de Añadir Movimiento, sólo moverán al personaje si este esta controlado por un Player Controller o un AI Controller, así que no podemos tener un personaje sin su controlador.
Los otros dos eventos de movimiento son para controlar los otros dos ejes, uno para delante/atras y el otro derecha/izquierda. Tendremos que propagar el movimiento de la misma manera que hemos hecho con el evento de salto.
Ahora la última parte, para intercambiar los roles vamos a utilizar el Tabulador para iniciar la secuencia que va a hacer ese cambio de posesión de ambos personajes.
Recordemos, este evento solo se activa en el personaje que tiene el control del jugador. Por lo tanto tenemos que cambiar su controlador al AI Controller guardado en su variable y llamar a la función del otro personaje para que tome el control del jugador.
Después del cambio de controlador, los eventos de movimiento dejarán de activarse en el jugador maestro y el esclavo empezará a capturarlos.
Los nodos utilizados para cambiar los controladores son los mismos que hemos explicado unas líneas más arriba. Para tomar el control usaremos la salida del nodo Get Player Controller como entrada
Y para perder el control usaremos la referencia AI Controller que hemos guardado durante la inicialización del personaje.
Blueprint del nivel
En el Blueprint del nivel, después de inicializar ambos personajes, tenemos que poseer uno de ellos. Y con esto ya habremos terminado.
Siempre dos hay, ni mas, ni menos. Un maestro y un aprendiz.
Yoda
Ahora cuando el jugador se mueve por el nivel el clon realiza los mismos movimientos. Como estamos propagando la entrada del jugador si uno de los personajes colisiona con un objeto el otro continuará su movimiento. Presionando el Tabulador de nuestro teclado intercambiamos los roles de los personajes.
Tutorial files
Te puede interesar:
Ayudanos con este blog!
El último año he estado dedicando cada vez más tiempo a la creación de tutoriales, en su mayoria sobre desarrollo de videojuegos. Si crees que estos posts te han ayudado de alguna manera o incluso inspirado, por favor considera ayudarnos a mantener este blog con alguna de estas opciones. Gracias por hacerlo posible!
Pero como aplicas esto cuando necesitas clonar dinámicamente (por ejemplo al pasar un portal) y sobre todo cuando necesitas clonar multiples veces?