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()
vsFixedUpdate()
和time.deltaTime
vstime.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时,它的灵敏度非常快,没有其他变化?在这种情况下,这似乎与帧速率无关。毫无疑问,在这种情况下,这是最流畅的动作,但它似乎并不独立。我无法用智慧回答这个问题