Unity使鼠标外观变得平滑且独立于帧率

时间:2019-05-02 16:10:13

标签: c# unity3d game-development

在这种情况下,我一直对Update()FixedUpdate()time.deltaTimetime.fixedDeltaTime感到困惑。

我希望摄像机鼠标的外观独立于帧速率,但同时我希望它在60 fps时尽可能平滑。由于某些原因,60 fps似乎有些抖动。

我的问题是,我是否将函数放在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 个答案:

答案 0 :(得分:2)

UpdateFixedUpdate都是Unity生命周期中某些时间在您的Monobehaviours上调用的回调函数。更具体地说,Update被称为每个框架(假设启用了Monobehaviour),而FixedUpdate被称为每个物理框架

物理帧与图形帧速率无关,并且在Unity中设置为以特定间隔发生。默认值为每秒50次(换句话说,FixedUpdate默认以50fps运行)。

FixedUpdate通常是您应保留的功能,以满足基于物理的需求(例如,使用RigidBodies或射线投射等),最常见的是不是用于诸如获得用户输入之类的东西。

现在希望可以解决此问题,让我们处理Time.deltaTimeTime.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,您将确保无论运行它的机器的帧速率是多少,它将保持平滑和一致。