Tipos de colisión
Las colisiones en Unreal Engine son similares a las de Unity, pero presentan algunas diferencias que se explican aquí. Si has utilizado la detección de colisiones basada en capas de Unity, la configuración de colisiones del proyecto debería ser similar a la matriz de colisiones. Puedes acceder en Editar > Configuración del proyecto > Colisión. Si amplías la pestaña Preajuste, podrás ver todos los perfiles predefinidos predeterminados con una descripción de lo que hacen.
Notarás que Unreal tiene algunas opciones más a la hora de resolver colisiones. Estos temas se tratan en profundidad en Introducción sobre las colisiones en Unreal Engine. Este nivel de detalle en la detección de colisiones es muy útil y puede ayudar al rendimiento de tu juego. Es importante comprender lo siguiente:
Los canales o colisionadores individuales se pueden configurar como Bloquear, Solapar o Ignorar.
Un error común es no marcar correctamente la casilla Generar eventos solapados en los colisionadores cuando necesitas esos eventos.
La geometría estática debe bloquear y solapar, pero no necesariamente generar solapamientos o colisiones, ya que no es necesario para el juego.
Se pueden generar eventos de solapamiento incluso si un objeto bloquea a otro, especialmente cuando se desplazan a gran velocidad. En Unity, esto puede ser un problema si modificas directamente la traducción en lugar de un componente Rigidbody. Al hacerlo, se pasan por alto consideraciones físicas.
En Unreal, cuando llamas a cualquier función que actualiza la transformación de un actor, hay dos parámetros booleanos que dictan cómo quieres que se mueva el actor:
Barrido activa los solapamientos y detiene al actor antes de llegar al destino si está bloqueado. Teletransporte determina si se conserva o no la velocidad física.
Los canales también se pueden utilizar para trazados, que son equivalentes al casting de física de Unity (es decir, proyección de rayos, SphereCast, etc.). Puedes pasar el canal durante la llamada a la función Trazado de línea del mismo modo que pasarías la máscara de capa en una proyección de rayos en Unity.
Tipos de colisiones personalizadas de Parrot
Parrot tiene configurados algunos canales personalizados para objetos de colisión: Player, Cannonball y Enemy.
Al añadir estos tipos de objetos, Parrot puede controlar exactamente cómo interactúan estos canales de objetos con los canales de trazado cuando se producen trazados de colisión en el mundo. Se establece una respuesta predeterminada para lo que debería ocurrir en general, pero se puede personalizar según se desee. Parrot también tiene algunos preajustes de canales de trazados personalizados: Player, OverlapAllPlayers, BlockAllPlayers, Cannonball y Enemy.
Estos preajustes son especialmente útiles para los activadores del juego. Por ejemplo, OverlapAllPlayers puede ignorar todas las demás colisiones y responder solo a los eventos de colisión con objetos de tipo colisión de jugador. Si observas la configuración de colisión de las diferentes mallas del juego, verás que estos preajustes se utilizan con frecuencia.
La configuración de colisión también se puede personalizar para cada malla, si se desea.
Límites del mundo
Al crear tus niveles, hay que tener en cuenta los límites del mundo. Puedes configurarlos en Configuración del mundo > Mundo. Puedes implementar un tipo de daño personalizado para cuando un actor interactúa con estos límites del mundo definidos. Los límites de Parrot utilizan una combinación de la configuración del mundo KillZ y los volúmenes de activación Fuera de los límites.
Volúmenes de activación
Unreal Engine tiene actores de volumen de activación integrados (consulta Actores de volumen de activación en Unreal Engine) que se pueden usar para activar eventos. Algunos ejemplos en los que los desarrolladores utilizan estos elementos en Parrot son los volúmenes de activación Fuera de los límites y Línea de meta. Los volúmenes de activación se suelen utilizar junto con el blueprint de nivel (consulta el documento para desarrolladores Blueprints de nivel en Parrot), pero no es obligatorio. El activador de Parrot para Fuera de los límites es un activador de caja con un grafo de eventos sencillo:
Si observas la configuración de colisión del actor en el panel Detalles, verás que el canal de colisión preestablecido realiza la mayor parte del trabajo aquí.
Recogida de potenciadores
Veamos un ejemplo práctico del sistema de colisiones con la implementación de la recogida de potenciadores de Parrot. Si abres BP_PickupBase en Content > Blueprints > Pickups y observas el visor, podrás ver la jerarquía que contiene el componente de colisión.
La configuración de Collision y Fuera de los límites tienen un activador preestablecido que genera eventos de solapamiento con los jugadores:
Si miras el grafo de eventos, verás el evento ActorBeginOverlap con otro actor como parámetro. Este evento funciona de manera muy similar a OnCollisionEnter en Unity. La diferencia aquí es que, en lugar de pasar un componente colisionador, se te proporciona el propio actor.
Parrot proyecta para comprobar que el actor es un activador que se ha solapado. Se llama al evento OnPickedUp. Esto permite a las clases blueprint derivadas definir su propio comportamiento para OnPickedUp, mientras que la clase base se encarga del evento de solapamiento de actores.
Los desarrolladores utilizan el blueprint base para gestionar que todos los objetos recogidos reproduzcan un sonido y generen algunos efectos de partículas. Las variables de sonido de recogida y de efecto de partículas se pueden editar por instancia, de modo que es posible establecerlas en los valores predeterminados de clase de las clases derivadas. Los valores predeterminados de clase se encuentra en el editor de blueprints, en la parte superior, junto al botón de compilación:
Puedes ver un ejemplo de valores predeterminados de clase modificados en la recogida de velocidad, que utiliza un sistema Niagara con partículas verdes (en contraste con la recogida de corazones, que utiliza partículas rosas). Del mismo modo, la malla de recogida se puede configurar en blueprints derivados. El último paso en la lógica de solapamiento es destruir el actor de recogida, ya que no queremos que permanezca después de que un jugador lo haya recogido.
Con solo unos pocos nodos, puedes crear una lógica robusta que se puede ampliar fácilmente a blueprints derivados. Todos los blueprints derivados provienen de un evento de solapamiento vinculado al actor.
Cuando un personaje jugador salta sobre un enemigo
Otro gran ejemplo a tener en cuenta es el jugador que salta sobre un enemigo. El tipo de cápsulas de colisión del enemigo es ‘enemy’ y colisionará con los tipos de objetos del jugador. Los enemigos con espadas también tienen un evento de solapamiento similar. Se conocen comúnmente como «cajas de impacto» y son los puntos en los que un ataque es efectivo.
Pero cuando un jugador va a saltar sobre un enemigo, ¿cómo lo evita Parrot? La solución es colocar una caja de daño en las cabezas de los enemigos. Cuando el jugador se solapa con este volumen de caja de daño, el personaje del jugador puede realizar una serie de comprobaciones para ver si se trata de un salto válido en función de la ubicación del personaje, la ubicación de la caja de daño y las dimensiones de la caja. Si superas las comprobaciones, podrás realizar el salto y golpear al enemigo. El trabajo pesado lo realizan una vez más los canales de colisión, que filtran solo los solapamientos que le interesan a Parrot: un objeto de colisión del jugador y un enemigo en el volumen de caja de daño.