Как запретить RigidBody проходить через другие коллайдеры

У меня есть монета (жесткая) и стены вокруг нее с коробочными коллайдерами. Для пробной цели я применил следующий код к монете.

void OnMouseDown() {
 rigidbody.AddForce(30.0f,0f,5.0f, ForceMode.Impulse);
}

Но иногда монета проходит через стены, но когда я увеличиваю скорость от 30 до 50 пунктов, она проходит через стены при первом щелчке. Я много googled и все еще ничего не имею, кроме DontGoThroughThings Script, который не работает для меня, или я действительно не знаю, как его использовать.

Я всегда добавлял непрерывную динамику на монету и непрерывное обнаружение столкновений на стенах, но все равно не работает.

4 ответа

проблема обнаружения столкновения с физикой заключается в том, что иногда, когда скорость объекта слишком высока (в этом случае в результате силы, добавленной к жесткому телу), столкновения не обнаруживаются. Причина в том, что код, который вы выполняете, выполняется с шагом в несколько шагов в секунду, поэтому иногда жесткое тело будет проходить через коллайдер между одним шагом на другой. Допустим, у вас есть мяч со скоростью 100 миль в час и стена шириной 1 фута, код будет перемещать мяч на определенное количество футов каждый раз, когда код запускается в соответствии с его физикой, поэтому перемещение шара виртуализировано но это не реальное физическое движение, так что может случиться так, что с одного шага в другой шар может перемещаться из точки a в b, а стена находится между этими точками, и в результате столкновения не будут обнаружены.

Возможные решения.

У вас есть простое решение, которое не будет таким точным, как должно быть, и более сложным, которое будет совершенно точным.

Решение номер один будет увеличивать размер коллайдеров, в соответствии с максимальной скоростью, которую может получить ваша монета, таким образом коллайдер будет достаточно большим, чтобы столкновение не было пропущено между кадрами.

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

Я надеюсь, что это помогло и извинилось за мой английский. Если вы не очень хорошо это понимаете, я могу помочь вам с кодом, но мне понадобится код из вашего проекта.


Убедитесь, что у коллайдеров не установлен "Триггер". Кроме того, проверьте, имеют ли файлы gameObjects коллайдеры.


Я сталкивался с этой проблемой много раз.

Убедитесь, что ваша монета Rigidbody имеет "Is Kinamatic" False, Is Triggger: false,

А также "Is Trigger" стен False.


Вы можете сохранить скорость и положение в каждом обновлении, а затем проверить вне пределов, если монета покидает действительную область, вы можете восстановить ее в последней действительной позиции или нанести собственное столкновение, если вы хотите

licensed under cc by-sa 3.0 with attribution.