В течение последних нескольких дней я работал над некоторой кастомной физикой автомобилей в качестве упражнения по кодированию.
Моя конечная цель - получить полуреалистичную физику автомобилей, что-то среднее между качеством старых игр 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 в основном действует как перевод (если вы делаете это так), за исключением того, что он также учитывает столкновения с ним.
Еще раз спасибо всем, кто хотел помочь!