Найти тему

Триггерные коллайдеры. Коллизии без физического взаимодействия.

Про столкновения и коллайдеры твердых тел и препятствий можно почитать в статье: https://dzen.ru/a/Zj4I-l3F5hhJWKsb

Помимо объектов препятствий в играх часто присутствуют области какого-то действия (например, зона урона), а также так называемые коллекционные предметы (например, монетки или другие артефакты).

Отличие этих объектов в том, что они не оказывают физического воздействия на компонент Rigibody(2D). Но необходимо отслеживать столкновения с этими объектами, чтобы внести изменения в состояние игры (например, увеличить или уменьшить здоровье персонажу).

Например, зона урона не является препятствием, через нее персонаж может свободно проходить, но при этом должно уменьшаться здоровье персонажа.

Коллекционные предметы также не стоит реализовывать через обычные коллайдеры в виде препятствия. Это становится понятным, если мы рассмотрим такой пример. Персонаж, перепрыгивая с платформы на платформу должен собрать какие-то бонусы. Если бонусы будут обычными коллайдерами препятствий, то, сталкиваясь с каждым из них, персонаж будет терять скорость и в итоге упадет вниз, не допрыгнув до второй платформы. Но нам нужно, чтобы физическая система просто сообщила нам о соприкосновении персонажа с бонусом, при этом никакого влияния на скорость персонажа эти бонусы не оказывали.

Рисунок 1.Использование триггерных коллайдеров
Рисунок 1.Использование триггерных коллайдеров

В Unity существует еще один тип коллайдера – триггерный (или проще триггер), который позволяет фиксировать столкновения с любым игровым объектом, который не является твердым препятствием. Такие коллайдеры не блокируют движение, но физическая система все равно фиксирует столкновения с ними и «отправляет» нам сообщение об этом при помощи специальных методов.

Триггерный коллайдер создается при помощи компонента обычного коллайдера, в котором ставится флажок «Is Trigger». Как создать обычный коллайдер можно почитать по ссылке: https://dzen.ru/a/Zj4I-l3F5hhJWKsb

Рисунок 2.Использование триггерных коллайдеров
Рисунок 2.Использование триггерных коллайдеров

Теперь кристалл обладает триггерным коллайдером, за счет чего персонаж может проходить через него, а физический движок будет регистрировать события взаимодействия лисенка и кристалла.

Аналогично коллайдерам препятствий, для триггеров существует три метода, которые физический движок Unity вызывает в определенный момент. Чтобы это происходило необходимо выполнение следующих условий:

- оба игровых объекта должны содержать компонент коллайдера (он может быть любой формы и типа, включая и «TilemapCollider»);

- у одного из игровых объектов должен быть включен флажок «Is Trigger». Если флажок включен у обоих объектов, то физический движок не будет регистрировать такие столкновения;

- один или оба игровых объектов должны содержать компонент Rigidbody(2D). Если у обоих игровых объектов нет компонента Rigidbody(2D), то физический движок не будет регистрировать такие столкновения.

Методов также три, причем для 2D и 3D триггеров они немного отличаются. Поэтому, если вы работаете над двумерной игрой, то в коде скриптов нужно использовать только методы для 2D триггеров, методы для 3D триггеров работать не будут. Отличие методов заключается в названии, а также в типе входного параметра, который содержит информацию о точках соприкосновения, скорости соударения и т.д.

Сами методы являются аналогами методов обычных коллайдеров, поэтому не будем разбирать подробно с иллюстрациями их работу, к этому материалу можно вернуться по ссылке: https://dzen.ru/a/Zj4I-l3F5hhJWKsb

1 Методы касания триггерного коллайдера – вызываются один единственный раз, когда данный коллайдер начинает касаться триггера. Это первичное касание может быть как одной точкой, так и несколькими сразу.

OnTriggerEnter2D(Collider2D collision) – метод для двумерных объектов;

OnTriggerEnter(Collider collision) – метод для трехмерных объектов;

2 Методы соприкосновения коллайдеров – вызываются каждый кадр, пока данный коллайдер имеет точки соприкосновения с триггерным коллайдером.

OnTriggerStay2D(Collider2D collision) – метод для двумерных объектов;

OnTriggerStay(Collider collision) – метод для трехмерных объектов;

3 Методы расхождения коллайдеров – вызываются один единственный раз, когда данный коллайдер перестает касаться другого коллайдера.

OnTriggerExit2D(Collider2D collision) – метод для двумерных объектов;

OnTriggerExit(Collider collision) – метод для трехмерных объектов;

В одном скрипте каждый из перечисленных методов может быть использован только один раз!

Когда коллайдер взаимодействует с триггером, физический движок начинает искать скрипты у игровых объектов, которым принадлежат коллайдер и триггер. В этих скриптах ищется соответствующий метод. Если он там есть, то выполняется код этого метода, а если нет, то ничего не происходит.

Реализуем уничтожение кристалла при соприкосновении его с персонажем. Это удобно делать в отдельном скрипте, который связан будет не с персонажем, а с кристаллом. В скрипте кристалла добавим метод OnTriggerEnter2D().

Откройте скрипт и поставьте курсор ниже фигурной скобки метода Update(). Начните набирать фразу «ontrig», после чего у вас откроется выпадающее меню, где стрелками можно выбрать нужный метод и нажать клавишу Enter. Можно также два раза кликнуть мышкой по нужному методу.

Рисунок 3. Добавление метода в скрипт
Рисунок 3. Добавление метода в скрипт

После этого в коде появится правильная сигнатура метода, которую можно использовать для написания вашего кода.

Выведем на консоль фразу "Trigger From Player" и уничтожим игровой объект кристалла.

Рисунок 4. Код скрипта
Рисунок 4. Код скрипта

Сохраним скрипт и запустим игру. При соприкосновении персонажа и кристалла последний исчезает.

Таким образом можно собирать коллекционные предметы в игре и в методе OnTriggerEnter2D() изменять состояние персонажа или объектов окружения.

Наука
7 млн интересуются