转换条件和状态id
- 对于每一次状态切换,都有一个从当前状态切换到另外一个状态的条件,类似于Unity动画状态机里面的箭头.对于这些条件,可以用一个枚据类型表示.添加变化条件可以在这里添加.
public enum Transition
{
NullTransiton
}
- 对于每一个状态,都会有一个状态id,用来唯一标识该状态.添加状态需要在此添加状态id
public enum StateID
{
NullStateID
}
状态基类
- 状态模式的核心使用一个类来表示一个状态,对于所有的状态,可以有一个基类来描述所有状态共性的东西
public class FsmState
{
private StateID mstateID;//状态的id,是上述枚举类型
public StateID MStateID { get { return mstateID; } }
//当前状态下,对于不同的条件(Transiton),它会变成哪种状态,用一个字典记录
private Dictionary<Transition, StateID> stateTransitionDic = new Dictionary<Transition, StateID>();
//向外接口,添加在当前状态下,给出一个条件会变成哪种状态
public void AddTransition(Transition transition, StateID stateID)
{
if(transition==Transition.NullTransiton)
{
Debug.LogError("条件不合理");
return;
}
if(stateID== StateID.NullStateID)
{
Debug.LogError("变化后的状态为空");
return;
}
if(stateTransitionDic.ContainsKey(transition))
{
Debug.LogError("当前状态已经有对该条件的处理了");
return;
}
stateTransitionDic.Add(transition,stateID);
}
public void DeleteTransition(Transition transition)
{
if(!stateTransitionDic.ContainsKey(transition))
{
Debug.LogError("当前状态下没有该变化条件");
return;
}
stateTransitionDic.Remove(transition);
}
//在当前状态下,给出一个条件,会切换到哪种状态,返回状态的id
public StateID MakeTransition(Transition transition)
{
if(transition==Transition.NullTransiton)
{
Debug.LogError("条件为空");
return StateID.NullStateID;
}
if(!stateTransitionDic.ContainsKey(transition))
{
Debug.LogError("该状态对该条件不响应");
return StateID.NullStateID;
}
return stateTransitionDic[transition];
}
//进入当前状态时做的事情
public virtual void OnEnter()
{
}
//离开当前状态时做的事情
public virtual void OnExit()
{
}
//在当前状态每帧都执行的事情,Reson主要是每一帧判断是否进行状态的切换
public virtual void Reson(GameObject npc, GameObject player)
{
}
//当前状态每帧都做的事
public virtual void Update()
{
}
}