节点共享型HFSM设计

一、什么是HFSM
简单来讲就是状态机,但是HFSM状态机是有层级结构的,也就是说一个状态可能会有父级状态。这样分层次可以避免一个状态内部的子状态与外部的状态直接交互产生复杂的跳转过程,同时是很符合现实的。比如一个怪物有正常状态和战斗状态,正常状态下又有闲置、巡逻和找食物等子状态。而战斗状态下有施放技能、受控、被击飞等状态。但是正常状态的子状态和战斗状态的子状态不需要发生直接交互。
二、何为节点共享
节点共享只要针对同一类型的实体,他们的状态结构是完全一样的,也可以认为是静态不变的。只是各个实体的运行时属性不一样会导致处于不同的状态。
如果共享节点会是什么后果呢,比过说对于一种类型的怪物我们用HFSM来实现他的AI,当策划在配置同一时刻出场100只这样的怪物,那么每一只怪物都存有一份状态的结构数据,当怪物实体更多的时候,就可能会产生较大的内存数据重复了。
所以我们设计的目的是把HFSM的结构这一静态数据和怪物实体的运行时数据抽离,让静态数据只需要一份就可以了。
三、结构设计
在这一设计里边,我们会涉及到3个对象
FSMTemplate:状态机静态结构,用于管理状态树,不包含实例运行时数据。
FSMNode:FSMTemplate管理下的每一个状态节点,该结构也是在状态树生成之后就会固定,不会包含实例运行时的数据。有些FSMNode可能会包含一些子FSMNode.
FSM:对应到实例的运行时状态机,管理和控制这实例的各个运行时状态。
在启动之前必须制定一个FSMTemplate.
FSMState:实例的运行时状态,对应模板FSMTemplate下的FSMNode,
当进入或者退出状态节点FSMNode时,FSMState执行相关的处理。

四、相关接口
1.FSMTemplate(会自动生成一个状态根节点)
AddNode(FSMNode):添加一个状态节点
GetNode(name):根据名字获取状态节点

2.FSMNode
AddChildNode(FSMNode):添加一个子状态节点,并且会自动把他注册到所在的FSMTemplate
get FsmTemplate:当前节点所在的模板
get Root:根级状态节点
get Parent:父级状态节点

3.FSM
get set FSMNode curState:当前所处的状态(可能还需要记录上一次状态、下一次的目标状态)
get set FSMTemplate:对应的状态机结构模板
get set FSMNode defaultState:默认状态
AddState(FSMState state):添加一个状态用来处理对应的状态节点事件
RemoveState(name)
StartFSM():启动状态机
SetState(targetName,foreWhenSame):切换到制定状态foreWhenSame表示目标状态与当前状态一样时是否要切换
LeaveCurState():退当前状态,跳到父级状态。
UpdateFSM():轮询更新状态机器
SendMessage(Message):发送消息
关于状态切换:FSM维持一个栈,记录当前所处的状态节点和他的所有祖先节点。
切换状态的时候,要退出的状态从下往上按照子节点到父节点的顺序一个个移除栈并且处理退出事件,
新的状态从上往下按照父节点到子节点的顺序一个个加入栈中并且处理进入事件。

4.FSMState
bool HandleMessage(Message):处理消息
OnEnterState():进入状态时
OnLeaveState():离开状态时
OnUpdateState():定时更新时


五.状态机事件处理
将消息Message分配到对应的状态FSMNode的FSMState处理,
当前状态没有处理就交给上级状态(如果上级FSMNode有注册对应的FSMState),类似责任链,直到FSMState.HandleMessage返回true。
状态机的消息发送可以由内部发送也可以由状态发送。
消息采用异步处理,即维护一个消息队列,每一次轮询处理一个消息。

 


 


 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值