经历了一个动荡的春节之后,虽然还在家中隔离的阶段,不过这跟我平时的生活又有什么区别呢?┗( ▔, ▔ )┛
那么,这段时间我完成了一个Goap的示例项目,用以实际尝试一个较为完整的决策、执行流程。场景的设计如下:
- 角色(Agent)体力大于阈值(Random(0.2,0.8))时,闲逛(Wander),否则寻求体力(Stamina)的提升
- 场景里有2种果树各2棵,苹果树、桃树,分别产出苹果与桃
- 篝火可以进行烹饪,有两种配方:苹果->烤苹果,桃子->烤桃子
- 食用食物需要在场所“餐桌”进行
- 食用食物可以提升体力,不同食物提升的体力:桃子0.2,苹果0.3,烤桃子0.4,烤苹果0.5
看一下我录制的运行视频吧:
https://www.bilibili.com/video/av87642112/
我运行了7个agent,他们在体力较低时,会寻找最近的树木,到篝火做成烤制食物,然后去餐桌吃掉,然后继续闲逛。在食物选择方面,他们都会选用效果最好的烤苹果。
这里体现了Goap的核心特点,在编码里,agent的目标只是“体力上升”,而并没有直接编码整个寻找、烹饪、食用的流程,Agent是通过所有他能做的行为组合“发掘”出能够实现体力上升的方法的。
性能:在写Goap的复杂操作时,由于对DOTS的一些不熟练,只实现了节点展开和最优解寻路的多线程。因此有些担心性能。不过实际跑起来目前看还可以,视频中有些卡顿主要是因为右侧debug界面的实时AI展示会卡,刨除这个编辑器原因和渲染耗时,游戏本身的运行时间在我电脑上是每帧4-6ms,实验增加至21人时增加2ms。不算惊艳,但是也不需要我立即着手优化,等到实际项目里,action规模大起来后,再根据展现的瓶颈做针对性的性能优化了。
下一步:这个演示使用的是GOAP的经典方法,即每个Agent只进行自己的考虑和工作,互相之间没有协作。但我的游戏需要拥有不同专长的分工合作来执行玩家派下的任务。因此下一步的工作是3点:首先是公共目标池的管理,然后agent对自身目标池与公共目标池混合考虑后,接单适合自己的目标,最后是Goap中遇到自己无法独立完成的目标时生成新的子目标丢回池中交给其他agent接单。
那么下次见吧!各位尽量宅在家里,必须出门时要带口罩哦!
讨论群: 827072601
爱发电: https://afdian.net/@taohuayuan
任务板: https://trello.com/b/StForyw7/taohuayuan
twitter: https://twitter.com/zephyr1125
wiki: https://taohuayuanwiki.a2hosted.com
discord: https://discord.gg/sMuKYE6
大佬你好,我看介绍GOAP的文章里提到,在遍历action进行规划时,一旦采用了一个action放进路径,那这个action就会从可选列表里移除以防止重复连接的action造成没有尽头的死循环。也有人是不移除,但是也需要给遍历深度设一个上限防止开销爆炸。
但这两种方式好像都并不能让规划出的行为路径中包含循环结构?
比如我当前可用的actionA的效果为【苹果数量+1】,goal为【拥有100颗苹果】,规划时要怎样让planner能规划出【执行 A 100 次】这样的路径呢?
用行为树的话倒是很容易配出来。。
@reekin:巧了啊,我刚刚写了一篇新的日志就是为我当前的GOAP增加数量支持的。你可以看一下,但是写的很简略,欢迎直接跟我联系,联系方式在各日志里我都有放。