Войти
ПрограммированиеФорумФизика

Непонятное поведение физики на Unity

#0
19:20, 27 сен. 2015

Вводная: физика2Д, 1 пиксель = 1 unit, Gravity = 1500, Time to sleep = 0.5, твёрдое тело падает на поверхность (статичный коллайдер).
В конце падения происходят события: OnCollisionEnter2D, затем OnCollisionExit2D. Т.е. событие выхода из коллизии последнее. В итоге твёрдое тело останавливается на небольшом расстоянии от поверхности (коллайдеры не соприкасаются), RigidBody.velocity = (0,0), RigidBody.IsSleeping = false.
Непонятные моменты: последнее событие - выход из коллизии; скорость тела нулевая, но при этом оно не "засыпает".
Почему так происходит и как с этим работать?

Дело в том, что мне надо отловить окончание падения при том, что коллизии могут происходить не только с "полом", и мгновенная скорость равная нулю - это не всегда окончание движения.

Если кто-то в теме, помогите, пожалуйста.

#1
20:50, 27 сен. 2015

Ссылку на проектик можно?

#2
21:22, 27 сен. 2015

Gravity 1500 это не многовато?

#3
21:24, 27 сен. 2015

RadianTOR
Так 1 пиксель = 1 юнит, а не 100 пикселей. Должно быть ок.

#4
22:20, 27 сен. 2015

Skyblade
> Ссылку на проектик можно?

С какой целью: поиграть или исходники посмотреть?

Гравитация нормальная. Как уже заметили - расстояния по меркам Юнити громадные.

#5
22:23, 27 сен. 2015

DistinGa
Исходники. Для игр у меня есть Steam и 4 приставки.

#6
22:57, 27 сен. 2015

Skyblade
> Так 1 пиксель = 1 юнит
А физ движку разве не все равно какие там визуально пропорции. Может я конечно ошибаюсь, но у физ движка есть свои рекомендованные настройки при которых он будет работать стабильно, и гравитация 1500 вроде далеко за их пределами.

#7
23:30, 27 сен. 2015

Вот ссылка на пример, отражающий описанное поведение.
Unity project

#8
11:41, 28 сен. 2015
RigidBody.AddForce(transform.up * Force * AC);
Эта строчка не даёт телу заснуть, хотя Force и равна 0.  Поместите её в if (Force != 0) и тело заснёт, как и ожидалось.

Ещё есть событие OnCollisionStay2D, которое вы не отслеживаете. Добавьте его в вывод лога, чтобы понять, что происходит.

#9
13:17, 28 сен. 2015

Хм... Должно сработать. Вечером проверю.
Но метод смахивает на костыль. Ведь в других ситуациях (при других взаимных расположениях препятствий и самолёта) всё работает, как надо: и тело засыпает, и выхода из коллизии не происходит.
Так как приложение силы срабатывает только когда тело не участвует в коллизии (после выхода из неё), выходит, что во всём виновата обработка коллизии. А на что нужно обратить внимание в OnCollisionStay2D?

#10
14:45, 28 сен. 2015

DistinGa
> А на что нужно обратить внимание в OnCollisionStay2D?
На само его появление. Я посмотрел, оно постоянно вызывается, но не помню, после OnCollisionExit или нет. Правда, ковырял настройки RigidBody, может сломал что.

#11
19:37, 28 сен. 2015

Skyblade
Спешу поделиться результатами испытаний. После внесения AddForce и MoveRotation под условия, тело стало "засыпать".
Теперь про обработку коллизий. Заметил, что количества OnCollisionEnter2D и OnCollisionExit2D сильно не совпадают. Уменьшил значение Fixed Timestep - их количества стали отличаться на 1 в пользу OnCollisionEnter2D, но OnCollisionExit2D последнее. OnCollisionStay2D вызывается после последнего выхода. Получается, что параллельно существует несколько коллизий, произошёл выход из последней, а предпоследняя всё ещё висит. Этого я не учёл в своём алгоритме. Придётся их считать.

Спасибо за наводку.

ПрограммированиеФорумФизика

Тема в архиве.