记录角色运动时模糊的修改方案

解决方案:修改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,问题解决.

简单记录有关更新方式的文章:

知乎,cinemachine系统结构笔记

原理笔记:

  • 镜头更新的驱动入口从CineMachineBrain的ManualUpdate()开始,有不同的驱动方式,比如Unity回调Update、LateUpdate、SmartUpdate(根据镜头位置变化时机自动选择回调时机驱动),或者是ManualUpdate由外部逻辑手动调用;CineMachineBrain更新所有虚拟相机前会先更新计算相机的切换和相机Blend计算,更新完之后会将当前帧Active的虚拟相机结果CameraState作用到所在的实体相机;
  • CineMachineBrain更新所有虚拟相机实际是调用的CineMachineCore的接口;
  • 单个虚拟相机InternelUpdate前,会先收集所有的Pipeline Component并按照Stage排序;更新Pipeline之前会先触发InvokePrePipelineMutateCameraStateCallback()回调,相关Extension组件可能会在这个时机计算;然后依次遍历执行每个Stage的Component计算,每个Stage计算结束都会触发InvokePostPipelineStageCallback()回调。

上述文本来源于知乎文章,如侵权,请告知!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FurryMonster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值