Функция FixedUpdate () запускается каждый фиксированный интервал, определенный Time.fixedDeltaTime (который можно установить с помощью TimeManager (Фиксированный временной шаг) или во время выполнения путем непосредственной установки Time.fixedDeltaTime в новое значение.
Поскольку вы перемещаете положение и поворот символа на фиксированный интервал, в зависимости от частоты кадровперсонаж либо будет много двигаться с более низкой частотой кадров, либо будет перемещаться только каждые несколько кадров с более высокой частотой кадров.
Например, с фиксированной шкалой времени 0,02 секунды и игра работает с частотой кадров 30 кадров в секунду (он же рендерит каждые 0,033 секунды) ваша игра будет делать это:
- [Time: 0.020s] Character position += 0.02
- [Time: 0.033s] Render frame with character at position 0.02
- [Time: 0.040s] Character position += 0.02
- [Time: 0.060s] Character position += 0.02
- [Time: 0.066s] Render frame with character at position 0.06
- [Time: 0.080s] Character position += 0.02
- [Time: 0.099s] Render frame with character at position 0.08
- [Time: 0.100s] Character position += 0.02
- [Time: 0.120s] Character position += 0.02
- [Time: 0.133s] Render frame with character at position 0.12
Так что в этом примере вы можете увидеть, как персонаж будет прыгать вперед с разным количеством за кадр, и вы не можетегарантируйте, с какой частотой кадров будет работать игра, чтобы она могла ухудшиться.
Есть несколько способов сделать вашего персонажа мплавно, хотя.
Поместите ваш код в цикл Update () вместо цикла FixedUpdate () , это сместит позициюперсонажа каждый визуализированный кадр.Наряду с этим вы можете умножить скорость движения на Time.deltaTime, который является временем с момента визуализации предыдущего кадра (то есть время с момента последнего запуска Update () и перемещения персонажа)
Использование Vector3.Lerp (..) / Quaterion.Lerp (..) или Vector3.MoveTowards (..) / Quaternion.RotateToward (..) с использованием значения времени / шага, умноженного на Time.deltaTime , для интерполяции движения персонажа, сохраняя его плавное движение относительно частоты кадров игры.
Если у вашего персонажа есть компонент с твердым телом, вы можете просто установить интерполяцию с жестким телом для интерполяции, а затем переместить вашего персонажа, вызвав:
characterRigidbody.MovePosition(wantedPosition);
characterRigidbody.MoveRotation(wantedRotation);
Как замену существующим движениям трансформации. (хранение вашего кода внутри цикла FixedUpdate ())
Но учтите, что продолжение приема ваших Input. * Вызовов внутри FixedUpdate () опрашивает их больше, чем нужно, так что вы можете захотетьдвигаться твключите Update (), разделяя код движения и ввод кода прослушивания, если вы решите это сделать. (я разрабатываю игры для Android, так что, возможно, на ПК это не стоит беспокоиться так сильно, но, вероятно, все же стоит изменить)
Прямой ответ блока кода наХотя вопрос может состоять в том, чтобы просто попробовать это, что является комбинацией объяснения 1 и 2:
// How long in seconds will it take the lerps to finish moving into position
public float lerpSmoothingTime = 0.1f;
private Vector3 targetPosition;
private Quaternion targetRotation;
void Update()
{
bool running = Input.GetKey(KeyCode.LeftShift);
float h = Input.GetAxisRaw("Horizontal");
float v = Input.GetAxisRaw("Vertical");
bool isWalking = Mathf.Abs(h) + Mathf.Abs(v) > 0;
movement = ((running) ? runSpeed : walkSpeed) * new Vector3(h, 0.0f, v).normalized;
if (isWalking)
{
targetPosition += movement * Time.deltaTime;
targetRotation = Quaternion.LookRotation(targetPosition - transform.position);
}
// Always lerping as if we suddenly stopped the lerp as isWalking became false the stop would be sudden rather than smoothly moving into position/rotation
transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime / lerpSmoothingTime);
transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, Time.deltaTime / lerpSmoothingTime);
}
Если вы хотите более подробно прочитать о плавно движущихся объектах, узнать о lerps или просто хотите больше примеровзатем ознакомьтесь с этим руководством на , как исправить заикание движения в Unity .