首页 > 代码库 > U3D架构系列之- FSM有限状态机设计三
U3D架构系列之- FSM有限状态机设计三
在设计二中,我们实现了有限状态机管理类,接下来,我们实现FSState这个类,这里类主要是状态的基本操作以及事件触发。在这里我们定义了在FiniteStateMachine类里声明的三个委托。在FSState里面使用的代码如下:
protected FiniteStateMachine.EnterState mEnterDelegate; protected FiniteStateMachine.PushState mPushDelegate; protected FiniteStateMachine.PopState mPopDelegate;
这个FSState是独立的一个类,不继承Mono,我们定义了一个构造函数,将我们的委托进行了初始化:
public FSState(IState obj, FiniteStateMachine owner, string name, FiniteStateMachine.EnterState e, FiniteStateMachine.PushState pu, FiniteStateMachine.PopState po) { mStateObject = obj; mStateName = name; mOwner = owner; mEnterDelegate = e; mPushDelegate = pu; mPopDelegate = po; mTranslationEvents = new Dictionary<string, FSEvent>(); }
我们声明了FSEvent事件处理函数用于将事件的名字和事件加入的Dictionary里面
public FSEvent On(string eventName) { FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate); mTranslationEvents.Add(eventName, newEvent); return newEvent; }
加入到列表后,我们需要从表里面取出去执行,这就需要Trigger触发函数:
public void Trigger(string name) { mTranslationEvents[name].Execute(null, null, null); } public void Trigger(string eventName, object param1) { mTranslationEvents[eventName].Execute(param1, null, null); } public void Trigger(string eventName, object param1, object param2) { mTranslationEvents[eventName].Execute(param1, param2, null); } public void Trigger(string eventName, object param1, object param2, object param3) { mTranslationEvents[eventName].Execute(param1, param2, param3); }
以上也是FSState类的核心代码,闲话少说,FSState类的整个代码,如下:
using System; using System.Collections; using System.Collections.Generic; public class FSState { protected FiniteStateMachine.EnterState mEnterDelegate; protected FiniteStateMachine.PushState mPushDelegate; protected FiniteStateMachine.PopState mPopDelegate; protected IState mStateObject; protected string mStateName; protected FiniteStateMachine mOwner; protected Dictionary<string, FSEvent> mTranslationEvents; public FSState(IState obj, FiniteStateMachine owner, string name, FiniteStateMachine.EnterState e, FiniteStateMachine.PushState pu, FiniteStateMachine.PopState po) { mStateObject = obj; mStateName = name; mOwner = owner; mEnterDelegate = e; mPushDelegate = pu; mPopDelegate = po; mTranslationEvents = new Dictionary<string, FSEvent>(); } public IState StateObject { get { return mStateObject; } } public string StateName { get { return mStateName; } } public FSEvent On(string eventName) { FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate); mTranslationEvents.Add(eventName, newEvent); return newEvent; } public void Trigger(string name) { mTranslationEvents[name].Execute(null, null, null); } public void Trigger(string eventName, object param1) { mTranslationEvents[eventName].Execute(param1, null, null); } public void Trigger(string eventName, object param1, object param2) { mTranslationEvents[eventName].Execute(param1, param2, null); } public void Trigger(string eventName, object param1, object param2, object param3) { mTranslationEvents[eventName].Execute(param1, param2, param3); } public FSState On<T>(string eventName, Func<T, bool> action) { FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate); newEvent.mAction = delegate (object o1, object o2, object o3) { T param1; try { param1 = (T)o1; } catch { param1 = default(T); } action(param1); return true; }; mTranslationEvents.Add(eventName, newEvent); return this; } public FSState On<T>(string eventName, Action<T> action) { FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate); newEvent.mAction = delegate (object o1, object o2, object o3) { T param1; try { param1 = (T)o1; } catch { param1 = default(T); } action(param1); return true; }; mTranslationEvents.Add(eventName, newEvent); return this; } public FSState On<T1, T2>(string eventName, Func<T1, T2, bool> action) { FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate); newEvent.mAction = delegate (object o1, object o2, object o3) { T1 param1; T2 param2; try { param1 = (T1)o1; } catch { param1 = default(T1); } try { param2 = (T2)o2; } catch { param2 = default(T2); } action(param1, param2); return true; }; mTranslationEvents.Add(eventName, newEvent); return this; } public FSState On<T1, T2>(string eventName, Action<T1, T2> action) { FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate); newEvent.mAction = delegate (object o1, object o2, object o3) { T1 param1; T2 param2; try { param1 = (T1)o1; } catch { param1 = default(T1); } try { param2 = (T2)o2; } catch { param2 = default(T2); } action(param1, param2); return true; }; mTranslationEvents.Add(eventName, newEvent); return this; } public FSState On<T1, T2, T3>(string eventName, Func<T1, T2, T3, bool> action) { FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate); newEvent.mAction = delegate (object o1, object o2, object o3) { T1 param1; T2 param2; T3 param3; try { param1 = (T1)o1; } catch { param1 = default(T1); } try { param2 = (T2)o2; } catch { param2 = default(T2); } try { param3 = (T3)o3; } catch { param3 = default(T3); } action(param1, param2, param3); return true; }; mTranslationEvents.Add(eventName, newEvent); return this; } public FSState On<T1, T2, T3>(string eventName, Action<T1, T2, T3> action) { FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate); newEvent.mAction = delegate (object o1, object o2, object o3) { T1 param1; T2 param2; T3 param3; try { param1 = (T1)o1; } catch { param1 = default(T1); } try { param2 = (T2)o2; } catch { param2 = default(T2); } try { param3 = (T3)o3; } catch { param3 = default(T3); } action(param1, param2, param3); return true; }; mTranslationEvents.Add(eventName, newEvent); return this; } }
接下来会在设计四中继续讲解 FSEvent类
本文出自 “海游移动” 博客,请务必保留此出处http://jxwgame.blog.51cto.com/943299/1610360
U3D架构系列之- FSM有限状态机设计三
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。