独立游戏吧 关注:53,753贴子:306,304
  • 13回复贴,共1

游戏ai干货-如何最大限度避免FSM的问题

只看楼主收藏回复

只说明结论,不讲为什么,自己探索,框架没有好坏,只有需求是否满足,免得遇到容不下讲问题的讨论。
像是我遇到个et框架的“行为机”(就是GOAP)的问题讨论,结果讲个问题太蠢还被当中的小鬼嫌弃,显得我用fsm很蠢
废话不多说:
首先,要使用分层fsm来避免状态之间的转换出现混乱。
其次,fsm的设计要符合进入,更新,退出这三个基本生命周期,具体参考Unity,这里面还可以再细分一下。
比如更新可以细分成处理物理属性的更新,还有专门处理逻辑切换的更新。
进入和退出要考虑动画的一个退出时间,也就是游戏出现的硬直,即切换动画必须时间,可以成为构造函数的参数,也可以是一个人生命周期的函数,看自己需要。
然后,就是通过c#的事件,委托方法避免引用问题,解耦
最后,建议结合Unity的visual scripting的状态机,这样的好处是保证同步更新fsm设计图和编程的一个实际实现。


IP属地:广东来自Android客户端1楼2023-10-18 16:57回复
    很简单hashset->Condition->NextState即可,没那么复杂,ET用的也是这个核心思想。


    IP属地:云南来自iPhone客户端2楼2023-10-18 19:58
    收起回复
      确实是这样的,最简单的状态机其实用一个switch跳表就能实现(if else也未尝不可),在此基础上用State和Transition类封装起来,主要还是为了降低耦合性。进一步最好是能做到数据和逻辑分离,即将控制类划分为Model类(只存数据和组件)和Fsm逻辑类(逻辑行为的本质是组合),解耦实际上就是在处理依赖关系。至于状态混乱一般可能是约束条件不足,或者业务逻辑就不适用状态机。还得看实际场景


      IP属地:四川来自Android客户端3楼2023-10-24 04:34
      回复
        还有就是自己造轮子是有好处的,一些现成工具(特别是可视化工具。性能其实是很糟糕的,shadergraph就不说了。拿unity的playMaker插件来说,这玩意就是在用状态机写逻辑。而里面大多组件哪怕是两个变量相减Subtract都有相当多的防御性代码,大多时候还用不上。当然快速开发原型还是很好用的工具,从优化角度上看当然还是选择lightweight一点的


        IP属地:四川来自Android客户端4楼2023-10-24 04:56
        回复