游戏中,需要控制人物状态的时候,可以采用Switch Case 方法。然而当出现复杂的状态或者需要添加新的状态时,Switch Case方法将会非常的繁琐。而使用FSM(有限状态机),可以轻松解决以上问题。
以下是我个人的理解,有不足或者错误的地方,还望不吝赐教。
有限状态机思想:通过传递不同的状态,控制当前人物的行为。
设计思路:
1、创建状态基类,定义基类中的方法,包括状态进入,状态执行,状态退出。
2、创建状态管理类,定义管理方法,包括添加状态,设置状态,更新状态,移除状态。
3、定义状态枚举。
4、状态类,继承状态基类,实现基类中的方法,以及当前方法中所需要完成的行为。
代码如下:
1、状态基类
public abstract class myFsmBase : MonoBehaviour {
public abstract void OnEnter();
public abstract void OnUpdate();
public abstract void OnExit();
private void Awake()
{
AddState();
}
protected abstract void AddState();
2、状态管理类
public class myFsmController {
public static myFsmController instance;
public static myFsmController Instance {
get { if (instance == null)
instance = new myFsmController();
return instance;
}
}
public myFsmBase myfsm;
Dictionary <State, myFsmBase> Statedic;
public myFsmController()
{
Statedic = new Dictionary<State, myFsmBase>();
Statedic.Add(State.none, null);
}
public void SetFsmState(State stateid)
{
if (myfsm == Statedic[stateid])
{
return;
}
if (myfsm ==null )
{
}
else
{
//退出上一个状态
myfsm.OnExit();
}
//下个状态进入
Statedic[stateid].OnEnter();
myfsm = Statedic[stateid];
}
public void RemoveFsmState(State state, myFsmBase myfsm )
{
if (Statedic.ContainsValue(myfsm))
{
Statedic.Remove(state);
}
}
public void AddState( State state , myFsmBase myfsm)
{
if (!Statedic.ContainsKey (state))
{
Statedic.Add(state, myfsm);
}
}
3、状态枚举
public enum State
{
none,
move,
jump,
dead
}
4、状态类
public class jumpState : myFsmBase
{
protected override void AddState()
{
myFsmController.Instance.AddState(State.jump, this);
}
public override void OnEnter()
{
Debug.LogError("jump - enter");
}
public override void OnExit()
{
Debug.LogError("jump - 退出");
}
public override void OnUpdate()
{
}
}