public Manipulation ManipulateFloat(FloatReceiver receiver, float init, float target, float duration, bool mirrorCurve = false, int loop = 0, int pingPong = 0, int mirrorPingPong = 0, bool useTimeScale = false, OnDone onDone = null)
            {
                Manipulation mcp = new Manipulation("Float", UtilObject().transform);

                mcp.coroutine = UtilObject().StartCoroutine(FloatManip(mcp, receiver, init, target, duration, mirrorCurve, loop, pingPong, mirrorPingPong, useTimeScale, onDone));
                UtilObject().AddToCoroList(mcp);
                return(mcp);
            }
            private IEnumerator FloatManip(Manipulation mcp, FloatReceiver receiver, float init, float target, float duration, bool mirrorCurve, int loop, int pingPong, int mirrorPingPong, bool useTimeScale, OnDone onDone)
            {
                float elapsedTime = 0;

                mcp.iterationCount++;
                while (elapsedTime < duration)
                {
                    yield return(new WaitForEndOfFrame());

                    elapsedTime += GetDesiredDelta(useTimeScale);
                    float scrubPos = Remap(elapsedTime, 0, duration, 0, 1);
                    if (mirrorCurve)
                    {
                        receiver(MirrorLerp(init, target, scrubPos));
                    }
                    else
                    {
                        receiver(Lerp(init, target, scrubPos));
                    }
                }
                receiver(Lerp(init, target, 1f));
                if (pingPong > 0)
                {
                    mcp.coroutine = UtilObject().StartCoroutine(FloatManip(mcp, receiver, target, init, duration, mirrorCurve, 0, --pingPong, 0, useTimeScale, onDone));
                }
                else if (mirrorPingPong > 0)
                {
                    mcp.coroutine = UtilObject().StartCoroutine(FloatManip(mcp, receiver, target, init, duration, !mirrorCurve, 0, 0, --mirrorPingPong, useTimeScale, onDone));
                }
                else if (loop > 0)
                {
                    receiver(init);
                    mcp.coroutine = UtilObject().StartCoroutine(FloatManip(mcp, receiver, init, target, duration, mirrorCurve, --loop, 0, 0, useTimeScale, onDone));
                }
                else
                {
                    CoroutineComplete(mcp, onDone);
                }
            }