Он же некорректный.
Подобный код часто пишут в примерах, в том числе его выдает и чат gpt.
Пример 1.
public float moveSpeed = 5f; // Скорость движения.
private void FixedUpdate()
{
float horizontalInput = Input.GetAxis("Horizontal");
Vector2 movement = new Vector2(horizontalInput * moveSpeed * Time.fixedDeltaTime, rb.velocity.y);
rb.velocity = movement;
}
Итого скорость по оси x = horizontalInput * moveSpeed * Time.fixedDeltaTime = 1*5*0.02 = 0,1.
Это движение со скоростью улитки. И Time.fixedDeltaTime - константа, умножение бесмысленно.
Пример 2.
public float moveSpeed = 5f; // Скорость движения.
private void Update()
{
Vector3 movement = new Vector2(horizontalInput * moveSpeed*Time.deltaTime, rb.velocity.y);
rb.velocity = movement;
}
Итого скорость по оси x = horizontalInput * moveSpeed * Time.deltaTime
Time.deltaTime - разное
1*5*0.018 = 0,009.
1*5*0.009 = 0,045
Это движение со скоростью улитки и постоянными рывками т.к. каждый кадр расстояние зависит от Time.deltaTime, а оно разное.
Выглядит ужасно.
В чем смысл такого кода? Его же невозможно использовать.
Так не используй, пиши сам.
Пишу, тоже получаю баги, как и описал выше с тряской камеры. Использовал синемашин на камере без скриптов - аналогично. Так как больше ничего не может трясти камеру - единственный вариант неравномерное перемещение игрока. Посмотрел в интернете, спросил чат гпт - он мне выдал вот это. Пытаюсь понять, а в чем смысл этого кода, когда он некорректно работает.
Time.deltaTime тебе помогает сохранить скорость в реальном времени при каких-то глюках в игре. У тебя может быть пропуск кадров, но Time.deltaTime это скомпенсирует и движущийся объект при глюках не будет замедлятся. Time.deltaTime тебе возвращает время в виде кратности, которое прошло с момента предыдущего кадра. Чем оно выше - тем дальше transform.position передвинет твой объект.
Там в примерах ещё есть такая переменная как speed. Она и делает передвижение обьекта быстрее и в тоже время за счёт Time.deltaTime твой объект будет "иметь иммунитет" от зависаний.
Я читал мануал. При Time.deltaTime будет ужасный эффект дерганья - что очевидно т.к. это и есть компенсация расстояния.
Хто может быть только из-за не правильного времени обработки камеры. Ты внимательно код проверь, а лучше пиши свой код на камеру. Если у тебя столько проблем на ровном месте выходит, то ты явно откусил больше, чем можешь проглотить. Синемашин классная штука, но слегка сложноватая. Когда вылазят какие-то проблемы, то лучше не сюда писать, а документацию на её читать.
Если у тебя что-то дёргается, то это значит, что у тебя в коде что-то не так
FixedUpdate() { Vector3 movement = new Vector2(horizontalInput * playerRunSpeed , rb.velocity.y); rb.velocity = movement; } Весь код передвижения. И камера по дефолту от синемашин с объектом-игроком для слежения. Всё. "Нет. Ты не прав" - ?? Это суть - оно почти всегда разное. Проверить легко Update() {Debug.Log(Time.deltaTime);} У меня разные числа.
Update вызывается настолько часто, на сколько это возможно. Я проверял. У меня update вызывается около 300 раз в секунду и там разница колеблется в пределах 1-2 раза. То есть от 298 до 202 к примеру. Когда используешь FixedUpdate то он у меня вызывался 40 раз в секунду. Это скорее и есть частота кадров - но. Это так к слову. Time.deltaTime считает разницу между кадрами как я сказал выше. Чем выше задержка между кадрами - тем больше число Time.deltaTime.
Update и FixedUpdate вызываются через определенные промежутки времени. Чтобы движение считалось корректно нужно домножать на пройденное время с момента последнего вызова, потому что s = v * t, s — пройденное расстояние, v - скорость, t — пройденное время.
Это не нагрузит проект доп. вычислениями?
да вроде не должно, у меня на стареньком xiaomi фпс более ровный стал, по перфе ничего не просело
Обсуждают сегодня