private void Move() { if (stateMachine.PlayerStateReusableData.MovementVectorInput.magnitude == 0f) { return; } Vector3 movementDirectionInput = GetMovementDirectionInput(); Vector3 targetRotationMovement = Rotate(movementDirectionInput); Vector3 groundNormal = GetGroundNormal(); Vector3 movementDiractionOnGround = Vector3.ProjectOnPlane(targetRotationMovement, groundNormal); float movementSpeed = GetPlayerMovementSpeed(); Vector3 horizontalVelocity = GetPlayerHorizontalVelocity(); stateMachine.Player.Rigidbody.AddForce(movementDiractionOnGround * movementSpeed - horizontalVelocity, ForceMode.VelocityChange); } private Vector3 Rotate(Vector3 movementDirection) { Quaternion cameraRotation = Quaternion.AngleAxis(stateMachine.Player.MainCameraTransform.rotation.eulerAngles.y, Vector3.up); movementDirection = cameraRotation * movementDirection; Quaternion rotation = Quaternion.LookRotation(movementDirection, Vector3.up); rotation = Quaternion.Slerp(stateMachine.Player.Rigidbody.rotation, rotation, Time.fixedDeltaTime / groundedData.PlayerRotationData.TargetRotationReachTime); stateMachine.Player.Rigidbody.MoveRotation(rotation); return movementDirection; }