A interação entre objetos é um dos núcleos do desenvolvimento de jogos. Sobre esse aspecto, a interação pode se dar sobre uma perspectiva física - a colisão entre objetos, a reação da colisão, objetos imóveis, objetos que atravessam outros.
Nessa aula veremos em detalhes os principais componentes relacionados a física.
O Unity implementa as físicas 2D e 3D separadas, o motivo é porque internamente ele usa motores de física diferentes, para 2D ele usa a Box 2D, e para 3D usa a Physx. Iniciaremos falando de pontos gerais, e no fim trataremos das diferenças.
Área de Colisão
O principal elemento da física é a família de componentes do tipo Collider. Esses componentes são responsáveis por definir o espaço que um objeto ocupa em cena.
Quando mexemos no scale geralmente pensamos em aumentar o tamanho do objeto, e de fato é isso mesmo o que acontece, contudo, esse aumento se dá apenas na renderização do objeto, não no aumento do espaço de colisão que ele ocupa.
Isso também quer dizer que o formato do collider de um objeto, ou seja, a área de colisão de um objeto, pode não corresponder ao formato do objeto em si.
Ao digitar collider no Add Component, você verá a lista de colliders possíveis.
Cada collider destina-se a gerar uma área de colisão de formatos diferentes. Com exceção do Polygon Collider e do Mesh Collider, que geralmente são usados para gerar uma área de colisão do formato idêntico ao do objeto.
Apesar de parecer algo muito útil, na verdade, geralmente não queremos uma área de colisão idêntica a de um objeto, pois quanto mais complexo for o formato de um objeto, mais pesado será para gerar a colisão nesse objeto.
Pode ser tão pesado, a ponto de ser praticado o hábito de combinar áreas de colisão primitivas para aproximar o formato de um objeto, do que usar um Mesh Collider, por exemplo.
As imagens a seguir demonstram no Unity essa aproximação:
Essa imagem apresenta um objeto com a área de colisão dividida em três colliders para que se cubra toda a superfície do objeto. Veja também que foi combinado dois tipos de colliders, e seus atributos foram configurados para encaixar os colliders nos pontos certos, por cima do objeto (o contorno verde representa o collider).
Os colliders em geral servem para que um objeto detecte a presença de outro, por exemplo, quando queremos que um personagem fique fechado em uma sala, colocamos colliders nas paredes e no objeto, e assim o personagem poderá detectar quando o collider da parede entra em contato com o seu, e parar de se mover, ou então aplicar algum tipo de força.
Eventualmente os colliders podem ser usados apenas para detectar, em código, a presença de um objeto dentro dele, sem lidar com física de fato, ou seja, sem causar danos, ou reações de força, empurrões, batidas, etc.. Nesse caso, os colliders vem com um atributo chamado isTrigger, que, quando ativado, indica que aquele collider não causa eventos físicos, apenas detecta a presença de objetos (logo ele permite objetos o atravessarem).
Rigidbody
Os colliders definem o espaço físico que um objeto ocupa, mas apenas isso. Para complementar o uso dos colliders é necessário o Rigidbody, um componente que indica que um objeto possui um corpo físico, que poderá gerar informações de colisão, sobreposição, movimento, gravidade, velocidade, enfim, tudo o que cabe dentro de uma simulação física.
Nem sempre é necessário um rigidbody em um objeto com collider, quando falamos de 3D; no caso do 2D o Unity recomenda sempre o uso dos dois componentes juntos, mesmo que um objeto não faça nada.
Existem três tipos de Rigidbody:
Dinâmico: sinaliza que o objeto terá sua física controlada pelo motor de física do Unity, ou seja, se você bater na parede com o personagem, ele será jogado para trás, por exemplo.
Cinemático: sinaliza que o objeto terá sua física totalmente implementada pelo programador, ou seja, você terá que programar a reação do personagem ao bater na parede, caso contrário ele atravessará a parede.
Estático: sinaliza que o objeto não se moverá, nem será controlado por um jogador. É muito útil para criar objetos fixos no cenário, pois otimiza consideravelmente a simulação física, entretanto, se for movido, ou controlado, acaba se tornando mais pesado que um objeto dos outros tipos.
No 3D, se o objeto for estático, não é necessário ter um Rigidbody nele