// Update is called once per frame
    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal") * horizontalOffsetStrength;

        horizontal = Mathf.Clamp(horizontal, -horizontalOffsetClamp, horizontalOffsetClamp);
        curveDist  = curvePlayer.position2D.x + horizontal;
        Vector3 targetPos = curvePath.GetPointAtDistance(ref curveDist, 0);

        transform.position = Vector3.SmoothDamp(transform.position, targetPos, ref refPos, FollowSpeed);
        Quaternion toRot = curvePath.GetRotationAtDistance(ref curveDist, 0);

        transform.rotation = Quaternion.Slerp(transform.rotation, Target.rotation, RotateSpeed * Time.deltaTime);
    }
    private void FixedUpdate()
    {
        position2D.x += horizontal * speed * Time.deltaTime;
        if (position2D.x < 0)
        {
            position2D.x = 0;
        }


        //Vector2 force = ComputeGravity();
        //Vector2 acceleration = new Vector2(force.x / mass, force.y / mass);
        //velocity2D.y += acceleration.y * Time.deltaTime;
        //if (jump) { velocity2D.y = jumpForce / mass; jump = false; grounded = false; }
        if (jump)
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }

        position2D.y += velocity2D.y * Time.deltaTime;
        if (position2D.y < .5f)
        {
            position2D.y = .5f;
            velocity2D.y = 0;
            grounded     = true;
        }

        mAnimator.SetFloat("Y_Velocity", velocity2D.y);

        transform.rotation = curve.GetRotationAtDistance(ref position2D.x, currentPathIndex);
        transform.right    = new Vector3(transform.right.x, 0, transform.right.z);
        position3D         = curve.GetPointAtDistance(ref position2D.x, currentPathIndex);
        float yDiff = position3D.y - lastCurvePosY;

        position2D.y -= yDiff;
        //transform.position = position3D + transform.up * position2D.y;

        lastCurvePosY = position3D.y;
    }