转换条件和状态id
- 对于每一次状态切换,都有一个从当前状态切换到另外一个状态的条件,类似于Unity动画状态机里面的箭头.对于这些条件,可以用一个枚据类型表示.添加变化条件可以在这里添加.
public enum Transition
{
NullTransiton
}
- 对于每一个状态,都会有一个状态id,用来唯一标识该状态.添加状态需要在此添加状态id
public enum StateID
{
NullStateID
}
状态基类
- 状态模式的核心使用一个类来表示一个状态,对于所有的状态,可以有一个基类来描述所有状态共性的东西
public class FsmState
{
private StateID mstateID;
public StateID MStateID { get { return mstateID; } }
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);
}
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()
{
}
public virtual void Reson(GameObject npc, GameObject player)
{
}
public virtual void Update()
{
}
}