Unity делает мышиный вид гладким и независимым от частоты кадров - PullRequest
0 голосов
/ 02 мая 2019

Я путаю себя с Update() против FixedUpdate() и time.deltaTime против time.fixedDeltaTime для этой ситуации.

Я хочу независимое от частоты кадров движение при взгляде мыши на камеру, но прив то же время я хочу, чтобы он был максимально плавным для 60 кадров в секунду.По какой-то причине 60 кадров в секунду кажутся немного нервными.

У меня вопрос, я должен поместить функцию ниже в Update() или FixedUpdate()?Должна ли переменная deltaTime быть time.deltaTime или time.fixedDeltaTime для достижения этой цели?Или я все делаю неправильно?

Спасибо за любой ввод.

Кстати, функция SmoothDamp ниже представляет собой функцию сглаживания, основанную на lerp, которая учитывает обратную связь

void MouseLook()
{
    if (_isEscaped)
        return;

    if (!_isAllowedToLook)
        return;

    var deltaTime = Time.fixedDeltaTime;

    var adjustedSensitivity = _lookSensitivity * 100f; //Keeps sensitivity between 0.1 and 10f but makes the sensitivity in math actually work

    _lookInput.x = SmoothDamp.Float(_lookInput.x, Input.GetAxis("Mouse X"), _lookSmoothSpeed, deltaTime);
    _lookInput.y = SmoothDamp.Float(_lookInput.y, Input.GetAxis("Mouse Y"), _lookSmoothSpeed, deltaTime);

    // Mouse look
    var newVerticalPitch = _verticalPitch + _lookInput.y * -adjustedSensitivity * deltaTime;
    _verticalPitch = SmoothDamp.Float(_verticalPitch, newVerticalPitch, 15f, deltaTime);
    _verticalPitch = Mathf.Clamp(_verticalPitch, -_maxVerticalLookAngle, _maxVerticalLookAngle);             //Clamp vertical look

    // Camera vertical rotation
    var newCameraRotation = Quaternion.Euler(Vector3.right * _verticalPitch);
    _camTransform.localRotation =
        SmoothDamp.Quaternion(_camTransform.localRotation, newCameraRotation, 15f, deltaTime);


    // Player horizontal rotation
    var newPlayerRotation = _transform.rotation * Quaternion.Euler(_lookInput.x * adjustedSensitivity * deltaTime * Vector3.up);
    _transform.rotation = SmoothDamp.Quaternion(_transform.rotation, newPlayerRotation, 15f, deltaTime); //Player rotation
}

1 Ответ

2 голосов
/ 02 мая 2019

Обновление и FixedUpdate - это обе функции обратного вызова, которые Unity вызывает на вашем Monobehaviours в определенные моменты времени в течение своей жизни.Более конкретно, Update называется каждый кадр (при условии, что Monobehaviour включен), а FixedUpdate называется каждый физический кадр .

Физические кадры не зависят от графической частоты кадров и задаются изнутри Unity, чтобы происходить через определенный интервал.Значение по умолчанию - 50 раз в секунду (другими словами, FixedUpdate работает со скоростью 50 кадров в секунду по умолчанию).

FixedUpdate - это, как правило, функция, которую вы должны зарезервировать для своих основанных на физике потребностей (например, использование RigidBodies или приведение лучей и т. д.), и, безусловно, , а не , который можно использовать для таких вещей, как получение пользовательского ввода.

Теперь, когда это, надеюсь, прояснится, давайтеaddress Time.deltaTime и Time.fixedDeltaTime:

Time.fixedDeltaTime возвращает количество времени, прошедшее с момента запуска предыдущего кадра FixedUpdate().Теперь, поскольку мы знаем сверху, что FixedUpdate() работает с постоянной частотой кадров (по умолчанию 50), это значение будет более или менее всегда одинаковым между кадрами

Time.deltaTime аналогичным образом возвращает количество временичто прошло с момента запуска предыдущего кадра Update().Теперь, поскольку Update() не работает с постоянной частотой кадров, но зависит от компьютера пользователя, это значение почти всегда будет немного отличаться в каждом кадре.

Итак, учитывая все это, должно ли это войти в Update() или FixedUpdate()?И стоит ли использовать Time.deltaTime или Time.fixedDeltaTime?

Если бы я проделал достойную работу по объяснению различий между этими вещами, то я ожидаю, что вы теперь знаете, что это должно войти в Update() и используйте Time.deltaTime.

Я не знаю, что именно делает этот метод SmoothDamp.Float(), но с помощью lerping между двумя позициями, используя Time.deltaTime в качестве параметра t, вы убедитесь, чтонезависимо от того, какая частота кадров у этой машины, она будет плавной и последовательной.

...