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(); }
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(); } } }
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; } }