Unity3D架构系列之- FSM有限状态机设计三

原文:http://www.manew.com/thread-37318-1-1.html


在设计二中,我们实现了有限状态机管理类,接下来,我们实现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;
        }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值