Почему OnCollisionEnter не срабатывает? - PullRequest
1 голос
/ 29 мая 2019

У меня есть два объекта:

Объект A (Камера SteamVR):

  • Имеет твердое тело с включенной функцией "Is Kinematic".
  • Имеет Box Collider с включенным "Is Trigger".
  • Имеет сценарий с методом "OnCollisionEnter".

Объект B (модель глобуса):

  • Имеет сферный коллайдер с включенным "Триггером".

Я убедился, что диапазоны коллайдера корректны, но каким-то образом метод OnCollisionEnter не срабатывает.

Код, который я использую для OnCollisionEnter, выглядит следующим образом:

private void OnCollisionEnter(Collision collision)
{
    Debug.Log("Collision entered");
}

Может ли кто-нибудь дать мне некоторое понимание / совет?

Спасибо вперед.

1 Ответ

1 голос
/ 29 мая 2019

ПРОБЛЕМА: нет столкновения между объектами с триггером

. Чтобы понять, как работает столкновение, вам необходимо сначала определить, какие объекты сталкиваются, потому что очень немногие объекты могут вызвать OnCollisionEnter .

Из вашего описания мы можем выделить 2 типа объектов.

Объект A : триггерный кинематический триггер тела
Объект B :Статический триггерный коллайдер

Если вы проверите Матрица столкновений , не может быть столкновения с чем-либо, имеющим триггер (как Объект A, так и Объект B), поэтому OnCollisionEnter не будет срабатывать.
Я повторяю: триггер не сталкивается ни с чем, независимо от того, что является другим объектом.

РЕШЕНИЕ: используйте OnTriggerEnter вместо OnCollisionEnter

Если вы хотите получить событие изПри столкновении с триггерными объектами (или 2 из них, как в вашем случае) вы можете использовать OnTriggerEnter .

Считать, что в этом случае параметр thМетод будет Collider other, то есть Коллайдер вместо Столкновение , но в вашем случае я думаю, что вам вообще не понадобится столкновение.

private void OnTriggerEnter(Collider other) 
    => Debug.Log("entered");

ВЗГЛЯДЫ о столкновениях Unity

Столкновения зависят от объектов установки твердого тела и коллайдера.Я могу показать несколько примеров, основанных на вашей ситуации.

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

Из Руководство по Unity

STATIC COLLIDER
Это GameObject, у которого есть коллайдер, но нет твердого тела.Статические коллайдеры используются для геометрии уровня, которая всегда остается на одном месте и никогда не перемещается.Поступающие объекты из твердого тела будут сталкиваться со статическим коллайдером, но не будут его перемещать.

Учтите также, что вы хотите использовать триггер (который превращает ваш STATIC COLLDER в STATIC TRIGGER COLLIDER).

Основная идея триггера такова: «Используйте триггеры, когда вы хотите поймать событие, но не хотите, чтобы игровой объект взаимодействовал с физическими силами».

Триггеры

Система сценариев может обнаруживать коллизии и инициировать действия с помощью функции OnCollisionEnter.Тем не менее, вы также можете использовать физический движок просто для обнаружения, когда один коллайдер входит в пространство другого, не создавая столкновения . Коллайдер, настроенный как триггер (с использованием свойства Is Trigger), не ведет себя как сплошной объект и просто пропускает другие коллайдеры через .Когда коллайдер входит в свое пространство, триггер вызовет функцию OnTriggerEnter для сценариев объекта триггера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...