Пример #1
0
        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);
                }
            }
        }
Пример #2
0
        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;
                }
            }
        }
Пример #3
0
        public void Play()
        {
            if (!isActiveAndEnabled)
            {
                state = TweenerState.FinishOnEnable;
            }
            else
            {
                if (!isPaused)
                {
                    Play(true);
                }

                isPaused = false;
            }
        }
Пример #4
0
        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();
                }
            }
        }
Пример #5
0
        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();
                }
            }
        }
Пример #6
0
        /// <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}.");
                    }
                }
            }
        }