en Tutoriales, UE4

Clonando el movimiento del personaje

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.

diagram_class_character

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.

pawn_section

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.

spawn_controller

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.

gamemode_details

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.

lose_player_control

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.

take_control

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í:

initialize_character

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.

jump_event

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.

character_movement

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.

move_character

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

take_control

Y para perder el control usaremos la referencia AI Controller que hemos guardado durante la inicialización del personaje.

lose_control

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

level_beginplay

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.

youtube_character_clone

Tutorial files

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!

Escribe un comentario

Comentario

  1. Pero como aplicas esto cuando necesitas clonar dinámicamente (por ejemplo al pasar un portal) y sobre todo cuando necesitas clonar multiples veces?