Unity3D架构系列之- FSM有限状态机设计(四)

接下来,我们继续我们的FSM有限状态机的设计,在设计三中我们实现了FSState这个类,我们继续实现FSEvent事件处理类。在FSEvent类里面我们声明了FiniteStateMachine里面定义的委托函数。代码如下:

        protected FiniteStateMachine.EnterState mEnterDelegate;
        protected FiniteStateMachine.PushState mPushDelegate;
        protected FiniteStateMachine.PopState mPopDelegate;

同时我们定义了一个枚举用于处理有限状态机的状态,使用了System里面自带的封装的一个具有三个参数并返回TResult参数制定的雷兴志的方法。
        public Func<object,object,object,bool>        mAction = null;

这个FSEvent事件类也是独立的,不继承Mono。它的核心功能主要是处理FSState的Enter,Push,Pop。代码如下:
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是通过调用Enter,Push,Pop,Execute执行状态的切换。下面把整个代码给大家展现一下:
[C#] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
usingSystem;
 
publicclassFSEvent {
        protectedFiniteStateMachine.EnterState mEnterDelegate;
        protectedFiniteStateMachine.PushState mPushDelegate;
        protectedFiniteStateMachine.PopState mPopDelegate;
 
        protectedenumEventType { NONE, ENTER, PUSH, POP };
        protectedstringmEventName;
        protectedFSState mStateOwner;
        protectedstringmTargetState;
        protectedFiniteStateMachine mOwner;
        protectedEventType eType;
        publicFunc<object,object,object,bool>        mAction = null;
 
        publicFSEvent(stringname, stringtarget, 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;
        }
 
        publicFSState Enter(stringstateName) {
                mTargetState = stateName;
                eType = EventType.ENTER;
                returnmStateOwner;
        }
 
        publicFSState Push(stringstateName) {
                mTargetState = stateName;
                eType = EventType.PUSH;
                returnmStateOwner;
        }
 
        publicvoidPop() {
                eType = EventType.POP;
        }
 
        publicvoidExecute(objecto1,objecto2,objecto3) {
                if(eType == EventType.POP) {
                        mPopDelegate();
                }
                elseif(eType == EventType.PUSH) {
                        mPushDelegate(mTargetState, mOwner.CurrentState.StateName);
                }
                elseif(eType == EventType.ENTER) {
                        mEnterDelegate(mTargetState);
                }
                elseif(mAction !=null) {
                        mAction(o1, o2, o3);
                }
        }
}



设计四把FSM常用的类已经封装好了,接下来我们会在设计五中去封装一个EventSystem类。用于处理事件的注册,分发等功能。

转自:http://jxwgame.blog.51cto.com/943299/1612173

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值