¿Cuáles son las partes de un personaje en Unreal Engine?
Como se mencionó en la sección Modo de juego/Estado de juego, el marco de jugabilidad de Unreal Engine ayuda a comprender cómo funcionan los personajes en Unreal Engine. De manera conceptual, un jugador consiste en un peón que representa la presencia física en el entorno de juego, y un controlador determina el comportamiento. Este desacoplamiento es útil para la IA así como para la replicación de la red. A modo de referencia, la jerarquía se ve así:
Para empezar, importaremos los recursos, crearemos el peón y avanzaremos hasta el controlador de jugador. Para Parrot, nuestro héroe controlado por el jugador será el Capitán Barbarossa (visita el sitio web de Quaternius para conseguir el kit pirata proporcionado por Quaternius).
Cómo importar recursos de arte
Elige una herramienta de modelado 3D para exportar la malla y las animaciones en un formato compatible con el motor. En este caso, los desarrolladores usaron .fbx. Los recursos de Barbarossa están en Content/Assets/Quaternius/PirateKit/Characters/Barbarossa. Si deseas importar tu .fbx, puedes hacer clic con el botón derecho en el menú contextual, o bien arrastrar y soltar el archivo en el explorador de contenido. Vas a ver una ventana de configuración de importación de .fbx . Elige las opciones adecuadas para la importación. En este caso, asegúrate de que no haya un esqueleto existente seleccionado y que esté seleccionada la opción de importar animaciones. También es necesario crear un nuevo material de atlas que se pueda indexar mediante la malla. Este material se puede reutilizar en todos los recursos del kit pirata. Ahora deberías tener estos 3 archivos y todas las animaciones en tu .fbx.
Para mayor claridad, los archivos de secuencia de animación se encuentran dentro de la carpeta Animaciones que está junto a 3 archivos:
Esqueleto, malla esquelética y recursos de física
Un esqueleto es una jerarquía que se utiliza para definir huesos (a veces se denominan articulaciones) en una malla esquelética. Estos huesos coinciden con el rig de tu herramienta de modelado 3D. Los esqueletos se pueden reutilizar en todas las mallas esqueléticas siempre que los rigs sean compatibles. También advertirás que se creó un recurso de física. Los recursos de física definen la física y la colisión que se utilizan en una malla esquelética. Contienen cuerpos rígidos y restricciones para la simulación. Solo puedes tener un recurso de física por malla esquelética, y dicho recurso se puede activar o desactivar según ciertas condiciones. Puedes ajustar los recursos de física a medida que se importan o cuando se crean recursos nuevos desde una malla esquelética.
Blueprint de animación
Ahora que hay una malla esquelética con la cual trabajar, puedes empezar a animarla con el blueprint de animación. El blueprint de animación es similar al sistema de animación Mecanim. El gráfico de animación en los blueprints de animación debería parecer conocido y funcionar de forma similar. Los dos sistemas tienen un flujo de lógica condicional que puede provocar la transición de los estados de animación a una pose de salida final. En tu carpeta, crea un blueprint de animación nuevo desde el menú contextual y selecciona el esqueleto. El blueprint de animación se llamará ABP_Captain_Barbarossa en Content/Blueprints/Player.
A la izquierda del inspector de blueprints, notarás que hay dos gráficos: gráfico de eventos y gráfico de animación. El gráfico de animación es la máquina de estado que controla la pose de salida final. El gráfico de eventos es donde puedes definir cualquier lógica en relación con la animación. A diferencia de Unity, donde tienes que pasar datos al componente Mecanim, los blueprints de animación pueden extraer lo que necesiten en un evento específico. Por ejemplo, es probable que desees consultar la velocidad del personaje y controlar tu animación en función de ese valor. Una forma ordenada de hacer esto es usar el nodo Event Blueprint Initialize Animation en el gráfico de eventos, obtener el actor propietario y almacenar en caché su componente de movimiento en una variable. Desde ahí, con cada tic de BlueprintThreadSafeUpdateAnimation, puedes consultar la velocidad directamente desde el componente de movimiento. Las variables también se pueden compartir entre el gráfico de eventos y el gráfico de animación.
Vale la pena explorar más a fondo el blueprint de animación configurado para Barbarossa por tu cuenta. Al hacer doble clic en los nodos, puedes ver cómo las máquinas de estado, los estados y las reglas de estado están configurados para la pose de salida final. También hay ejemplos del uso de un jugador de secuencia y de un espacio de integración. De manera similar, el gráfico de eventos muestra cómo se controla la animación con los datos de personaje; esta relación se entenderá mejor a medida que avance el artículo.
Peón
Ahora que hay una malla esquelética que puede animarse, puedes empezar a crear elpeón que se utilizará en el modo de juego. Los desarrolladores eligieron basarse en el personaje predeterminado de Unreal Engine que es una clase derivada de la clase C++ de peón predeterminado. La clase de personaje tiene un componente de movimiento de personaje que es especialmente útil para este juego y es otra clase que sirve como base para construir.
El jugador y los peones enemigos comparten algunas características, como los puntos de vida, recibir daño y la muerte. Esta funcionalidad se comparte cuando se crea la clase C++ AParrotCharacterBase que se hereda de ACharacter. Esta clase sirve como una base sólida para comenzar a construir, a medida que los peones enemigos y del jugador adoptan comportamientos distintos.
A continuación, crea una clase C++ AParrotPlayerCharacter para controlar la lógica específica del jugador. Por último, crearás un blueprint para controlar la representación visual de tu personaje. El blueprint de Parrot es BP_ParrotPlayerCharacter bajo Content/Blueprints/Player. La jerarquía de herencia se ve de este modo:
Al abrir BP_ParrotPlayerCharacter, deberías ver algunos componentes en el inspector de componentes, a la izquierda de la ventana del editor. El componente de malla es donde puedes establecer tu recurso de malla esquelética así como el blueprint de animación en Clase de animación. Si la malla no está correctamente posicionada, puedes ajustar los valores de transformación para alinearlos con el componente de cápsula. Deberías tener algo como lo siguiente:
A continuación, puedes asignar la clase de peón predeterminado al blueprint en el recurso de modo de juego.
Ahora hay un peón en animación que se puede usar en el juego.
Controlador de jugador
Con un peón utilizable, ahora puedes crear el controlador de jugador. Los controladores de jugador reflejan básicamente las decisiones del jugador. Algo que debes tener en cuenta cuando crees tu juego es definir los eventos de entrada. Para los juegos simples donde los peones no cambian, el peón es un actor adecuado para esto. Sin embargo, cuando el comportamiento empieza a ponerse complejo, el controlador de jugador es una mejor opción en este caso. Los peones son transitorios y pueden ser tomados o liberados por los controladores de jugador. Los peones pueden generarse o destruirse mientras persisten los controladores de jugador en todo el juego.
No necesitarás ninguna lógica C++ en el controlador de jugador, así que solo crea un blueprint para hacer lo que es necesario. BP_ParrotPlayerController se encuentra en Content/Blueprints/Player. La jerarquía de herencia se ve de este modo:
Dentro del blueprint, observa que hay nodos de evento de entrada que conducen a cierta lógica de jugabilidad básica. Estos eventos de entrada están específicamente relacionados con Enhanced input. Si deseas saber más acerca de cómo se configura eso, consulta la documentación sobre Enhanced input. Si almacenamos en caché el peón de personaje jugable de Parrot al comenzar el juego, podemos usar eso para llamar a funciones de movimiento base más adelante. Por ejemplo, Añadir entrada de movimiento, Saltar y StopJump.
¡Hora de hacer una prueba! En el modo de juego BP, establece la nueva clase de controlador de jugador y después verifica que puedes usar el controlador en el juego:
Desde este menú desplegable en el editor de niveles, verifica que esté seleccionado el modo de juego correcto:
Po último, asegúrate de que el mapa tenga un actor PlayerStart y una cámara que puedas ver. Cuando pulsas el botón de reproducción, debes ver que el personaje se mueve y está animado:
Componente de movimiento de personaje de Parrot
La clase ACharacter base tiene integradas muchísimas funciones fantásticas. Un ejemplo de esto es el componente de actor UCharacterMovement. El componente de movimiento de personaje controla toda la lógica sobre cómo un personaje se mueve por el entorno. Admite las acciones de caminar, correr, caerse, nadar, volar y modos de movimiento personalizado. Realmente vale la pena que lo explores por tu cuenta para comprender cómo funciona el movimiento básico del personaje y también para hacerte una idea de cuán potentes son los componentes de actor.
En el caso de Parrot, el componente de movimiento de personaje base no transmitió la experiencia de juego deseada que los desarrolladores buscaban de forma inmediata. Sin embargo, sí proporcionó una base sólida sobre la cual construir. La clase C++ UParrotCharacterMovementComponent se deriva de UCharacterMovementComponent. A continuación, podemos definir el componente de movimiento en el componente de movimiento CDO en BP_ParrotPlayerCharacter de esta forma:
¿Pero qué hace el componente de movimiento de Parrot? Básicamente, el componente te permite definir un salto al estilo de los juegos de plataformas mediante la anulación de las funciones del componente de movimiento base relacionadas con los saltos. Con ciertos valores configurables por diseño, cuando ocurre un salto, puedes modificar la escala de gravedad del personaje jugable y la velocidad de salto para alcanzar una altura máxima en un tiempo determinado. Una vez que alcanzas la altura máxima, puedes empezar a aplicar una escala de gravedad para la caída. Si el jugador suelta la entrada de salto de forma anticipada, puedes aplicar un multiplicador para aumentar la gravedad.
El resultado es un salto que transmite mejor la sensación típica de un juego de plataformas, en lugar de simplemente aplicar un impulso en el eje Z.
Tratando al componente de movimiento de personaje base como cimiento, puedes enfocar la lógica del componente de movimiento de Parrot en el salto. También es muy útil observar los valores en el inspector para BP_ParrotPlayerCharacter en el componente de movimiento a fin de obtener un panorama completo de cómo funcionan juntas todas las piezas del componente de movimiento. La lógica de movimiento se puede ampliar para adaptarse a cualquier variedad de casos de uso.