Na aula anterior trabalhamos com movimento usando Rigidbody. Nesta aula continuaremos com o estudo de física entendendo como reagir a uma colisão, então partiremos do projeto da aula anterior.
Antes de mais nada, é necessário definir a nomenclatura correta: quando dois objetos entram em contato e esse contato resulta em informações de impacto, normal do contato, ponto de contato, reações de força, entre outros, esse contato se trata de uma colisão, portanto, toda colisão é um evento físico; quando dois objetos entram em contato e esse contato resulta apenas em informações de quais objetos entraram em contato e a área de contato de cada um, esse contato se trata de uma sobreposição, portanto, não é um evento físico.
Para reagir a ambos os casos, sobreposição e colisão entre objetos, o Unity dispõe dois tipos de métodos especiais, OnTrigger e OnCollision.
OnCollision
Métodos OnCollision são métodos de reação à uma colisão propriamente dita. Esse método recebe como parâmetro uma informação de colisão, um objeto da classe Collision.
A família de métodos OnCollision possui três variações, OnCollisionEnter(), OnCollisionStay() e OnCollisionExit().
A partir do código da última aula, vamos adicionar então o OnCollisionEnter() para exibir o nome dos objetos com quem a capsula colide.
No print acessamos o objeto que colide com a capsula através do collision.gameObject, referência para o objeto de cena envolvido na colisão.
Já é possível testar, mas a única coisa que acontecerá é, toda vez que a capsula entra em colisão, o nome do outro objeto será exibido no Console. Para criar algo um pouco mais interessante, podermos usar uma estratégia para diferenciar objetos. Podemos usar as tags para isso.
Selecione a Parede, embaixo do nome no Inspector você verá o campo da tag, abra a caixa de seleção e adicione uma tag nova. Eu coloquei o nome de wall. Depois de adicionar essa tag, selecione a parede novamente e mude a tag dela de "untagged" para "wall"
Agora no código, podemos usar a referência para o outro objeto (collision.gameObject) para verificar qual sua tag, e, se for parede, executar alguma ação.
Com o código acima, todo objeto wall com que a capsula colidir será destruído.
Como eu mencionei anteriormente, colisão gera várias informações, então tome a liberdade de dar uma olhada e testar essas informações. Como dica, experimente usar a normal da colisão para mover algum dos objetos.
OnTrigger
A outra família de métodos é a OnTrigger, que serve para detectar sobreposição. Para testar esse, crie um objeto vazio e configure uma área de colisão no chão - simularemos uma espécie de área de lentidão. Veja que o isTrigger precisará estar ativado, já que é ele quem indica que o collider não gera efeitos físicos.
Em código, toda vez que a capsula entrar em contato com essa área, iremos verificar se o objeto é a área de lentidão, quando entrarmos dentro dela diminuiremos o speed, quando sairmos voltaremos ao seu valor original.
Atente-se para o parâmetro que agora não é uma informação de colisão, mas sim o collider do objeto com quem a capsula se sobrepôs.
Já é possível testar e ver a capsula movendo-se devagar ao entrar, e depois voltando a velocidade original ao sair.
E para finalizar essa aula, o último detalhe é que para esses métodos rodarem (OnCollision e OnTrigger), ao menos um dos objetos envolvidos precisa ter o Rigidbody.