Unity Rigidbody не работает должным образом (есть идеи для написания собственного твердого тела вместо?)
Последние несколько дней я работал над некоторыми физиками автомобилей в качестве упражнения по программированию.
Моя конечная цель состоит в том, чтобы получить полуреалистичную физику автомобиля, что-то среднее между качеством старых игр GTA и недавней GTA 5.
Теперь то, что я получил, это довольно сложный процесс, который в конечном итоге дает мне число с плавающей запятой, которое является точной скоростью, с которой я хочу, чтобы автомобиль двигался до следующего кадра, до сих пор я использовал следующий код для этого;
this.transform.Translate (0, 0, speed * Time.deltaTime);
Однако, поскольку я хочу использовать физическую сборку Unity для обнаружения столкновений, я понял, что это не сработает, потому что transform.Translate (насколько я знаю) буквально помещает объект в эту позицию, таким образом, объект может (если двигаться достаточно быстро) внезапно окажетесь на полпути сквозь стену или просто полностью проигнорируете столкновение и появитесь на другой стороне стены. Теперь вместо этого я решил сделать это;
rb.velocity = transform.forward * speed;
Чтобы быстро заметить, я делаю оба из них в своем FixedUpdate, и в настоящее время я использую только второй пример (или, по крайней мере, пытаюсь использовать его и с треском проваливаюсь). Из-за того, что оно находится в исправленном обновлении, я должен быть в состоянии, по крайней мере, до некоторой степени протестировать его без использования Time.Deltatime, поэтому вы не видите этого во втором примере прямо сейчас.
Чтобы продолжить мою историю, по какой-то причине, когда я устанавливаю скорость твердого тела вместо использования transform.Translate, мое столкновение действует действительно странно. Автомобиль становится все плавучим и толкается вперед (стоит на носу), когда я врезаюсь в стену, я понятия не имею, что может быть причиной этого видения, поскольку я использую собственную гравитацию (гравитация от исходного Rigidbody выключена в пользу моя собственная гравитация, которая приводит к силе движения твердого тела вниз), а также сопротивление и угловое сопротивление твердого тела были уменьшены до 0.
По сути, мой вопрос заключается в том, есть ли у кого-нибудь из вас представление о том, что может быть причиной того, что мое жесткое тело реагирует таким образом, буквально единственное различие между моим обычным кодом и кодом, который работает, заключается в том, что однострочное изменение.
Спасибо за любые ответы.
-Lars
Изменить: это было еще несколько часов. Я использовал вместо этого solidbody.AddForce(), но это, похоже, вообще ничего не делает, и, кроме того, вся причина, по которой я пишу свой автомобильный скрипт, заключается в определении скорости, с которой должен двигаться объект. таким образом создавая что-то вроде solidbody.AddForce(), которое добавляет его к скорости автомобиля более или менее избыточно и не должно быть ненужным.
Единственная причина, по которой я вообще использую жесткое тело, заключается в том, что я могу делать две вещи: 1. Легкие столкновения. Это означает, что я могу добавить к ней простые силы, такие как гравитация, и мне не нужно беспокоиться о том, что она пройдет сквозь пол. 2. легкие повороты, когда на них воздействует физика, например столкновения.
Если у кого-то есть какие-либо идеи о том, как сделать эти две вещи в собственном сценарии, я бы предпочел сделать это, потому что, как бы мне не нравилось единство, физика твердого тела Unity в моих глазах практически ничего не стоит, однако это необходимо, потому что я не могу написать свой собственный жесткий файл, и я не могу найти исходный код Unity Rigidbody. То, что я предпочел бы иметь, это урезанная версия твердого тела, которая обеспечивает легкие столкновения и легкое вращение, но без таких вещей, как построение сопротивления или скорости, потому что это именно те вещи, которые я хочу иметь возможность контролировать себя и иметь Я мог контролировать себя до сих пор, когда я использую transform.Translate, но я теряю этот контроль, когда мне приходится использовать hardbody.velocity.
Если у кого есть идеи, заранее спасибо.
Edit2: Ну, я уже исправил это, и я чувствую себя крайне глупо, что не осознал этого раньше. Все, что мне нужно было сделать, это заменить перевод, как показано ниже;
rb.MovePosition (transform.position + transform.forward * (speed * Time.deltaTime));
Я также узнал, что MovePosition в основном действует как перевод (если вы делаете это так), за исключением того, что он также учитывает столкновения с ним.
Еще раз спасибо всем, кто хотел помочь!
3 ответа
Согласно документации, вы не должны использовать rb.velocity для регулярного изменения скорости - это может привести к нереалистичной физике
http://docs.unity3d.com/ScriptReference/Rigidbody-velocity.html
вместо этого используйте rb.addforce
http://docs.unity3d.com/ScriptReference/Rigidbody.AddForce.html
надеюсь, это решит проблему!
Заменить
Translate
со следующим:
rb.MovePosition(transform.position + transform.forward * (speed * Time.deltaTime));
MovePosition
в основном действует как перевод (если вы делаете это так), за исключением того, что он также подсчитывает коллизии.
Если вы хотите сверхреалистичную трехмерную физику автомобилей, обратите внимание на готовые активы, такие как: Физика Эдиса Vehice https://www.assetstore.unity3d.com/en/
Также из докладов Unite2015, см. Пример проекта: "EasySuspension" для создания образца 3D-автомобиля по сценарию: http://bit.ly/1y8ucNW (из видео: https://youtu.be/WGvuP6vV6j4?t=17m8s)
Или игра 2D сверху вниз? (как ранние GTA)