/// <summary> /// イベントによる直接遷移を定義します。 /// 直接遷移はどのステートからも実行が可能です。 /// 同じイベントの場合は後で追加したイベントが優先されます。 /// </summary> public void AddDirectTransition(int eventId, State to, bool reTranstion = false) { TranstionInfo info = new TranstionInfo { EventId = eventId, From = null, To = to, ReTranstion = reTranstion, }; m_Transtions.Add(info); }
bool TransitionImpl(int eventId, object prm = null) { //遷移条件は後ろからなめる for (int i = m_Transtions.Count - 1; i >= 0; i--) { TranstionInfo info = m_Transtions[i]; if (info.EventId == eventId && (info.From == null || info.From == m_Current) && (info.To != m_Current || info.ReTranstion)) { var prev = m_Current; prev.DoExit(); m_Current = info.To; m_Current.DoEnter(prm); return(true); } } return(false); }
/// <summary> /// イベントによるステート間の遷移を定義します。 /// 同じイベントの場合は後で追加したイベントが優先されます。 /// </summary> public void AddTransition(int eventId, State from, State to) { //遷移元を定義しないことは別の意味を持つので強めに制約を掛ける if (from == null) { throw new System.ArgumentNullException(nameof(from)); } TranstionInfo info = new TranstionInfo { EventId = eventId, From = from, To = to, ReTranstion = true, }; m_Transtions.Add(info); }