/// <summary> /// 从当前实例的 Head 实例出发,向 NextTweener 方向查找,将第一个能够停止的 Tweener 停止 /// </summary> /// <param name="selectTweener">实际停止的 Tweener 实例或 null</param> /// <returns>成功停止了任何的 Tweener</returns> public bool FromHeadToEndIfNeedStop(out Tweener selectTweener) { #if UNITY_EDITOR if (TweenService.Instance != null) { TweenService.Instance.Behaviour.StopTweenerTimes++; } #endif foreach (Tweener tweener in this) { switch (tweener.State) { case TweenerState.Error: case TweenerState.AssetHaveBeenDestroy: case TweenerState.Stop: selectTweener = tweener; return(false); case TweenerState.IsRunnning: case TweenerState.WaitForActivation: selectTweener = tweener; TweenService.Remove(tweener); return(true); default: break; } } selectTweener = null; return(false); }
/// <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}."); } } } }