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
