HFSM(HierarchyFiniteStateMachine)分层有限状态机 一

HFSM(HierarchyFiniteStateMachine)分层有限状态机 一

要了解分层状态机,首先需要先了解 FSM 有限状态机,前边两篇 有限状态机FSM(finite state machine) 一 有限状态机FSM(finite state machine) 二有关于有限状态机的讲解。
了解过有限状态机,相信你已经可以解决很多简单的 AI 或者状态切换需求的功能了,但是有一个比较大的限制就是状态数有限。当状态不断增加的时候各种状态之间的切换控制将越来越复杂,可能最终导致一系列不可知、不可控、不可扩展或者牵一发而错全部的危机。
我的前两篇文章中包含四个状态: 吃饭、休息、写作业、打篮球
某一天需要再添加四个状态:看电视、打游戏、网上听课、看书
第一感觉就是很简单,就是多添加几个切换条件即可,但是真实情况远非我们想的这么简单。请看下图
在这里插入图片描述
对你没看错,仅仅八个状态,它们之间的各种转换已经让我们眼花缭乱了,简直一个蜘蛛网。这还仅仅是其中一部分。因为你可以看出如上有向图并不是两两直接相互联通的。

如我还可以添加一条 玩游戏状态->网上听课状态的转换
还可以再添加一条 看电视状态->网上听课状态的转换 等等,不再一一列举

一个真实的游戏中可能一个角色要多于 八个状态,那么 N 个状态两两想通,最多将会需要有 N平方量级的 Transition转换条件,这样的增量转换将是我们无法接受的,很难配置,非常容易出bug,难以维护。

FSM 有限状态机基本不可能完成状态太多的需求,但是又不能删减这些状态,该怎么办呢?这就是本篇要解决的问题。
我将上边八种状态进行分类如下:
娱乐:看电视、打篮球、打游戏
恢复:吃东西、休息
学习:网上听课、看书、写作业

总共可以有三大类:娱乐、恢复、学习
有限状态机中也讲了,在任意时刻角色只能处在唯一的一种状态,那么任意时刻角色也只能处于唯一的一种大类型状态。
概念
1.整个状态机我们称之为 (StateMachine)

2.大类型状态(娱乐、恢复、学习)称之为 层次状态/子状态机(SubStateMachine)。

3.小类型状态(休息、学习、打篮球等)称之为 状态(State)

4.StateMachine可以包含 State、SubStateMachine

5.SubStateMachine 可以包含 State、SubStateMachine (如果SubStateMachine包含SubStateMachine,则就是子状态机嵌套了,是可以深层次嵌套的)

6.StateMachine、SubStateMachine 都可以包含 入口Entry、和退出 Exit 两个状态

看下图
在这里插入图片描述

从图上我们可以看出我通过添加少量的 Transition转换,将所有可能得转换都列出来了。
层次状态机规则:
1.每个层次内部的状态可以相互切换,如娱乐层次状态中包含的:玩游戏、看电视、打篮球可以相互切换

2.两个不同层次中的状态被隔离了,不能切换:如 恢复层次中 休息状态,不能直接切换到 学习层次状态中的看书状态

3.两个层次可以相互切换,如 娱乐层次、学习层次、恢复层次 可以相互切换

执行以及切换逻辑:
1.从上图中可以看到有入口Entry状态直接指向恢复层次状态SubStateMachine,则开始运行时StateMachine会控制进入 恢复层次SubStateMachine,在 StateMachine 中记录当前的层次状态为 恢复层次SubStateMachine

2.恢复层次SubStateMachine 控制进入 休息State,在 恢复层次SubStateMachine 中记录当前状态为 休息State

3.StateMachine 每帧调用当前层次 恢复层次SubStateMachine.OnExecute(),在 恢复层次SubStateMachine.OnExecute 中调用 当前 休息State.OnExecute

4.当恢复层次SubMachine执行结束,从恢复层次转换到学习层次 SubMachine时,先执行恢复层次SubStateMachine.OnExit,在 SubStateMachine.OnExit中调用 休息State.OnExit

5.将 StateMachine中当前执行的 层次状态改变为 学习层次SubStateMachine,调用学习层次SubStateMachine.OnEnter,然后学习层次SubStateMachine再根据配置以及 Transition 条件,假如可以切换到看书状态,则 SubStateMachine控制将当前状态 设置为 看书 State并执行 看书State.OnEnter,

如果StateMachine 中包含其他状态State,且当前执行的是 AState,则当前执行的 SubStateMachine 即为空,每帧执行 AState.OnExecute

上图中层次状态中缺少 Entry State 和 Exit State,下面放大后补全如下
在这里插入图片描述
上边是关于 HFSM(HierarchyFiniteStateMachine)分层有限状态机 理论知识,如有不对的地方请留言

  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值