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.

По сути, мой вопрос: есть ли у кого-нибудь из вас представление о том, что могло заставить мое твердое тело реагировать таким образом, буквально единственная разница между моим нормальным кодом и кодом, который действует, - это изменение одной строки.

Спасибо за любые ответы.

-Ларс

Изменить: прошло еще несколько часов. Я попытался использовать вместо этого твердое тело.AddForce (), но это, похоже, вообще ничего не делает, и, кроме того, вся причина, по которой я пишу свой автомобильный скрипт, заключается в том, чтобы определить скорость, с которой объект должен двигаться. таким образом создавая что-то вроде жесткого тела.AddForce (), которое добавляет его к скорости автомобиля более или менее избыточным и не должно быть необходимым.

Единственная причина, по которой я вообще использую жесткое тело, - это то, что я могу делать две вещи: 1. Легкие столкновения. Это означает, что я могу добавить к нему простые силы, такие как гравитация, и не беспокоиться о том, что он пройдет сквозь пол. 2. легкие повороты под воздействием физики, например, столкновений.

Если у кого-то есть идеи о том, как сделать эти две вещи в пользовательском скрипте, я бы предпочел это сделать, потому что, как бы мне ни нравилось единство, физика твердого тела Unity практически бесполезна в моих глазах, но должна иметь, потому что я не могу написать свой собственный жесткий диск, и я тоже не могу найти исходный код Unity Rigidbody. Я бы предпочел урезанную версию жесткого тела, которая допускает легкие столкновения и легкое вращение, но без всех вещей, таких как наращивание сопротивления или скорости, потому что это именно те вещи, которые я хочу контролировать и иметь До сих пор я мог контролировать себя, когда использую transform.Translate, но я теряю этот контроль, когда мне приходится использовать твердое тело.velocity.

Если у кого-то есть идеи, заранее спасибо.

Edit2: Ну, я уже исправил это, и я чувствую себя чрезвычайно глупо, не осознавая этого раньше. Все, что мне нужно было сделать, это заменить Translate like следующим:

rb.MovePosition (transform.position + transform.forward * (speed *     Time.deltaTime));

Я также узнал, что MovePosition в основном действует как перевод (если вы делаете это так), за исключением того, что он также учитывает столкновения с ним.

Еще раз спасибо всем, кто хотел помочь!


person LAKster    schedule 21.10.2015    source источник
comment
Хорошо, что вы не используете .Translate (). Это может привести к совершенно другим проблемам, чем вы ожидаете. Это полностью обойдёт физический движок и убьет (среди прочего) обнаружение столкновений.   -  person steenbergh    schedule 21.10.2015
comment
@steenbergh Ну, я пытаюсь перестать использовать .Translate (). Однако, как я уже сказал, у меня все еще возникают проблемы с физикой. Я также обнаружил, что .Translate () на самом деле не убивает физику или обнаружение столкновений, просто из-за этого .Translate () не рассчитывается для непрерывного столкновения, из-за которого объект может застрять на полпути через стена, а затем улетает в пространство, потому что именно в этот момент начинается столкновение (фиксированный временной шаг), что действительно разрушает наши столкновения - но TLDR; Да, Translate () никуда не годится   -  person LAKster    schedule 21.10.2015


Ответы (2)


согласно документации, вы не должны использовать rb.velocity для регулярного изменения скорости - это может привести к нереалистичной физике

http://docs.unity3d.com/ScriptReference/Rigidbody-velocity.html

вместо этого используйте rb.addforce

http://docs.unity3d.com/ScriptReference/Rigidbody.AddForce.html

надеюсь, это решит проблему!

person Al Wyvern    schedule 21.10.2015
comment
Проблема, с которой я столкнулся бы, заключалась в том, что addforce динамически добавляет его к скорости, а не устанавливает. Таким образом, это будет жесткое тело. Rigidbody.addForce, к сожалению, делает что-то совершенно отличное от того, что я хочу от своего кода. - person LAKster; 21.10.2015
comment
вы всегда можете установить скорость на 0, чтобы вы не добавляли силы, когда машина движется с желаемой скоростью. Может быть, стоит попробовать просто посмотреть, решит ли это вашу другую проблему - person Al Wyvern; 21.10.2015
comment
@AlWyvrn Я только что попробовал вашу идею, и сейчас она не работает. Физика единства просто ничего не делает без видимой причины. буквально все, что я сделал, это изменил используемую строку на rb.AddForce (transform.forward * speed); и буквально ничего не происходит. Автомобиль просто сидит там, он даже не набирает скорость постепенно, как это обычно происходит с жестким телом .addForce () На этом этапе, вероятно, будет меньше проблем с переходом на что-то вроде Unreal, потому что стандартные вещи Unity получают больше в способ, чем это помогает мне прямо сейчас. - person LAKster; 21.10.2015
comment
Есть (официальный и бесплатный) пример проекта, который представляет собой ездящую вокруг вас машину, которую вы можете скачать, возможно, стоит взглянуть на него, чтобы увидеть, что вы можете узнать из кода! Очень странно, что rb.addforce ничего не сделал, по крайней мере, вы должны получить какие-то изменения! - person Al Wyvern; 21.10.2015

Если вам нужна суперреалистичная 3D-физика автомобилей, вам стоит заглянуть в готовые ресурсы вроде: Edy's Vehice Physics https://www.assetstore.unity3d.com/en/#!/content/403

Также из выступлений Unite2015 см. Пример проекта: "EasySuspension" для создания образца 3D-автомобиля с помощью сценария: http://bit.ly/1y8ucNW (из видео: https://youtu.be/WGvuP6vV6j4?t=17m8s )

Или это 2D-игра сверху вниз? (как ранние GTA)

person mgear    schedule 21.10.2015
comment
Несмотря на то, что я очень ценю ваш ответ, я делал все это как упражнение по кодированию, поэтому покупка готового актива в значительной степени испортила бы всю цель создания этой вещи. Раньше я смотрел на коллайдеры колес и на весь стандартный `` автомобильный ресурс '', который вы можете скачать сейчас, но я буду честен, код для этого переплетен и запутан, я едва мог понять это в первый раз, вдобавок ко всему Честно говоря, базовая физика 3D-автомобилей, которую имеет Unity, на самом деле не так уж и хороша. Тем не менее, спасибо за все, и нет, моя игра не в 2D, а больше (см. Следующий комментарий) - person LAKster; 21.10.2015
comment
(продолжая мой предыдущий комментарий) похожи на более современные GTA, начиная с 3 и заканчивая 5, как я сказал в моем первом посте. Еще раз спасибо за ориентиры, но пока я собираюсь продолжить выяснять, как сделать то, что я планировал сделать в первую очередь. - person LAKster; 21.10.2015