public bool RemoveBehaviour(IStateBehaviour behaviour) { int indexOfBehaviour = _behaviours.IndexOf(behaviour); if (_behaviours.Remove(behaviour)) { if (indexOfBehaviour <= _currentBehaviourEnterIndex && _currentBehaviourEnterIndex > 0) { _currentBehaviourEnterIndex--; } if (indexOfBehaviour <= _currentBehaviourUpdateIndex && _currentBehaviourUpdateIndex > 0) { _currentBehaviourUpdateIndex--; } if (indexOfBehaviour <= _currentBehaviourExitIndex && _currentBehaviourExitIndex > 0) { _currentBehaviourExitIndex--; } return(false); } return(false); }
public void AddBehaviour(IStateBehaviour behaviour) { if (_behaviours.Contains(behaviour) == false) { _behaviours.Add(behaviour); } }
public void Stop() { if (_state != null) { _state.Exit(); } _state = null; _disposables.Cancel(); _disposables = null; }
public virtual void Stop() { if (CurrentState != null) { CurrentState.Stop(); } Debug.LogFormat("STOP State: {0}", CurrentState); CurrentState = null; _stateExecutor.Stop(); }
public void Stop() { if (_state != null) { _state.Exit(); } _state = null; _disposables.Cancel(); _disposables = null; _routineType = RoutineType.Update; }
public static IEnumerable <IStateBehaviour <TStateMachine> > GetStateBehaviours <TStateMachine>(this TStateMachine stateMachine, Animator animator) { StateMachineBehaviour[] behaviours = animator.GetBehaviours <StateMachineBehaviour>(); foreach (StateMachineBehaviour behaviour in behaviours) { IStateBehaviour <TStateMachine> stateBehaviour = behaviour as IStateBehaviour <TStateMachine>; if (stateBehaviour == null) { continue; } yield return(stateBehaviour); } }
public void SwitchToState <T>(TStateKey nextStateKey, T arg) { _currentState?.StateEnded(); if (_availableStates.TryGetValue(nextStateKey, out var nextState)) { _currentState = nextState; CurrentState = nextStateKey; StateChanged?.Invoke(nextStateKey); ((IStateWithArg <TStateKey, T>)_currentState).StateStarted(arg); } else { _currentState = null; Debug.LogWarningFormat("[FSM] No such state registered in state machine: {0}", nextStateKey); } }
public void SwitchToState(TStateKey nextStateKey) { _currentState?.StateEnded(); if (_availableStates.TryGetValue(nextStateKey, out var nextState)) { _currentState = nextState; _currentStateKey = nextStateKey; StateChanged?.Invoke(nextStateKey); _currentState.StateStarted(); } else { _currentState = null; Debug.LogWarningFormat("No such state registered in state machine: {0}", nextStateKey); } }
public void Add_Behavioural_States() { var fsm = new HierarchicalStateMachine <int, int>(); var behaviouralState1 = fsm.AddWithBehaviours(1); Assert.IsTrue(fsm.ContainsState(1)); Assert.IsTrue(fsm.GetStateById(1) == behaviouralState1); IStateBehaviour stateBehaviour1 = Substitute.For <IStateBehaviour>(); IStateBehaviour stateBehaviour2 = Substitute.For <IStateBehaviour>(); var behaviouralState2 = fsm.AddWithBehaviours(2, stateBehaviour1, stateBehaviour2); Assert.IsTrue(fsm.ContainsState(2)); Assert.IsTrue(fsm.GetStateById(2) == behaviouralState2); Assert.IsTrue(fsm.ContainsBehaviour(stateBehaviour1)); Assert.IsTrue(fsm.ContainsBehaviour(stateBehaviour2)); Assert.IsTrue(fsm.BehaviourCount() == 2); Assert.IsTrue(fsm.BehaviourCountOf(2) == 2); }
public void Add_Behavioural_States() { var fsm = NewStateMachine(); var stateId1 = NewStateId(); var stateId2 = NewStateId(); var behaviouralState1 = fsm.AddWithBehaviours(stateId1); Assert.IsTrue(fsm.ContainsState(stateId1)); Assert.IsTrue(fsm.GetStateObjectById(stateId1) == behaviouralState1); IStateBehaviour stateBehaviour1 = Substitute.For <IStateBehaviour>(); IStateBehaviour stateBehaviour2 = Substitute.For <IStateBehaviour>(); var behaviouralState2 = fsm.AddWithBehaviours(stateId2, stateBehaviour1, stateBehaviour2); Assert.IsTrue(fsm.ContainsState(stateId2)); Assert.IsTrue(fsm.GetStateObjectById(stateId2) == behaviouralState2); Assert.IsTrue(fsm.ContainsBehaviour(stateBehaviour1)); Assert.IsTrue(fsm.ContainsBehaviour(stateBehaviour2)); Assert.IsTrue(fsm.BehaviourCount() == 2); Assert.IsTrue(fsm.BehaviourCountOf(stateId2) == 2); }
public bool ContainsBehaviour(IStateBehaviour behaviour) { return(_behaviours.Contains(behaviour)); }
public bool RemoveBehaviour(IStateBehaviour stateBehaviour) => _innerBehaviouralState.RemoveBehaviour(stateBehaviour);
public static void RemoveBehaviourFrom <TState, TTrigger>(this IStateMachine <TState, TTrigger> fsm, TState stateId, IStateBehaviour behaviour) { if (behaviour == null) { throw new ArgumentNullException(nameof(behaviour)); } IState stateObj = fsm.GetStateObjectById(stateId); if (stateObj is BehaviouralState cast) { cast.RemoveBehaviour(behaviour); } else { throw new InvalidOperationException("State object with id " + stateId + " is not of type " + typeof(BehaviouralState).Name); } }
public void AddState(TStateKey key, IStateBehaviour <TStateKey> state) { _availableStates.Add(key, state); }
public void Execute(IStateBehaviour <IEnumerator> state) { _state = state; _disposables = state.Execute().RunWithSubRoutines(_routineType); }
protected virtual void ExecuteState(IStateBehaviour stateType) { Debug.LogFormat("START State {0}", stateType); CurrentState = stateType; _stateExecutor.Execute(CurrentState.Execute()); }
public void Execute(IStateBehaviour state) { Stop(); ExecuteState(state); }
public DefaultState(string stateName, int stateID) : base(stateName, stateID) { defaultStateBehaviour = new DefaultStateBehaviour(); }
public void AddBehaviour(IStateBehaviour stateBehaviour) => _innerBehaviouralState.AddBehaviour(stateBehaviour);
public void Execute(IStateBehaviour <IEnumerator> state) { _state = state; _disposables = Observable.FromCoroutine(x => _state.Execute()).Subscribe(); }
public bool ContainsBehaviour(IStateBehaviour stateBehaviour) => _innerBehaviouralState.ContainsBehaviour(stateBehaviour);