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(); }