private void FixedUpdate()
    {
        //  Always deriv your motion from the kinematic body velocity
        //  otherwise your movement will be incorrect, like when you
        //  jump against a ceiling and don't fall since your motion
        //  still being applied against its direction.
        Vector3 moveDirection = kinematicBody.velocity;

        if (kinematicBody.isGrounded)
        {
            moveDirection  = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
            moveDirection  = moveDirection.normalized;
            moveDirection *= speed;

            //  If te kinematic body is grounded you should always apply velocity downward
            //  to keep the isGrounded status as true and avoid the "bunny hop" effect when
            //  walking down steep ground surfaces.
            moveDirection.y = -snapForce;

            if (Input.GetButton("Jump"))
            {
                moveDirection.y = jumpSpeed;
            }
        }

        moveDirection.y -= gravity * Time.deltaTime;

        // Call the Move method from Kinematic Body with the desired motion.
        kinematicBody.Move(moveDirection);
    }