public void SwitchTo(TState newActiveState)
        {
            if (IsValidSwitchTo(newActiveState, out TState activeSibling) == false)
            {
                throw new InvalidOperationException("Cannot switch to " + newActiveState);
            }

            OnBeforeActiveHierarchyPathChanges?.Invoke();

            ExitActivesUntil(activeSibling);

            RemoveFromActivesUntil(activeSibling);

            AddToActivesFrom(newActiveState);

            OnActiveHierarchyPathChanged?.Invoke();

            EnterActivesFrom(newActiveState);

            OnTransitionFinished?.Invoke();
        }
Exemplo n.º 2
0
        protected virtual void Update()
        {
            if (m_InTransition)
            {
                float time    = Time.time - m_StartTime;
                float percent = time / m_Duration;

                if (percent < 1.0f)
                {
                    m_Group.alpha = m_Visible ? percent : (1.0f - percent);
                }
                else
                {
                    m_InTransition         = false;
                    m_Group.alpha          = m_Visible ? 1.0f : 0.0f;
                    m_Group.interactable   = m_Visible;
                    m_Group.blocksRaycasts = m_Visible;

                    OnTransitionFinished?.Invoke();
                }
            }
        }
Exemplo n.º 3
0
        private void UpdateTransition(float deltaTime)
        {
            int   inputsCount        = States.Count;
            float transitionDuration = CurrentTransition.Duration;

            if (CurrentTransition.DurationType == DurationType.SourcePercentage)
            {
                float sourceDuration = CurrentState.InputPort.Link.OutputPort.Node.Duration;
                transitionDuration *= sourceDuration == float.PositiveInfinity ? 1f : sourceDuration;
            }
            else if (CurrentTransition.DurationType == DurationType.DestinationPercentage)
            {
                float destinationDuration = NextState.InputPort.Link.OutputPort.Node.Duration;
                transitionDuration *= destinationDuration == float.PositiveInfinity ? 1f : destinationDuration;
            }

            float progressDelta         = transitionDuration != 0f ? deltaTime / transitionDuration : 1f;
            float transitionProgress    = TransitionProgress;
            float newTransitionProgress = transitionProgress + progressDelta;

            float inverseTransitionProgress = 1f - transitionProgress;

            void ResetState(State state)
            {
                state.PreviousTime.Value           = 0f;
                state.Time.Value                   = 0f;
                state.PreviousNormalizedTime.Value = 0f;
                state.NormalizedTime.Value         = 0f;
            }

            for (int i = 0; i < inputsCount; i++)
            {
                if (i == TransitionDestinationIndex)
                {
                    continue;
                }

                float inputWeight = InputPorts[i].Weight;

                if (inputWeight <= 0f)
                {
                    continue;
                }

                float newInputWeight = inputWeight - progressDelta * (inputWeight / inverseTransitionProgress);

                if (newInputWeight <= 0f)
                {
                    InputPorts[i].Weight = 0f;

                    Playable inputPlayable = Playable.GetInput(i);
                    if (!inputPlayable.IsNull() && inputPlayable.GetOutputCount() < 2)
                    {
                        //inputPlayable.Pause();
                        if (InputPorts[i].Link.OutputPort.Node.CanSetTime)
                        {
                            inputPlayable.SetTime(0f);
                        }
                    }
                    ResetState(States.At(i));

                    continue;
                }

                InputPorts[i].Weight = newInputWeight;
            }

            if (newTransitionProgress >= 1f)
            {
                for (int i = 0; i < States.Count; i++)
                {
                    if (i == TransitionDestinationIndex)
                    {
                        continue;
                    }

                    InputPorts[i].Weight = 0f;

                    Playable inputPlayable = Playable.GetInput(i);
                    if (!inputPlayable.IsNull() && inputPlayable.GetOutputCount() < 2)
                    {
                        //inputPlayable.Pause();
                        if (InputPorts[i].Link.OutputPort.Node.CanSetTime)
                        {
                            inputPlayable.SetTime(0f);
                        }
                    }
                    ResetState(States.At(i));
                }

                InputPorts[TransitionDestinationIndex].Weight = 1f;

                if (CurrentTransition.PlayAfterTransition)
                {
                    Playable.GetInput(TransitionDestinationIndex).Play();
                }

                OnTransitionFinished?.Invoke(CurrentTransition);

                CurrentState = CurrentTransition.DestinationState;
                NextState    = null;

                InTransition      = false;
                CurrentTransition = null;
            }
            else
            {
                InputPorts[TransitionDestinationIndex].Weight = newTransitionProgress;
            }
        }