本文截取自本人文章 :【Unity实战笔记】第二一 · 基于状态模式的角色控制——以UnityChan为例
发现出现角色抖动问题
 
 尝试解决方法:
-  跳跃的loop time不要勾选; 
-  相机aim添加垂直阻尼 
  
 还是不行,仔细查看是位移时震颤。
  
 UnityChan移动跳跃降落都会震颤
-  修改刚体插值为interpolate 或extrapolate(对跳跃和降落震颤有效,但移动抖动无效。) 
  
-  改变状态机update mode 
  
-  用物理的方式更新位置 改 Tranform.Translate为Rigidbody.MoveRotation和Rigidbody.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插件等方式)
-  角色本身抖动,分动画抖动和移动抖动 -  动画抖动:将动画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);
 
-  
-  镜头抖动 - 如果使用了cinemachine 插件,那可能就是与RigidBody.Interpolation兼容问题。cinemachine brain update method为fixedupdate/smart 都可以(lateupdate背景依然抖),但RigidBody.Interpolation一定要none。
 
- 如果使用了cinemachine 插件,那可能就是与
最终丝滑效果:
 



















