Skip to content

Instantly share code, notes, and snippets.

@KzoNag
Created January 16, 2019 07:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save KzoNag/1f90d6dbd682c22e676da5af95b2b434 to your computer and use it in GitHub Desktop.
Save KzoNag/1f90d6dbd682c22e676da5af95b2b434 to your computer and use it in GitHub Desktop.
Unityで使う簡単なステートマシン的な実装
using UnityEngine;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
public class StateMachine
{
public abstract class BaseState
{
public virtual void OnRegister (MonoBehaviour behaviour) { }
public virtual void OnStateEnter (MonoBehaviour behaviour) { }
public virtual void OnStateExit (MonoBehaviour behaviour) { }
public virtual bool OnStateUpdate (MonoBehaviour behaviour) { return true; }
}
public delegate string StateExitHandler (string exitStateName, BaseState exitState);
private Dictionary<string, BaseState> stateMap = new Dictionary<string, BaseState> ();
private MonoBehaviour behaviour;
public string CurrentStateName { get; private set; }
public BaseState CurrentState { get; private set; }
public StateExitHandler OnStateExit;
public StateMachine (MonoBehaviour behaviour)
{
this.behaviour = behaviour;
}
public bool RegisterState (string stateName, BaseState state)
{
if (string.IsNullOrEmpty (stateName) || stateMap.ContainsKey (stateName) || state == null)
{
return false;
}
stateMap [stateName] = state;
state.OnRegister (behaviour);
return true;
}
public bool Start (string firstStateName)
{
if (!stateMap.ContainsKey (firstStateName))
{
return false;
}
EnterState (firstStateName);
return true;
}
public void Update ()
{
if (CurrentState == null) { return; }
bool exit = CurrentState.OnStateUpdate (behaviour);
if (exit)
{
string nextStateName = ExitState ();
EnterState (nextStateName);
}
}
private void EnterState (string stateName)
{
if (!string.IsNullOrEmpty(stateName) && stateMap.ContainsKey (stateName))
{
CurrentStateName = stateName;
CurrentState = stateMap [stateName];
CurrentState.OnStateEnter (behaviour);
}
}
private string ExitState ()
{
string nextStateName = null;
if (CurrentState != null)
{
CurrentState.OnStateExit (behaviour);
nextStateName = OnStateExit (CurrentStateName, CurrentState);
CurrentState = null;
CurrentStateName = null;
}
return nextStateName;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment