Почему коллайдеры Unity проходят друг с другом на высоких скоростях? - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть лабиринт в моей игре на единство, в этой игре также есть красный шар, проходящий через лабиринт, у обоих есть коллайдеры (коллайдеры по кругу шаров и коллайдеры по краям лабиринта), кажется, что он работает нормально, но когдаВы перетаскиваете шар и проталкиваете его в лабиринт, проходя несколько секунд, вы можете пройти через коллайдеры и пройти, и, если вы наберете достаточную скорость, вы можете пройти весь лабиринт как ничто! Я добавил в свой сценарий ограничение скорости(10) но это работает не так хорошо.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Ваша проблема FixedUpdate и использование CollisionDetectionMode.Discrete.

Это называется N отсчетов в секунду, где N - фиксированное значение. Физика рассчитывается по FixedUpdate. А теперь представьте ситуацию:

  1. FixedUpdate вызывается 60 раз в секунду. Время между FixedUpdate количество вызовов составляет 1 секунду / 60 раз = 17 мс (прибл.)
  2. Размер коллайдера 1x1x1, размер коллайдера B составляет 1x1x1
  3. Коллайдер A прикреплен к неподвижному объекту, коллайдер B прикреплен к объекту, движущемуся в направлении коллайдера B со скоростью 90 единиц в секунду.
  4. Физический движок сравнивает положение А и позиция B на FixedUpdate думает, что коллайдер B просто телепортируется через Коллайдер А, потому что это скорость на одного Тик FixedUpdate больше, чем размер коллайдера.

enter image description here

Если вы собираетесь использовать очень высокую скорость, у вас есть три варианта:

  1. Старайтесь следовать Foggzie советам
  2. Увеличьте количество FixedUpdates в секунду и не перегружайте его скриптами.
  3. Реализуйте свою физику для высокоскоростных объектов
0 голосов
/ 06 сентября 2018

Unity решает эту проблему с помощью Режимов обнаружения столкновений . Убедитесь, что для ваших Rigidbody компонентов настроены соответствующие свойства collisionDetectionMode (по умолчанию они Discrete). Похоже, вы хотите, чтобы шар использовал ContinuousDynamic, а лабиринт - Continuous, но обратите внимание, как указано в ссылке:

Непрерывное обнаружение столкновений поддерживается только для твердых тел с Sphere-, Capsule- или BoxColliders.

Вероятно, вам придется сменить лабиринтные коллайдеры.

...