#c# #unity3d #collision-detection
#c# #unity3d #обнаружение столкновений
Вопрос:
В настоящее время я пытаюсь использовать обнаружение столкновений для выбора цели (автоматическая атака). У меня есть два объекта (то есть игрок и башня), каждый игровой объект имеет иерархию объектов как таковую:
Здесь объект имеет:
- Целевая сфера используется для оповещения о себе, изменения своего игрового состояния из режима ожидания в режим атаки, когда другой объект входит в эту сферу.
- Ударная сфера, которая является необходимым хитбоксом для того, чтобы объект получил урон / соприкоснулся с целевыми сферами других объектов.
- Сфера выбора, которая не взаимодействует с другими сферами, но является радиусом, в котором объект может быть выбран пользователем.
Исходя из этого, я установил для каждого дочернего объекта наличие коллайдера сфер и установил для него слой, соответствующий типу сферы. Ниже приведена используемая в настоящее время таблица физических столкновений. Я хочу, чтобы слой хитбокса и целевые слои взаимодействовали друг с другом.
Несмотря на все мои усилия, при запуске игры и когда игрок ходит взад и вперед по сферам, OnTriggerEnter()
никогда не вызывается. Этот метод находится в классах player и towers, которые находятся в родительском игровом объекте. В настоящее время у меня нет жесткого тела ни на игроке, ни на башне, но есть триггеры на обеих сферах попадания игрока и башни, чтобы запускать друг друга OnTriggerEnter()
.
До сих пор я пытался:
- Добавление жесткого тела к одному или обоим из двух родительских объектов
- Добавление жесткого тела к одному или обоим дочерним объектам, соответствующим HitSphere / целевой сфере, на которой я тестирую столкновение.
- Переключение порядка слоев для целевого слоя Sphere и слоев Hit Sphere
- Переключение целевых сфер так, чтобы вместо пораженных сфер был триггер.
- Наличие как целевой, так и поражающей сфер в качестве триггеров.
- Перемещение объектов вручную для столкновения вместо того, чтобы полагаться на текущую систему перемещения.
Наконец, вот изображение двух сталкивающихся объектов, каждый из которых находится внутри сфер друг друга, но не вызывает друг друга OnTriggerEnter()
. Контур цилиндра взят из контроллера NavMeshAgent, который я также пытался удалить и протестировать, но также безрезультатно. 🙁
TL; DR: попытка выполнить обнаружение составных столкновений для нескольких игровых объектов безрезультатно.
Ответ №1:
Ответ на самом деле скрыт в вашем вопросе.
Из документов Unity, найденных здесь:
Примечание: оба игровых объекта должны содержать компонент Collider. У одного должен быть включен Collider.isTrigger и содержать Rigidbody . Если у обоих игровых объектов включен Collider.isTrigger, столкновения не происходит. То же самое применимо, когда оба игровых объекта не имеют компонента Rigidbody.
Но согласно вашему сообщению:
В настоящее время у меня нет жесткого тела ни на игроке, ни на башне, но есть триггеры на обеих сферах попадания игрока и башни, чтобы запускать друг друга OnTriggerEnter() .
Итак, похоже, что самым быстрым решением было бы добавить жесткое тело к вашим башням. Вы также можете добавить один в свой проигрыватель, но убедитесь, что ваша матрица столкновений исключает player из окружающих коллайдеров триггерной сферы.
И, наконец, согласно документам, триггер не будет запускаться другим триггером.
Исправьте эти проблемы, и вы должны увидеть ожидаемое поведение.
Комментарии:
1. Я опубликовал это ранее, но почему-то мой комментарий был удален. В своем посте я также сказал: «До сих пор я пробовал: добавление жесткого тела к одному или обоим из двух родительских объектов, добавление жесткого тела к одному или оба дочерних объекта, соответствующие HitSphere / целевой сфере, на которой я тестирую столкновение». Я попытался добавить rigidboyв башню, затем к игроку, а затем к обоим.
OnTriggerEnter()
по-прежнему не вызывается. Затем я попытался повторить этот процесс, имея только один из объектов, имеющих триггер, а не оба. По-прежнему безуспешно.2. К сожалению, проблема заключалась в том, что мой
OnTriggerEnter()
метод был типизированonTriggerEnter()
, и я полностью упустил его из виду. Хотя это была проблема, и теперь она работала, я верю, что ваш ответ был правильным на мой первоначальный вопрос