【博客节选】Unity角色异常抖动问题排查

本文截取自本人文章 :【Unity实战笔记】第二一 · 基于状态模式的角色控制——以UnityChan为例

发现出现角色抖动问题
在这里插入图片描述
尝试解决方法:

  • 跳跃的loop time不要勾选;

  • 相机aim添加垂直阻尼
    在这里插入图片描述
    还是不行,仔细查看是位移时震颤。
    在这里插入图片描述
    UnityChan移动跳跃降落都会震颤

  • 修改刚体插值为interpolate 或extrapolate(对跳跃和降落震颤有效,但移动抖动无效。)
    在这里插入图片描述

  • 改变状态机update mode
    在这里插入图片描述

  • 用物理的方式更新位置

    Tranform.TranslateRigidbody.MoveRotationRigidbody.MovePosition

    _playerRig.MoveRotation(Quaternion.RotateTowards(_playerTransform.rotation, Quaternion.LookRotation(_camMove), 30));
    _playerRig.MovePosition(_playerRig.position + _camMove * runSpeed * Time.fixedDeltaTime);
    

    但还是不行

  • 改变相机更新模式
    在这里插入图片描述
    水平运动可以,跳跃和降落时的垂直运动依然存在抖动现象。
    而且相机使用lateUpdate背景抖,角色不抖;相机使用fixedUpdate 人物抖背景不抖
    在这里插入图片描述
    对比scene和game窗口,发现还是镜头问题
    在这里插入图片描述
    关闭cinemachine发现跳跃抖动消除了,说明确实是cinemachien的问题,搜索 “ unity cinemachine aiming jittery ”,发现是RigidBody.Interpolation 和 cinemachine不兼容。
    在这里插入图片描述

Cinemachine - Crazy jitter

总结:

首先区分是角色本身抖动还是镜头抖动(对比scene和game窗口,关闭cinemachine插件等方式)

  1. 角色本身抖动,分动画抖动和移动抖动

    • 动画抖动:将动画loop关闭,合理裁剪动画保留1个关键帧即可

    • 移动抖动:用物理方式更新位置和旋转,animator组件的 update mode改为 Animate Physics

      _playerRig.MoveRotation(Quaternion.RotateTowards(_playerTransform.rotation, Quaternion.LookRotation(_camMove), 30));
      _playerRig.MovePosition(_playerRig.position + _camMove * runSpeed * Time.fixedDeltaTime);
      
  2. 镜头抖动

    • 如果使用了cinemachine 插件,那可能就是与RigidBody.Interpolation兼容问题。cinemachine brain update method为fixedupdate/smart 都可以(lateupdate背景依然抖),但RigidBody.Interpolation一定要none。

最终丝滑效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44013533/article/details/143218085