void DoUpdate() { if (IsRunning && !isPaused) { timeRunning += (UseUnscaledTime ? Time.unscaledDeltaTime : Time.deltaTime) * CustomTimeScale; if (state == TweenerState.WaitingForDelay) { if (timeRunning >= AnimationDelay) { timeRunning = 0.0f; state = TweenerState.Running; if (isPlayingForward) { Events.OnStart.Invoke(); } else { Events.OnStartReverse.Invoke(); } } } else { JumpToPoint(timeRunning / AnimationDuration); } } }
public void JumpToPoint(float progress) { progress = Mathf.Clamp01(progress); bool didEnd = progress >= 1.0f; if (!isPlayingForward) { progress = 1 - progress; } currentProgress = AnimationCurve.Evaluate(progress); Events.OnProgressUpdate.Invoke(CurrentProgress); if (didEnd) { if (isPlayingForward) { Events.OnFinish.Invoke(); } else { Events.OnFinishReverse.Invoke(); } if (LoopType == TweenerLoopType.StartOver) { Play(false); } else if (LoopType == TweenerLoopType.PingPong) { if (isPlayingForward) { PlayReverse(false); } else { Play(false); } } else { state = TweenerState.Stopped; IsRunning = false; } } }
public void Play() { if (!isActiveAndEnabled) { state = TweenerState.FinishOnEnable; } else { if (!isPaused) { Play(true); } isPaused = false; } }
public void PlayReverse(bool isFirstPlay) { IsRunning = true; isPlayingForward = false; timeRunning = 0.0f; currentProgress = AnimationCurve.Evaluate(1.0f); if (isFirstPlay && AnimationDelay != 0.0f) { state = TweenerState.WaitingForDelay; } else { state = TweenerState.Running; if (isFirstPlay) { Events.OnStartReverse.Invoke(); } } }
public void Stop() { if (IsRunning) { currentProgress = 0.0f; Events.OnProgressUpdate.Invoke(CurrentProgress); state = TweenerState.Stopped; IsRunning = false; isPaused = false; if (isPlayingForward) { Events.OnFinish.Invoke(); } else { Events.OnFinishReverse.Invoke(); } } }
/// <summary> /// 逻辑迭代器,相当于携程。同一个 <see cref="LogicTweener"/> 只能设置一次逻辑 /// <para>可以返回其它的 <see cref="Tweener"/> 实例,将尝试等待他们</para> /// <para>不能返回 null,但可以返回实例自身,当作延迟一帧使用</para> /// </summary> /// <param name="enumerator">一帧一调用的逻辑</param> /// <returns><see cref="Tweener"/> 实例自身</returns> public Tweener SetLogic(IEnumerator <Tweener> enumerator) { if (enumerator is null) { throw new ArgumentNullException(nameof(enumerator)); } else if (Enumerator != null) { throw new ArgumentException(nameof(Enumerator)); } Enumerator = RunLogic(); return(this); IEnumerator <Tweener> RunLogic() { while (enumerator.MoveNext()) { Tweener tweener = enumerator.Current; TweenerState state = tweener.State; // 普通的等待一帧 if (tweener == this) { yield return(this); } switch (state) { // 一个还未启动的 Tweener,立即启动它,并添加完成时回调激活当前 Tweener case TweenerState.WaitForActivation: TweenService.Remove(this); tweener.OnComplete_Handle += () => TweenService.RestoreImmediately(this); TweenService.Add(tweener); yield return(null); break; // 一个正在运行的 Tweener,添加完成时回调激活当前 Tweener case TweenerState.IsRunnning: case TweenerState.Stop: TweenService.Remove(this); tweener.OnComplete_Handle += () => TweenService.RestoreImmediately(this); yield return(null); break; // 下一帧还是自己 case TweenerState.Finish: yield return(this); break; // 一个出现错误无法继续执行的 Tweener,自身变更为 AssetHaveBeenDestroy case TweenerState.AssetHaveBeenDestroy: case TweenerState.Error: yield return(null); break; case TweenerState.ReservedField2: default: throw new Exception($"Not defined operator in {nameof(LogicTweener)}, {nameof(state)} is {state}."); } } } }