角色沿Z轴移动时抖动问题排查与技术求助
角色沿Z轴移动抖动问题
角色沿Z轴移动时会出现抖动,但沿X轴移动一切正常。原本怀疑是相机问题,校准相机后抖动仍未停止。
角色移动代码(旧版本)
private void PlayerMove(Vector3 move) { if(_isAttacking == true) return ; _player.PlayerAnimator.SetFloat("Value", move.magnitude); var axisX = _camera.transform.forward; var axisY = new Vector3(_camera.transform.right.x,0,_camera.transform.right.z).normalized; Vector3 movement = move.x * axisY.normalized + move.y * axisX.normalized; movement.y = 0; Vector3 val = new(movement.x, 0, movement.z); _player.PlayerRb.MovePosition(_player.PlayerRb.transform.position + val * _playerModel.PlayerSpeed * Time.fixedDeltaTime); if (move.magnitude != 0) { Quaternion targetRotation = Quaternion.LookRotation(val); _player.PlayerRb.transform.rotation = Quaternion.Lerp(_player.PlayerRb.transform.rotation, targetRotation, _playerModel.PlayerRotationSpeed * Time.fixedDeltaTime); } }
角色移动代码(新版本)
private void PlayerMove(Vector3 move) { if(_isAttacking == true) return ; _player.PlayerAnimator.SetFloat("Value", move.magnitude); var axisX = new Vector3(_camera.transform.right.x, 0, _camera.transform.right.z).normalized; var axisZ = new Vector3(_camera.transform.forward.x, 0, _camera.transform.forward.z).normalized; Vector3 movement = (move.x * axisX + move.y * axisZ).normalized; movement.y = 0; Vector3 val = _playerModel.PlayerSpeed * Time.fixedDeltaTime * movement; _player.PlayerRb.MovePosition(new(_player.PlayerRb.position.x + val.x, _player.PlayerRb.position.y + val.y,_player.PlayerRb.position.z + val.z)); Debug.Log(_player.PlayerRb.transform.position); if (move.magnitude != 0) { Quaternion targetRotation = Quaternion.LookRotation(val); _player.PlayerRb.transform.rotation = Quaternion.Lerp(_player.PlayerRb.transform.rotation, targetRotation, _playerModel.PlayerRotationSpeed * Time.fixedDeltaTime); } }
相机控制代码
private void ToUpdate() { var targetRotation = Quaternion.Euler(0, _cameraMovement.x, 0); _player.transform.Rotate(new Vector3(0, targetRotation.x,0),Space.World); }
已排查项
- 尝试移除Y轴强制设为0的逻辑,无改善
- 验证角色动画运行状态,无异常
- 检查角色碰撞体,游戏运行期间无异常变动
临时优化效果
将旋转插值方法从Quaternion.Lerp替换为Quaternion.Slerp后,抖动情况略有缓解,修改后的旋转逻辑代码如下:
if (move.magnitude != 0) { Quaternion targetRotation = Quaternion.LookRotation(val); _player.PlayerRb.rotation = Quaternion.Slerp(_player.PlayerRb.transform.rotation, targetRotation, _playerModel.PlayerRotationSpeed * Time.fixedDeltaTime); }
内容的提问来源于stack exchange,提问作者Nikolay Stuff
相关产品推荐
相关产品推荐

