18 public const float SmallNumber = 0.0000001f;
19 public const float SmallNumberSquared = SmallNumber * SmallNumber;
27 return interpolatedValue.
Value;
33 public event Action<InterpolatedValue<T>>
Started;
38 public event Action<InterpolatedValue<T>>
Completed;
45 private T targetValue;
47 private float timeInterpolationStartedAt;
48 private bool firstUpdateFrameSkipped;
49 private bool skipFirstUpdateFrame;
50 private bool performingInterpolativeSnap;
53 [Tooltip(
"Time the interpolator takes to get from current value to the target value")]
54 private float duration = 1.0f;
61 get {
return duration; }
62 set { duration = value; }
66 [Tooltip(
"Time the interpolator takes to get from current value to the target value")]
67 private AnimationCurve curve = null;
72 public AnimationCurve Curve
75 set { curve = value; }
81 public bool IsValid {
get {
return Curve != null; } }
86 public bool IsRunning {
get;
private set; }
98 if (!DoValuesEqual(this.value, value))
101 ValueChanged.RaiseEvent(
this);
111 get {
return targetValue; }
117 protected float CurrentTime
122 return !Application.isPlaying ? (float)
UnityEditor.EditorApplication.timeSinceStartup : Time.time;
137 Value = targetValue = initialValue;
139 firstUpdateFrameSkipped =
false;
140 this.skipFirstUpdateFrame = skipFirstUpdateFrame;
141 performingInterpolativeSnap =
false;
150 UpdateTarget(updateTargetValue,
false);
160 performingInterpolativeSnap =
false;
162 targetValue = updateTargetValue;
165 timeInterpolationStartedAt = CurrentTime;
167 if (!DoValuesEqual(updateTargetValue, Value))
171 else if (forceUpdate && !IsRunning)
173 ValueChanged.RaiseEvent(
this);
182 SnapToTarget(targetValue);
191 performingInterpolativeSnap =
false;
192 Value = startValue = snapTargetValue;
203 if (performingInterpolativeSnap)
208 targetValue = snapTargetValue;
212 Value = startValue = snapTargetValue;
217 UpdateTarget(snapTargetValue);
218 performingInterpolativeSnap =
true;
230 if (skipFirstUpdateFrame)
232 firstUpdateFrameSkipped =
false;
237 Started.RaiseEvent(
this);
251 Completed.RaiseEvent(
this);
264 if (skipFirstUpdateFrame && !firstUpdateFrameSkipped)
266 firstUpdateFrameSkipped =
true;
267 timeInterpolationStartedAt = CurrentTime;
271 float timeDelta = CurrentTime - timeInterpolationStartedAt;
274 timeDelta *= Curve.Duration() / Duration;
276 Value = ApplyCurveValue(startValue, targetValue, Curve.Evaluate(timeDelta));
277 if (timeDelta >= Curve.Duration())
293 public abstract bool DoValuesEqual(T one, T other);
303 public abstract T ApplyCurveValue(T startValue, T targetValue,
float curveValue);