找回密码
 立即注册
查看: 252|回复: 0

30秒,在Unity建立一个分层状态机和行为树(HFSM)

[复制链接]
发表于 2022-10-12 17:59 | 显示全部楼层 |阅读模式
前言

从Unity2021开始,Unity可视化脚本(Bolt)正式实装成为默认的内置工具,借助可视化脚本,我们可以瞬间建立分层状态机(HFSM)而不是辛辛苦苦从0写起,这在原型构建,快速玩法迭代,代码调试,程序员与设计师协同开发等场景中可以提高很大的效率。状态机是一个老生常谈的话题,自电子游戏诞生开始就伴随着我们,例如经典的《吃豆人》。但是它却有很大的限制,例如一旦AI行为复杂的时候,会引发过渡条件爆炸,变成意大利面式状态机。



非常恐怖的现象

为了解决上述问题,让我们用30秒时间,在Unity中建立一个分层状态机。
第一步:先建立一个普通的敌人AI状态机

点击敌人,向敌人添加State Machine组件,通过创建状态和创建过渡,实现一个简单的敌人AI。



这就是敌人AI的全貌了

这个敌人AI很简单,有闲置,追逐,巡逻,攻击几个状态,但是如图所示,我们文章开头的问题已经露出萌芽了,过渡太多了,这还是一个非常简单的AI,随着游戏复杂性的增加,过渡会越来越多,到最后,没人能从状态机中看出AI在做些什么。
第二步:建立超级状态,实现分层状态机

点击右键,创建超级状态。


紧接着我们将移动相关的状态:巡逻,闲置,追逐。放入超级状态。形成最终的分层状态机。


这时点击超级状态,里边是这样的:


对比一下就能发现,普通状态机时有6对的过渡,分层状态机时已经减少到4对了。分层状态机,顾名思义,其实就是状态机中又嵌套了一个状态机,通过分离,来减少过渡条件,减少状态机的复杂度。
第三步:可视化状态机调用C#

用C#编写巡逻的行为,然后拖进可视化状态机,连接调用,完成整个分层状态机。


还剩下什么?

分层状态机与普通状态机对比,好处已经显而易见了,可以有效的减少过渡条件爆炸,做到代码重用,以实现更复杂的AI。但是这只能将问题放缓,如果AI超级复杂呢?过渡爆炸的问题又将回来,而且状态机天生的弊病也并没有因为分层而解决,比如状态机的各种状态是高度耦合的,如果形成复杂AI之后再去修改,一不小心,就会因为少连一个过渡而出现问题,在行为的增减上非常不自由。这时我们可以对分层状态机进行再次改良,形成行为树,来解决上述的问题,行为树将状态机的过渡总结为各种各样的节点,以实现无耦合,模块化的有向无环图,来实现模块化的AI,即使是非常复杂的AI也可以做到有效的增减行为。



即使是复杂的行为,也能在几分钟之内理清楚这个AI在干什么,并且轻松增减行为,完全不干扰旧的行为。



没人会在几分钟之内知道这个AI具体在做什么,增减行为?太危险了。

行为树的具体原理,感兴趣的同学可以自行观看我的极简行为树源码,写的非常极简,100行代码,目的就是方便各位同学理解行为树的代码原理,而不是直接看那些发展好多年的行为树库,那就太辛苦了。
关于行为树和HFSM的绝佳资料:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-15 10:34 , Processed in 0.089843 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表