FSM(有限状态机)
GDGeek的FSM实现了分层状态机,并且整合了任务(Task)和插值动画(Tween),使用起来很方便。
fsm_ = new FSM();
//增加状态
fsm_.addState("start", startState());
fsm_.addState("play", playState());
//增加play状态的子状态
fsm_.addState("input", inputState(),"play");
fsm_.addState("fall", fallState(), "play");
fsm_.addState("remove", removeState(), "play");
fsm_.addState("end", endState());
//初始状态
fsm_.init("play");
每个状态的实现函数必须返回一个State
private State playState()
{
StateWithEventMap state = new StateWithEventMap();
state.onStart += delegate()//状态开始
{
view.play.gameObject.SetActive(true);
refreshView();
};
state.onOver += delegate()//状态结束
{
view.play.gameObject.SetActive(false);
};
return state;
}
FSM收发消息
发送fsm_.post(msg);
接收state.addAction(msg, delegate(FSMEvent evt) { return "fall";});
消息是用状态接收的,所以同一个消息可以在不同的状态里做不同的处理。处理回调中返回下一个状态。
任务系统(Task)
StateWithEventMap state = TaskState.Create(delegate()
{
TweenTask tt = new TweenTask(delegate //动画任务
{
return TweenLocalPosition.Begin(_tempSquare.gameObject, 1f, _targetSquare.transform.localPosition);
});
TaskManager.PushBack(tt, delegate
{
_tempSquare.hide();
refreshView();
});
return tt;
}, fsm_, "remove");//下一个状态
如果是多个动画同时执行,可以将任务放入TaskSet
,它会同时执行所有任务,并在所有任务完成后切换到下一个状态。