有限状态机,先理解是干什么的,有限表示这个是有限度的不是无限的,状态,指的是所拥有的所有状态,这么来理解,人有情绪,比如说生气,无感,喜悦,难过,生气,幸福等,那么这些情绪是固有的几种,是所谓有限,那么那些情绪就是不同的状态,人可以在这些状态之中进行转换,此时是开心的,下一秒有可能就是生气的,这就是有限状态机的原理。
这一篇代码稍微多了一点,咱们一点一点来说:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum Transition
{
NullTransition = 0,
NoSeePlayer,
SeePlayer,
GamePause
}
public enum StateID
{
NullStateID = 0,
IdleState,
PatrolState,
ChaseState
}
public abstract class FSMState
{
protected FSMSystem fsm;
protected Dictionary<Transition, StateID> map = new Dictionary<Transition, StateID>();
protected StateID stateID;
public StateID ID { get { return stateID; } }
public FSMState(FSMSystem fsm)
{
this.fsm = fsm;
}
public void AddTransition(Transition trans, StateID id)
{
if (trans == Transition.NullTransition)
{
Debug.LogError("FSMState ERROR: NullTransition is not allowed for a real transition");
return;
}
if (id == StateID.NullStateID)
{
Debug.LogError("FSMState ERROR: NullStateID is not allowed for a real ID");
return;
}
if (map.ContainsKey(trans))
{
Debug.LogError("FSMState ERROR: State " + stateID.ToString() + " already has transition " + trans.ToString() +
"Impossible to assign to another state");
return;
}
map.Add(trans, id);
}
public void DeleteTransition(Transition trans)
{
if (trans == Transition.NullTransition)
{
Debug.LogError("FSMState ERROR: NullTransition is not allowed");
return;
}
if (map.ContainsKey(trans))
{
map.Remove(trans);
return;
}
Debug.LogError("FSMState ERROR: Transition " + trans.ToString() + " passed to " + stateID.ToString() +
" was not on the state's transition list");
}
public StateID GetOutputState(Transition trans)
{
if (map.ContainsKey(trans))
{
return map[trans];
}