Skip to content

Instantly share code, notes, and snippets.

@JunShimura
Created February 14, 2020 02:02
Show Gist options
  • Save JunShimura/f604e84f3ff6e7473979fcf923191974 to your computer and use it in GitHub Desktop.
Save JunShimura/f604e84f3ff6e7473979fcf923191974 to your computer and use it in GitHub Desktop.
StateManager
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