private static OperationalStructBase <T> EaseInOutQuintic(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
            {
                time /= duration / 2.0f;
                if (time <= 1.0f)
                {
                    return(delta / 2.0f * Mathf.Pow(time, 5.0f) + initial);
                }

                time -= 2.0f;
                return(delta / 2.0f * (Mathf.Pow(time, 5.0f) + 2.0f) + initial);
            }
 public TweenInformation(float startTime, OperationalStructBase <T> start, OperationalStructBase <T> finish, float duration, EaseType easeType, out T startValue, out T finishValue)
 {
     Time        = startTime;
     StartTime   = startTime;
     Start       = start;
     Finish      = finish;
     Duration    = duration;
     EaseType    = easeType;
     startValue  = start.Value;
     finishValue = finish.Value;
 }
            private static OperationalStructBase <T> EaseInOutCircular(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
            {
                time /= duration / 2.0f;
                if (time <= 1.0f)
                {
                    return(-delta / 2.0f * (Mathf.Sqrt(1 - Mathf.Pow(time, 2.0f)) - 1.0f) + initial);
                }

                time -= 2.0f;
                return(delta / 2.0f * (Mathf.Sqrt(1 - Mathf.Pow(time, 2.0f)) + 1.0f) + initial);
            }
            private static OperationalStructBase <T> EaseInOutQuadratic(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
            {
                time /= duration / 2.0f;
                if (time <= 1.0f)
                {
                    return(delta / 2.0f * time * time + initial);
                }

                time -= 1.0f;
                return(-delta / 2.0f * (time * (time - 2.0f) - 1.0f) + initial);
            }
            private static OperationalStructBase <T> EaseInOutBack(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
            {
                const float threshold = EaseBackThreshold * 1.525f;

                time /= duration / 2.0f;
                if (time <= 1.0f)
                {
                    return(delta / 2.0f * (Mathf.Pow(time, 2.0f) * ((threshold + 1.0f) * time - threshold)) + initial);
                }

                time -= 2.0f;
                return(delta / 2.0f * (Mathf.Pow(time, 2.0f) * ((threshold + 1.0f) * time + threshold) + 2.0f) + initial);
            }
        private static OperationalStructBase <T> Easing <T>(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration, EaseType easeType) where T : struct
        {
            if (!EasingFunctions <T> .EasingFunctionMap.ContainsKey(easeType))
            {
                throw new ArgumentException($"EaseType: '{easeType.ToString()}' does not implement yet.");
            }

            if (time <= 0.0f)
            {
                return(initial);
            }

            if (time >= duration)
            {
                return(initial + delta);
            }

            return(EasingFunctions <T> .EasingFunctionMap[easeType](time, initial, delta, duration));
        }
 private static OperationalStructBase <T> EaseOutBack(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
 {
     time /= duration;
     time -= 1.0f;
     return(delta * (Mathf.Pow(time, 2.0f) * ((EaseBackThreshold + 1.0f) * time + EaseBackThreshold) + 1.0f) + initial);
 }
 private static OperationalStructBase <T> EaseOutCircular(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
 {
     time /= duration;
     time -= 1.0f;
     return(delta * Mathf.Sqrt(1 - Mathf.Pow(time, 2.0f)) + initial);
 }
            private static OperationalStructBase <T> EaseInOutExponential(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
            {
                time /= duration / 2.0f;
                if (time <= 1.0f)
                {
                    return(delta / 2.0f * Mathf.Pow(2.0f, 10.0f * (time - 1.0f)) + initial);
                }

                time -= 1.0f;
                return(delta / 2.0f * (-Mathf.Pow(2.0f, -10.0f * time) + 2.0f) + initial);
            }
 private static OperationalStructBase <T> EaseOutExponential(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
 {
     return(delta * (-Mathf.Pow(2.0f, -10.0f * time / duration) + 1.0f) + initial);
 }
 private static OperationalStructBase <T> EaseInExponential(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
 {
     return(delta * Mathf.Pow(2.0f, 10.0f * (time / duration - 1.0f)) + initial);
 }
 private static OperationalStructBase <T> EaseInOutSinusoidal(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
 {
     return(-delta / 2.0f * (Mathf.Cos(Mathf.PI * time / duration) - 1.0f) + initial);
 }
 private static OperationalStructBase <T> EaseOutQuintic(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
 {
     time /= duration;
     time -= 1.0f;
     return(delta * (Mathf.Pow(time, 5.0f) + 1.0f) + initial);
 }
 private static OperationalStructBase <T> EaseInQuartic(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
 {
     time /= duration;
     return(delta * Mathf.Pow(time, 4.0f) + initial);
 }
 private static OperationalStructBase <T> EaseOutQuadratic(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
 {
     time /= duration;
     return(-delta * time * (time - 2.0f) + initial);
 }
 private static OperationalStructBase <T> EaseInQuadratic(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
 {
     time /= duration;
     return(delta * time * time + initial);
 }
 private static OperationalStructBase <T> EaseLinear(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
 {
     return(delta * time / duration + initial);
 }
 private static OperationalStructBase <T> EaseInBounce(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
 {
     return(delta - EaseOutBounce(duration - time, default, delta, duration) + initial);
 private static OperationalStructBase <T> EaseOutSinusoidal(float time, OperationalStructBase <T> initial, OperationalStructBase <T> delta, float duration)
 {
     return(delta * Mathf.Sin(time / duration * (Mathf.PI / 2.0f)) + initial);
 }