Триггерные коллайдеры
Часть раздела Физика и игровой процесс путешествия по 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 — коллайдер, который вошёл в зону.
Задание
ЛегкоПроведи дрон через кольца, и пусть каждое кольцо сообщит о нём.
- В
Start()файлаDrone.csустановиbody = gameObject.AddComponent<Rigidbody>();иbody.isKinematic = true;, чтобы дрон летел ровно. - В
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");
}
}
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка4Корутины
InvokeInvokeRepeating, CancelInvokeВаша первая корутинаЦиклы в корутинахОстановка корутинПовторение: обратный отсчёт10Проект: Побег с арены
АренаОхотники2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Монетная гонка
Катящийся шарСобираем монетыПотренируйтесь самостоятельно: Песочница Unity