Вступить в клуб →
лёгкаявопросC# и жизненный цикл Unity

Rigidbody двигают в Update: почему персонажа трясёт и он проскакивает сквозь стены

Контроллер персонажа двигает физическое тело так:

public class PlayerMove : MonoBehaviour
{
    [SerializeField] private Rigidbody rb;
    [SerializeField] private float speed = 5f;

    void Update()
    {
        Vector3 dir = new Vector3(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical"));
        rb.velocity = dir * speed;
    }
}

На устройствах с разной частотой кадров игроки жалуются на рывки движения, а на слабых телефонах персонаж ещё и реагирует на отпускание клавиши с запозданием. В чём здесь основная ошибка?

  • Rigidbody вообще нельзя двигать через velocity: физическое тело перемещают только присваиванием transform.position, иначе движок теряет контроль над столкновениями
  • Не хватает умножения на Time.deltaTime: любое присваивание в Update надо масштабировать длительностью кадра, иначе на 120 кадрах тело поедет вчетверо быстрее, чем на 30
  • Отрисовка и шаг физики идут с разной частотой: заданная в Update скорость применяется к шагу симуляции дважды или ни разу — velocity задают в FixedUpdate
  • Ввод читается в Update, поэтому часть нажатий теряется: чтение осей тоже надо перенести в FixedUpdate

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела