Tipos de colisão
A colisão na Unreal Engine é semelhante à colisão no Unity, mas apresenta algumas diferenças que serão abordadas aqui. Se você utilizou a detecção de colisão baseada em camadas do Unity, as configurações de colisão do projeto devem ser semelhantes à matriz de colisão. É possível acessar isso em Editar, Configurações do projeto, Colisão. Ao expandir a guia Predefinições, é possível visualizar todos os perfis predefinidos padrão com uma descrição de suas funções.
Você notará que a Unreal possui algumas opções adicionais para resolver colisões. Elas são abordadas em profundidade na Visão geral sobre colisão na Unreal Engine. É recomendável ter esse nível de granularidade na detecção de colisões, pois pode contribuir para o desempenho do seu jogo. É importante compreender:
Os canais ou colisores individuais podem ser configurados para Bloquear, Sobrepor ou Ignorar.
Um erro comum é não ter a caixa de seleção Gerar eventos de sobreposição marcada corretamente nos seus colisores quando esses eventos são necessários.
A geometria estática deve bloquear e sobrepor-se, mas não necessariamente gerar eventos de sobreposição ou acerto, uma vez que isso não é necessário para a jogabilidade.
Eventos de sobreposição podem ser gerados mesmo que um objeto bloqueie outro, especialmente quando se deslocam em alta velocidade. No Unity, isso pode ser um problema se você estiver modificando diretamente a translação em vez de um componente Rigidbody. Fazer isso ignora considerações físicas.
Na Unreal, quando você chama qualquer função que atualiza a transformação de um ator, há dois parâmetros booleanos que determinam como você deseja que o ator se mova:
Fazer varredura definido como verdadeiro aciona sobreposições e interrompe o ator antes do destino, caso esteja bloqueado. Teletransportar determina se a velocidade física é preservada ou não.
Os canais também podem ser utilizados para traçados, que são equivalentes à projeção de física do Unity (ou seja, Raycast, SphereCast, etc.). Você pode passar o canal durante a chamada da função Traçado de linha da mesma forma que passaria a máscara de camada em um Raycast no Unity.
Tipos de colisões personalizadas do Parrot
O Parrot possui alguns canais de objetos de colisão personalizados configurados: Player, Cannonball e Enemy.
Ao adicionar esses tipos de objetos, o Parrot pode controlar exatamente como esses canais de objetos interagem com os canais de rastreamento à medida que ocorrem colisões no mundo. Uma resposta padrão é definida para o que geralmente deve ocorrer, mas ela pode ser personalizada conforme desejado. O Parrot também possui algumas predefinições personalizadas de canais de rastreamento: Player, OverlapAllPlayers, BlockAllPlayers, Cannonball e Enemy.
Essas predefinições são particularmente úteis para gatilhos de jogabilidade. Por exemplo, OverlapAllPlayers pode ignorar todas as outras colisões e responder apenas a eventos de colisão com tipos de objetos de colisão de jogadores. Ao examinar as configurações de colisão para diferentes malhas no jogo, você observará que essas predefinições são utilizadas com frequência.
As configurações de colisão também podem ser personalizadas por malha, se desejado.
Delimitações do mundo
Ao criar seus níveis, é importante observar as Delimitações do mundo. Isso pode ser definido em Configurações do Mundo, Mundo. Você pode implementar um tipo de dano personalizado para quando um ator interage com essas delimitações do mundo definidas. Os limites do Parrot utilizam uma combinação da configuração de mundo KillZ e dos volumes de disparador Fora dos limites.
Volumes de disparador
A Unreal Engine possui atores de volume de disparador integrados (consulte Atores de volume de disparador na Unreal Engine) que podem ser usados para acionar eventos. Exemplos em que os desenvolvedores utilizam essas funcionalidades no Parrot são os volumes de disparador Fora dos limites e Linha de chegada. Os volumes de disparador são frequentemente utilizados em conjunto com o Blueprint de nível (consulte o documento do desenvolvedor Blueprints de níveis no Parrot), mas não são obrigatórios. O gatilho do Parrot para Fora dos limites é um gatilho de caixa com um gráfico de eventos simples:
Se você observar as configurações de colisão do ator no painel Detalhes, verá que a predefinição do canal de colisão realiza a maior parte do trabalho aqui.
Coleta de potência
Vamos examinar um exemplo prático do sistema de colisão com a implementação de coleta de potência do Parrot. Se você abrir BP_PickupBase em Conteúdo, Blueprints, Coletas e observar a janela de visualização, poderá ver a hierarquia que contém o componente de colisão.
As configurações de colisão e Fora dos limites possuem um gatilho predefinido que gera eventos de sobreposição com os jogadores:
Ao observar o Gráfico de eventos, você verá o evento ActorBeginOverlap com Outro ator como parâmetro. Esse evento funciona de maneira muito semelhante ao OnCollisionEnter no Unity. A diferença aqui é que, em vez de receber um componente colisor, você recebe o próprio ator.
O Parrot realiza uma verificação para confirmar se o ator é um jogador que se sobrepôs. Em seguida, o evento OnPickedUp é chamado. Isso permite que as classes derivadas do Blueprint definam seu próprio comportamento para OnPickedUp, enquanto a classe base lida com o evento de sobreposição do ator.
Os desenvolvedores usam o Blueprint base para fazer com que todos os itens coletados emitam um som e gerem alguns efeitos de partículas. As variáveis de som de coleta e efeito de partículas são editáveis por instância, para que possam ser definidas nos padrões de classe das classes derivadas. Padrões de classe estão localizados no editor de Blueprint, na parte superior, ao lado do botão Compilar:
Um exemplo de alteração nos padrões da classe pode ser encontrado na coleta de aceleração, que utiliza um sistema Niagara com partículas verdes (em comparação com a coleta de coração, que utiliza rosa). Da mesma forma, a malha de coleta propriamente dita pode ser definida em projetos derivados. A última etapa na lógica de sobreposição é destruir o ator de coleta, uma vez que não desejamos que ele persista depois que um jogador tenha realizado a sua coleta.
Com apenas alguns nós, é possível criar uma lógica robusta que pode ser facilmente expandida para Blueprints derivados. Todos os Blueprints derivados têm origem em um evento de sobreposição vinculado ao ator.
Personagem do jogador saltando sobre um inimigo
Outro excelente exemplo a ser observado é o jogador saltando sobre um inimigo. O tipo de colisor da cápsula do inimigo é "enemy" e colidirá com os tipos de objetos do jogador (player). Inimigos com espadas também apresentam um evento de sobreposição semelhante. Estes são comumente chamados de área de acerto (hitbox) e são onde um ataque é eficaz.
Porém, quando um jogador tenta saltar sobre um adversário, como é que o Parrot contorna essa situação? A solução foi colocar uma área de dano (hurtbox) nas cabeças dos inimigos. Quando o jogador se sobrepõe a esse volume da área de dano, o personagem do jogador pode então realizar uma série de verificações para determinar se é um salto válido com base na localização do personagem, na localização da área de dano e nas extensões da área. Se as verificações forem aprovadas, o jogador poderá realizar seu salto e atingir o inimigo. O trabalho pesado é novamente realizado pelos canais de colisão, que filtram apenas as sobreposições que interessam ao Parrot: um objeto de colisão do jogador (player) e um inimigo (enemy) no volume da área de dano.