C# Unity使mouselook平滑且帧率独立

C# Unity使mouselook平滑且帧率独立,c#,unity3d,game-development,C#,Unity3d,Game Development,对于这种情况,我一直混淆了Update()vsFixedUpdate()和time.deltaTimevstime.fixeddeltime 我想为相机鼠标的外观帧速率独立的运动,但在同一时间,我希望它是60 fps尽可能平滑。出于某种原因,每秒60帧似乎有点紧张 我的问题是,我是否将下面的函数放在Update()或FixedUpdate()的内部?deltaTime变量应该是time.deltaTime还是time.fixedDeltaTime?还是我做错了 谢谢你的意见 顺便说一句,下面的S

对于这种情况,我一直混淆了
Update()
vs
FixedUpdate()
time.deltaTime
vs
time.fixeddeltime

我想为相机鼠标的外观帧速率独立的运动,但在同一时间,我希望它是60 fps尽可能平滑。出于某种原因,每秒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
}
和都是Unity在其生命周期中的特定时间对您的
monobhavior
调用的回调函数。更具体地说,
更新
被称为每帧(假设启用了
单一行为
),而
固定更新
被称为每一物理帧

物理帧独立于图形帧速率,并从单位内设置为以特定间隔出现。默认值为每秒50次(换句话说,
FixedUpdate
默认以50fps的速度运行)

FixedUpdate
通常是一个您应该保留的函数,以满足基于物理的需求(例如使用
刚体
或光线投射等),而最肯定的是不是一个用于获取用户输入等事情的函数

现在,希望这一点得到澄清,让我们讨论一下
Time.deltaTime
Time.fixedDeltaTime

Time.fixedDelatime
返回自上次运行
FixedUpdate()帧以来经过的时间量。现在,因为我们从上面知道,
fixeupdate()
以恒定帧速率运行(默认为50),所以该值在帧之间或多或少都是相同的

Time.deltaTime
同样返回自上次运行
Update()
frame以来经过的时间量。现在,由于
Update()
不是以恒定的帧速率运行,而是取决于用户的机器,因此每个帧的值几乎总是略有不同

因此,考虑到所有这些因素,应该将其放入
Update()
还是
FixedUpdate()
?它应该使用
Time.deltaTime
还是
Time.fixeddeltime

如果我在解释这些东西之间的差异方面做得很好,那么我希望您现在知道它应该进入
Update()
并使用
Time.deltaTime

我不知道
SmoothDamp.Float()
方法到底在做什么,但是通过
lerping
在两个位置之间使用
Time.deltaTime
作为
t
参数,您将确保无论运行该方法的机器的帧速率是多少,它将是平滑和一致的。

并且都是Unity在其生命周期中的特定时间对您的
单行为调用的回调函数。更具体地说,
更新
被称为每帧(假设启用了
单一行为
),而
固定更新
被称为每一物理帧

物理帧独立于图形帧速率,并从单位内设置为以特定间隔出现。默认值为每秒50次(换句话说,
FixedUpdate
默认以50fps的速度运行)

FixedUpdate
通常是一个您应该保留的函数,以满足基于物理的需求(例如使用
刚体
或光线投射等),而最肯定的是不是一个用于获取用户输入等事情的函数

现在,希望这一点得到澄清,让我们讨论一下
Time.deltaTime
Time.fixedDeltaTime

Time.fixedDelatime
返回自上次运行
FixedUpdate()帧以来经过的时间量。现在,因为我们从上面知道,
fixeupdate()
以恒定帧速率运行(默认为50),所以该值在帧之间或多或少都是相同的

Time.deltaTime
同样返回自上次运行
Update()
frame以来经过的时间量。现在,由于
Update()
不是以恒定的帧速率运行,而是取决于用户的机器,因此每个帧的值几乎总是略有不同

因此,考虑到所有这些因素,应该将其放入
Update()
还是
FixedUpdate()
?它应该使用
Time.deltaTime
还是
Time.fixeddeltime

如果我在解释这些东西之间的差异方面做得很好,那么我希望您现在知道它应该进入
Update()
并使用
Time.deltaTime


我不知道
SmoothDamp.Float()
方法到底在做什么,但是通过
lerping
在两个位置之间使用
Time.deltaTime
作为
t
参数,您将确保无论运行该方法的机器的帧速率是多少,它都将是平滑一致的。

嘿,我感谢你的答复。因此,我将函数放在update中,并将deltaTime变量设置为Time.deltaTime。这是如何解释当我的FPS没有上限(200+)时,鼠标线非常慢,但当我将其上限设置为60 FPS时,它的灵敏度非常快,没有其他变化?在这种情况下,这似乎与帧速率无关。毫无疑问,在这种情况下,这是最流畅的动作,但它似乎并不独立。我无法用智慧回答这个问题