private void FixedUpdate()
        {
            if (_mana.IsFocusing())
            {
                return;
            }

            // Allow for a slide?
            if (_isSliding)
            {
                Slide();
            }

            float speed;

            GetInput(out speed);
            // always move along the camera forward as it is the direction that it being aimed at
            var desiredMove = transform.forward * _input.y + transform.right * _input.x;

            // get a normal for the surface that is being touched to move along it
            RaycastHit hitInfo;

            Physics.SphereCast(transform.position, _characterController.radius, Vector3.down, out hitInfo,
                               _characterController.height / 2f, ~0, QueryTriggerInteraction.Ignore);
            desiredMove = Vector3.ProjectOnPlane(desiredMove, hitInfo.normal).normalized;

            _moveDir.x = desiredMove.x * (speed * (_underWater.IsWading() ? _wadeSpeed : 1));
            _moveDir.z = desiredMove.z * (speed * (_underWater.IsWading() ? _wadeSpeed : 1));

            var grounded = _characterController.isGrounded;
            var swimming = _underWater.IsSubmerged() || (_underWater.IsAtHeadLevel() && !grounded);

            if (swimming)
            {
                Swim(speed);
            }
            else
            {
                MoveAndJump();
            }

            _collisionFlags = _characterController.Move(_moveDir * Time.fixedDeltaTime);

            if (!_underWater.IsSubmerged())
            {
                ProgressStepCycle(speed);
            }
            UpdateCameraPosition(speed);

            _mouseLook.UpdateCursorLock();
        }