public SkillFSMMachine OnChange(SkillFSMState fromState, SkillFSMState toState, Action handler) { if (!_states.ContainsValue(fromState)) { throw new ArgumentException("unknown state", "from"); } if (!_states.ContainsValue(toState)) { throw new ArgumentException("unknown state", "to"); } if (handler == null) { throw new ArgumentNullException("handler"); } OnStateChange += (from, to) => { if (from.Equals(fromState) && to.Equals(toState)) { handler(); } }; return(this); }
public void Begin(SkillFSMState state) { if (!_states.ContainsValue(state)) { return; } CurrentState = state; }
public SkillFSMMachine AddState(SkillFSMState fSMState) { if (fSMState == null) { return(this); } if (_states.ContainsValue(fSMState)) { return(this); } _states.Add(fSMState.Name, fSMState); CurrentState = CurrentState ?? fSMState; return(this); }
public SkillFSMMachine AddStates <TState>() where TState : IComparable { if (!typeof(Enum).IsAssignableFrom(typeof(TState))) { throw new Exception("Cannot create finite"); } var states = new List <SkillFSMState>(); foreach (TState value in Enum.GetValues(typeof(TState))) { var fsmState = new SkillFSMState(value); states.Add(fsmState); } AddStates(states.ToArray()); return(this); }
public SkillFSMMachine OnExit(SkillFSMState state, Action handler) { if (handler == null) { throw new ArgumentNullException("handler"); } if (!_states.ContainsValue(state)) { throw new ArgumentException("unknown state", "state"); } OnStateExit += exitedState => { if (exitedState.Equals(state)) { handler(); } }; return(this); }
public void OnStateChanged(SkillFSMState fromState, SkillFSMState toState) { }
public SkillFSMTransition(SkillFSMState from, SkillFSMState to, Func <bool> testConditionFunction = null) { FromState = from; ToState = to; testConditionFunc = testConditionFunction; }