Created
February 14, 2020 02:02
-
-
Save JunShimura/f604e84f3ff6e7473979fcf923191974 to your computer and use it in GitHub Desktop.
StateManager
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
using System; | |
namespace StateManager { | |
public class StateManager<T> { | |
private T _state; | |
public T state { | |
get { | |
return _state; | |
} | |
set { | |
if (!_state.Equals(value)) { | |
SetState(value); | |
} | |
} | |
} | |
//Constructor | |
public StateManager(T initialState) | |
{ | |
_state = initialState; | |
} | |
Dictionary<StateEvent<T>, Action> actionMap = new Dictionary<StateEvent<T>, Action>(); | |
public void SetAction(T state, Transition transition, Action reactAction) | |
{ | |
StateEvent<T> stateEvent = new StateEvent<T>(state, transition); | |
if (actionMap.ContainsKey(stateEvent)) { | |
actionMap[stateEvent] += reactAction; | |
} | |
else { | |
actionMap.Add(stateEvent, reactAction); | |
} | |
} | |
private void SetState(T setState) | |
{ | |
if (!setState.Equals(_state)) { | |
StateEvent<T> stateExit = new StateEvent<T>(_state, Transition.Exit); | |
StateEvent<T> stateEnter = new StateEvent<T>(setState, Transition.Enter); | |
if (actionMap.ContainsKey(stateExit)){ | |
actionMap[stateExit](); | |
} | |
_state = setState; | |
if (actionMap.ContainsKey(stateEnter)){ | |
actionMap[stateEnter](); | |
} | |
} | |
} | |
private void ExecuteAction(StateEvent<T> stateChangeEvent) | |
{ | |
actionMap[stateChangeEvent](); | |
} | |
} | |
public enum Transition { | |
Enter, | |
Exit | |
}; | |
public struct StateEvent<T> { | |
T state; | |
Transition transition; | |
public StateEvent(T _state, Transition _transition) | |
{ | |
state = _state; | |
transition = _transition; | |
} | |
}; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment