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

У меня есть монета RigidBody и стены вокруг нее с коробочными коллайдерами. В качестве пробной версии я применил к монете следующий код.

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

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

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


person Ashish Beuwria    schedule 30.01.2014    source источник
comment
stackoverflow.com/questions/5788261 /   -  person jparimaa    schedule 30.01.2014
comment
У меня до сих пор нет подходящих решений, которые можно было бы попробовать. Я попытался изменить Fixed Timestep на 0,1 и работает до некоторой степени, но не на 100%. Если у кого-то есть решение, пожалуйста, помогите. Спасибо   -  person Ashish Beuwria    schedule 01.02.2014


Ответы (4)


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

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

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

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

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

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

person Matias Gil    schedule 30.01.2014
comment
Я пробовал увеличить размер стен, но это бесполезно, и я предоставил код. Я просто добавляю силу своей монете для простых целей тестирования. - person Ashish Beuwria; 31.01.2014

Посмотрите, не установлен ли флажок Is Trigger для коллайдеров. Также проверьте, есть ли у gameObjects коллайдеры.

person ReGaSLZR    schedule 05.02.2014

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

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

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

person Ren DeVg    schedule 11.09.2014

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

person zioming    schedule 22.06.2015