Menu
CoddyTech

Colliders de gatilho

Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 15 de 71.

Um collider com a opção Is Trigger marcada deixa de ser sólido: os rigidbodies passam direto por ele, e o Unity informa a sobreposição em vez disso, chamando OnTriggerEnter nos scripts dos dois objetos. Linhas de chegada, itens coletáveis e zonas de perigo são triggers. No código, a caixa é a propriedade isTrigger do collider.

A zona de alarme deste cofre transforma seu collider em um trigger quando o jogo começa, o que equivale a marcar a caixa, e toca o alarme quando um guarda entra:

void Start()
{
    GetComponent<Collider>().isTrigger = true;
}

void OnTriggerEnter(Collider other)
{
    Debug.Log("Alarm!");
}

Os triggers seguem a mesma regra das colisões: o Unity só verifica um par quando pelo menos um dos dois objetos tem um Rigidbody. Dois objetos sem Rigidbody nunca detectam um ao outro, sejam triggers ou não. Os guardas patrulham por meio de um script, então cada guarda tem um Rigidbody cinemático (Add Component, Rigidbody, Is Kinematic marcado): a gravidade e os impactos não o afetam, e ele ainda conta como um Rigidbody. Sem os Rigidbodies dos guardas, um guarda atravessa a zona e o Console continua vazio. Sem isTrigger, a zona é uma caixa sólida, e um corpo cinemático nunca toca um collider que não tenha um Rigidbody, então, novamente, nada é registrado. Um Rigidbody no par é suficiente, em qualquer um dos objetos. A próxima aula aborda other, o collider que entrou.

challenge icon

Desafio

Fácil

Faça o drone voar pelos anéis e deixe cada anel relatá-lo.

  1. Em Start() de Drone.cs, defina body = gameObject.AddComponent<Rigidbody>(); e body.isKinematic = true; para que ele voe nivelado.
  2. Em Start() de Ring.cs, defina GetComponent<Collider>().isTrigger = true;.

Pressione “Jogar”: o drone voa pelos anéis, e o Console exibe Ring1 passed, Ring2 passed e Ring3 passed. Em seguida, clique em “Verificar”.

Experimente você mesmo

using UnityEngine;

public class Ring : MonoBehaviour
{
    void Start()
    {
        // Faça o collider deste anel funcionar como um trigger
    }

    void OnTriggerEnter(Collider other)
    {
        Debug.Log(name + " passed");
    }
}

Todas as lições de Física e Jogabilidade

Pratique por conta própria: Playground de Unity