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;//刚启动时会有多帧的超时 }
/// <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)); } }
/// <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); }