public static async Task Animate(float duration, TimingFunction timing, Func <float, AnimationStep> update) { var elapsed = 0f; await Util.EveryFrame(deltaT => { var time = Mathf.Clamp(elapsed + deltaT, 0, duration); var step = update(timing(time)); switch (step) { case AnimationStep.Stop: return(false); case AnimationStep.Skip: return(true); case AnimationStep.Continue: if (time >= duration) { return(false); } elapsed = time; return(true); default: throw new ArgumentOutOfRangeException(); } }); update(1); }
private async Task Animate(GameObject target, Vector2 delta, TimingFunction timing) { var p0 = target.transform.localPosition; var p1 = p0 + (Vector3)delta; var anim = Animations.Animate(animationTime, timing); while (!anim.isComplete) { await anim.NextFrame(); target.transform.localPosition = Vector3.Lerp(p0, p1, anim.progress); } }
private async Task Fade(Image target, float alpha, float timeMultiplier, TimingFunction timing) { var c0 = target.color; var c1 = c0; c1.a = alpha; var anim = Animations.Animate(animationTime * timeMultiplier, timing); while (!anim.isComplete) { await anim.NextFrame(); target.color = Color.Lerp(c0, c1, anim.progress); } }
public static Animation Animate(float duration, TimingFunction timing) { return(new Animation(duration, timing)); }
public Animation(float duration, TimingFunction timing) { this.duration = duration; this.timing = timing; }
/// <inheritdoc /> public string TimingFunctions(TimingFunction timingFunction) { return(_timingMap[timingFunction]); }
public void TrackStateChange(State <T> oldState, State <T> newState) { if (TrackChanges) { if (oldState != null) { StateChangeRecord <T> record = new StateChangeRecord <T>(oldState.Name, newState.Name, TimingFunction.Invoke()); StateChanges.Add(record); } } }