在这种情况下,我一直对Update()
与FixedUpdate()
和time.deltaTime
与time.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
}
答案 0 :(得分:2)
Update和FixedUpdate都是Unity生命周期中某些时间在您的Monobehaviours
上调用的回调函数。更具体地说,Update
被称为每个框架(假设启用了Monobehaviour
),而FixedUpdate
被称为每个物理框架。
物理帧与图形帧速率无关,并且在Unity中设置为以特定间隔发生。默认值为每秒50次(换句话说,FixedUpdate
默认以50fps运行)。
FixedUpdate
通常是您应保留的功能,以满足基于物理的需求(例如,使用RigidBodies
或射线投射等),最常见的是不是用于诸如获得用户输入之类的东西。
现在希望可以解决此问题,让我们处理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
,您将确保无论运行它的机器的帧速率是多少,它将保持平滑和一致。