Menu
CoddyTech

Триггерные коллайдеры

Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 15 из 71.

Коллайдер, у которого установлен флажок Is Trigger, больше не является твёрдым: тела с компонентом Rigidbody проходят сквозь него, а Unity вместо этого регистрирует пересечение, вызывая OnTriggerEnter в скриптах обоих объектов. Финишные линии, предметы для сбора и опасные зоны — это триггеры. В коде флажку соответствует свойство коллайдера isTrigger.

В этой сокровищнице зона сигнализации при запуске игры переключает свой коллайдер в режим триггера — это то же самое, что установить флажок, — и включает сигнализацию, когда в неё заходит стражник:

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

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

Для триггеров действует то же правило, что и для столкновений: Unity проверяет пару объектов, только если хотя бы у одного из них есть Rigidbody. Если у обоих объектов его нет, они никогда не регистрируют контакт друг с другом — независимо от того, являются ли они триггерами. Стражники патрулируют с помощью скрипта, поэтому у каждого стражника есть кинематический Rigidbody (Add Component, Rigidbody, установлен флажок Is Kinematic): гравитация и толчки на него не влияют, но он всё равно считается Rigidbody. Без Rigidbody у стражников стражник проходит сквозь зону, а Console остаётся пустой. Без isTrigger зона представляет собой твёрдый блок, а кинематическое тело никогда не касается коллайдера без Rigidbody, поэтому снова ничего не записывается. Достаточно одного Rigidbody в паре — на любом из объектов. В следующем уроке мы рассмотрим other — коллайдер, который вошёл в зону.

challenge icon

Задание

Легко

Проведи дрон через кольца, и пусть каждое кольцо сообщит о нём.

  1. В Start() файла Drone.cs установи body = gameObject.AddComponent<Rigidbody>(); и body.isKinematic = true;, чтобы дрон летел ровно.
  2. В Start() файла Ring.cs установи GetComponent<Collider>().isTrigger = true;.

Нажми «Играть»: дрон пролетит через кольца, а в Console появятся сообщения Ring1 passed, Ring2 passed и Ring3 passed. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;

public class Ring : MonoBehaviour
{
    void Start()
    {
        // Сделайте коллайдер этого кольца триггером
    }

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

Все уроки раздела Физика и игровой процесс

Потренируйтесь самостоятельно: Песочница Unity