1. 大致思路
由于npc会有很多种状态,不同的情况会有不同的状态,不同状态会处做不同的事情.为了方便所有状态的行为与状态之间的切换,我们创建一个所有状态的父类FSMState,并创建FSMSystem类来管理各个状态.
2. 转换条件和状态
首先我们先创建两个enum类型,用来存放转换条件与状态.在不同 的状态下,出现不同的转换条件会发生不同的事情.
public enum Transition
{
NullTransition=0,
SeePlayer,
MissPlayer
}
public enum StateID
{
NullStateID=0,
Patrol,
FollowPlayer
}
3. 所有状态的基类FSMState
这个类本省是一个状态,而这个状态下,不同的转换条件会转换成不同的状态.所以用一个字典来存储.当前状态与StateID是一一对应的,我们还需要一个StateID类型变量来存储当前处于什么状态.
protected StateID stateID;
public StateID ID { get { return stateID; } }
protected Dictionary<Transition, StateID> map = new Dictionary<Transition, StateID>();
public FSMSystem fsm;
public FSMState(FSMSystem fsm)
{
this.fsm = fsm;
}
有字典的话,自然需要有添加和删除字典元素的功能
public void AddTransition(Transition trans, StateID id)
{
if (trans == Transition.NullTransition)
{
Debug.LogError("不允许NullTransition"); return;
}
if (id == StateID.NullStateID)
{
Debug.LogError("不允许NullStateID"); return;
}
if (map.ContainsKey(trans))
{
Debug.LogError("添加转换条件的时候," + trans + "已经存在于map中"); return;
}
map.Add(trans, id);
}