Esempio n. 1
0
 internal void _Init()
 {
     _delay                    = 0;
     _duration                 = 0;
     _breakpoint               = -1;
     _easeType                 = EaseType.QuadOut;
     _timeScale                = 1;
     _ignoreEngineTimeScale    = false;
     _easePeriod               = 0;
     _easeOvershootOrAmplitude = 1.70158f;
     _snapping                 = false;
     _repeat                   = 0;
     _yoyo           = false;
     _valueSize      = 0;
     _started        = false;
     _paused         = false;
     _killed         = false;
     _elapsedTime    = 0;
     _normalizedTime = 0;
     _ended          = 0;
     _path           = null;
     _customEase     = null;
     _smoothStart    = Time.frameCount == 1 ? 3 : 1;//刚启动时会有多帧的超时
 }
Esempio n. 2
0
        /// <summary>
        /// Returns a value between 0 and 1 (inclusive) based on the elapsed time and ease selected
        /// </summary>
        public static float Evaluate(EaseType easeType, float time, float duration,
                                     float overshootOrAmplitude = 1.70158f,
                                     float period          = 0,
                                     CustomEase customEase = null)
        {
            if (duration <= 0)
            {
                return(1);
            }

            switch (easeType)
            {
            case EaseType.Linear:
                return(time / duration);

            case EaseType.SineIn:
                return(-(float)Math.Cos(time / duration * _PiOver2) + 1);

            case EaseType.SineOut:
                return((float)Math.Sin(time / duration * _PiOver2));

            case EaseType.SineInOut:
                return(-0.5f * ((float)Math.Cos(Mathf.PI * time / duration) - 1));

            case EaseType.QuadIn:
                return((time /= duration) * time);

            case EaseType.QuadOut:
                return(-(time /= duration) * (time - 2));

            case EaseType.QuadInOut:
                if ((time /= duration * 0.5f) < 1)
                {
                    return(0.5f * time * time);
                }
                return(-0.5f * ((--time) * (time - 2) - 1));

            case EaseType.CubicIn:
                return((time /= duration) * time * time);

            case EaseType.CubicOut:
                return((time = time / duration - 1) * time * time + 1);

            case EaseType.CubicInOut:
                if ((time /= duration * 0.5f) < 1)
                {
                    return(0.5f * time * time * time);
                }
                return(0.5f * ((time -= 2) * time * time + 2));

            case EaseType.QuartIn:
                return((time /= duration) * time * time * time);

            case EaseType.QuartOut:
                return(-((time = time / duration - 1) * time * time * time - 1));

            case EaseType.QuartInOut:
                if ((time /= duration * 0.5f) < 1)
                {
                    return(0.5f * time * time * time * time);
                }
                return(-0.5f * ((time -= 2) * time * time * time - 2));

            case EaseType.QuintIn:
                return((time /= duration) * time * time * time * time);

            case EaseType.QuintOut:
                return((time = time / duration - 1) * time * time * time * time + 1);

            case EaseType.QuintInOut:
                if ((time /= duration * 0.5f) < 1)
                {
                    return(0.5f * time * time * time * time * time);
                }
                return(0.5f * ((time -= 2) * time * time * time * time + 2));

            case EaseType.ExpoIn:
                return((time == 0) ? 0 : (float)Math.Pow(2, 10 * (time / duration - 1)));

            case EaseType.ExpoOut:
                if (time == duration)
                {
                    return(1);
                }
                return(-(float)Math.Pow(2, -10 * time / duration) + 1);

            case EaseType.ExpoInOut:
                if (time == 0)
                {
                    return(0);
                }
                if (time == duration)
                {
                    return(1);
                }
                if ((time /= duration * 0.5f) < 1)
                {
                    return(0.5f * (float)Math.Pow(2, 10 * (time - 1)));
                }
                return(0.5f * (-(float)Math.Pow(2, -10 * --time) + 2));

            case EaseType.CircIn:
                return(-((float)Math.Sqrt(1 - (time /= duration) * time) - 1));

            case EaseType.CircOut:
                return((float)Math.Sqrt(1 - (time = time / duration - 1) * time));

            case EaseType.CircInOut:
                if ((time /= duration * 0.5f) < 1)
                {
                    return(-0.5f * ((float)Math.Sqrt(1 - time * time) - 1));
                }
                return(0.5f * ((float)Math.Sqrt(1 - (time -= 2) * time) + 1));

            case EaseType.ElasticIn:
                float s0;
                if (time == 0)
                {
                    return(0);
                }
                if ((time /= duration) == 1)
                {
                    return(1);
                }
                if (period == 0)
                {
                    period = duration * 0.3f;
                }
                if (overshootOrAmplitude < 1)
                {
                    overshootOrAmplitude = 1;
                    s0 = period / 4;
                }
                else
                {
                    s0 = period / _TwoPi * (float)Math.Asin(1 / overshootOrAmplitude);
                }
                return(-(overshootOrAmplitude * (float)Math.Pow(2, 10 * (time -= 1)) * (float)Math.Sin((time * duration - s0) * _TwoPi / period)));

            case EaseType.ElasticOut:
                float s1;
                if (time == 0)
                {
                    return(0);
                }
                if ((time /= duration) == 1)
                {
                    return(1);
                }
                if (period == 0)
                {
                    period = duration * 0.3f;
                }
                if (overshootOrAmplitude < 1)
                {
                    overshootOrAmplitude = 1;
                    s1 = period / 4;
                }
                else
                {
                    s1 = period / _TwoPi * (float)Math.Asin(1 / overshootOrAmplitude);
                }
                return(overshootOrAmplitude * (float)Math.Pow(2, -10 * time) * (float)Math.Sin((time * duration - s1) * _TwoPi / period) + 1);

            case EaseType.ElasticInOut:
                float s;
                if (time == 0)
                {
                    return(0);
                }
                if ((time /= duration * 0.5f) == 2)
                {
                    return(1);
                }
                if (period == 0)
                {
                    period = duration * (0.3f * 1.5f);
                }
                if (overshootOrAmplitude < 1)
                {
                    overshootOrAmplitude = 1;
                    s = period / 4;
                }
                else
                {
                    s = period / _TwoPi * (float)Math.Asin(1 / overshootOrAmplitude);
                }
                if (time < 1)
                {
                    return(-0.5f * (overshootOrAmplitude * (float)Math.Pow(2, 10 * (time -= 1)) * (float)Math.Sin((time * duration - s) * _TwoPi / period)));
                }
                return(overshootOrAmplitude * (float)Math.Pow(2, -10 * (time -= 1)) * (float)Math.Sin((time * duration - s) * _TwoPi / period) * 0.5f + 1);

            case EaseType.BackIn:
                return((time /= duration) * time * ((overshootOrAmplitude + 1) * time - overshootOrAmplitude));

            case EaseType.BackOut:
                return((time = time / duration - 1) * time * ((overshootOrAmplitude + 1) * time + overshootOrAmplitude) + 1);

            case EaseType.BackInOut:
                if ((time /= duration * 0.5f) < 1)
                {
                    return(0.5f * (time * time * (((overshootOrAmplitude *= (1.525f)) + 1) * time - overshootOrAmplitude)));
                }
                return(0.5f * ((time -= 2) * time * (((overshootOrAmplitude *= (1.525f)) + 1) * time + overshootOrAmplitude) + 2));

            case EaseType.BounceIn:
                return(Bounce.EaseIn(time, duration));

            case EaseType.BounceOut:
                return(Bounce.EaseOut(time, duration));

            case EaseType.BounceInOut:
                return(Bounce.EaseInOut(time, duration));

            case EaseType.Custom:
                return(customEase != null?customEase.Evaluate(time / duration) : (time / duration));

            default:
                return(-(time /= duration) * (time - 2));
            }
        }
Esempio n. 3
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="value"></param>
 /// <param name="customEase"></param>
 /// <returns></returns>
 public GTweener SetEase(EaseType value, CustomEase customEase)
 {
     _easeType   = value;
     _customEase = customEase;
     return(this);
 }