解决方案:修改cinemachine brain的更新方式
经过一段时间的自行探索,最终确定运动是角色模糊而场景不模糊主要是update的频率不一致导致,下面给出我的个人修改方案和项目背景,供大家参考。
- 角色移动方式采用的是rigidbody修改velocity实现
- 摄像机使用的Cinemachine的virtual Camera
- 渲染管线使用的是URP
角色移动代码如下:
private void HandleMovement()
{
Vector2 moveInput = input.MoveInput;
Vector3 moveDir = input.NormalizedMoveInput;
if (input.MovementDetected) animator.SetBool(HashIsWalking, true);
else animator.SetBool(HashIsWalking, false);
//关注这里的移动代码即可
if (moveInput.magnitude > 0.1f)
{
Vector3 targetMoveDir = moveDir;
targetMoveDir.y = 0;
targetMoveDir.Normalize();
targetMoveDir *= moveSpeed;
targetMoveDir.y = 0;
rigidBody.velocity = Vector3.Lerp(rigidBody.velocity, targetMoveDir, acceleration * Time.deltaTime);
}
else
{
Vector3 targetMoveDir = Vector3.zero;
rigidBody.velocity = Vector3.Lerp(rigidBody.velocity, targetMoveDir, decceleration * Time.deltaTime);
}
//Rotate player
if (moveInput.magnitude > 0.1f)
{
Vector3 lookDir = moveDir;
lookDir.y = 0;
Quaternion targetRotation = Quaternion.LookRotation(lookDir);
Quaternion newRotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
transform.rotation = newRotation;
}
}
该函数在Update中会出现因为更新频率不一致,角色移动时发生抽搐和闪动,但相机正常,所以我把它放到了FixedUpdate中
出现如题问题后,检查到了Cinemachine,猜测是cinemachine brain的更新方法导致的,于是把更新方法从SmartUpdate更新到了FixedUpdate,问题解决.
简单记录有关更新方式的文章:
原理笔记:
- 镜头更新的驱动入口从CineMachineBrain的ManualUpdate()开始,有不同的驱动方式,比如Unity回调Update、LateUpdate、SmartUpdate(根据镜头位置变化时机自动选择回调时机驱动),或者是ManualUpdate由外部逻辑手动调用;CineMachineBrain更新所有虚拟相机前会先更新计算相机的切换和相机Blend计算,更新完之后会将当前帧Active的虚拟相机结果CameraState作用到所在的实体相机;
- CineMachineBrain更新所有虚拟相机实际是调用的CineMachineCore的接口;
- 单个虚拟相机InternelUpdate前,会先收集所有的Pipeline Component并按照Stage排序;更新Pipeline之前会先触发InvokePrePipelineMutateCameraStateCallback()回调,相关Extension组件可能会在这个时机计算;然后依次遍历执行每个Stage的Component计算,每个Stage计算结束都会触发InvokePostPipelineStageCallback()回调。
上述文本来源于知乎文章,如侵权,请告知!