本系列笔记转载自游戏蛮牛专栏作家Jackel的论坛文章,详细介绍了FSM的创建与使用,特与众分享。链接:http://www.manew.com/thread-37136-1-1.html
FSEvent类实现了FiniteStateMachine中三个委托的定义。该类主要用于事件的处理。定义一个枚举用于处理有限状态机的状态,以及使用System的Func类。核心功能是处理FSState的Enter、Push、Pop。代码如下:
using System;
public class FSEvent
{
protected FiniteStateMachine.EnterState mEnterDelegate;
protected FiniteStateMachine.PushState mPushDelegate;
protected FiniteStateMachine.PopState mPopDelegate;
protected enum EventType { NONE, ENTER, PUSH, POP };
protected string mEventName;
protected FSState mStateOwner;
protected string mTargetState;
protected FiniteStateMachine mOwner;
protected EventType eType;
public Func<object,object,object,bool> mAction = null;
public FSEvent( string name, string target, FSState state, FiniteStateMachine owner, FiniteStateMachine.EnterState e, FiniteStateMachine.PushState pu, FiniteStateMachine.PopState po )
{
mStateOwner = state;
mEventName = name;
mTargetState = target;
mOwner = owner;
eType = EventType.NONE;
mEnterDelegate = e;
mPushDelegate = pu;
mPopDelegate = po;
}
public FSState Enter( string stateName )
{
mTargetState = stateName;
eType = EventType.ENTER;
return mStateOwner;
}
public FSState Push( string stateName )
{
mTargetState = stateName;
eType = EventType.PUSH;
return mStateOwner;
}
public void Pop()
{
eType = EventType.POP;
}
public void Execute( object o1, object o2, object o3 )
{
if( eType == EventType.POP )
{
mPopDelegate();
}
else if( eType == EventType.PUSH )
{
mPushDelegate( mTargetState, mOwner.CurrentState.StateName );
}
else if( eType == EventType.ENTER )
{
mEnterDelegate( mTargetState );
}
else if( mAction != null )
{
mAction( o1, o2, o3 );
}
}
}
通过调用FSEvent的Execute对Enter、Push、Pop状态的切换。