关于GOAP
首先要说明的是GOAP是一个目标导向的行为规划框架,你可以理解为把行为树中,每次判断是否执行当前行为的if条件,以及要执行的条件部分,两个拆开来管理的框架。
更多详细的介绍可以参考这位给的解释
https://www.cnblogs.com/FlyingZiming/p/17274602.html#%E9%9A%BE%E7%82%B9%E4%B8%8E%E6%8C%91%E6%88%98
其次是关于实现,倒不如说本文侧重阐述实现的苦难….
首先要说明的是,GOAP本身的资料相对比较少,教程貌似只有一个在Unity上的实现,所以要参考网上的实现就只有一种方式,阅读源码并理解,但很可惜的项目组并没有给我太多的时间,而且我要在UE上实现,所以我的实现其实是我自己想的,目前也有些问题,但总归思路是对的,在此提醒。
大概的流程是这样的
- GoapState具有所有的世界状态
- 通过GoapSensor去感知到所有的状态
- GoapPlanner根据所有的状态,通过当前的Goapgoal即目标,以及可以使用的GoapAction去规划要执行的plan
- GoapAgentComponent根据找到的plan去执行详细的路径
首先是最重要的一点也是最困难的一点,你要先想好所有的Action
在Planner时,他一定会根据你的所有Action开始建图,每一个Action相当于节点,如果你没有办法划分这个的话他是无法很好的执行的,比如说你在跟4个敌人一起作战,敌人后跳后切换最前方的敌人,但实际的执行层Action如果要包括一个后跳就不会这样子划分,可能是Action1:距离300,向后移动 Action2:距离500, 丢失目标
所以你需要把他每一个行为的最小单元想清楚,这是最重要的,也是我没搞出来的原因。
第二点是WorldState
这部分是变化,因为你的state不可能是一直不变的,但如果要让他变化,单纯的Action是可以的,但他是有限的,所以对于不同的物体应该有一个不同的state去触发
即WorldState为什莫叫WorldState
接下来是代码总结
首先在GoapPlanner的A*部分,没有去正确的建图,如何建图这部分其实更像是把每一个动作拆分成最小单元集,这是一种在项目组内不断拆解功能后的一种能力,因为我本身是做引擎的,最近才开始在项目组内实现需求,这点能力有欠缺,相信屏幕前的你应该比我强(●ˇ∀ˇ●)
其次是在WorldState你可以看到目前是一个很空的东西,因为我是从最小开始做的,即一开始能够实现找到一个GoapGoal,并执行一个Action即可,所以后面没有让所有的WorldActor去拥有这样的State
然后是在Agent的执行层面上,非常混乱了,前面也提到优先级的部分,本身这部分其实相当于一个权重,在A*找路径的时候左右他的节点选择,但这个也是后加的,所以最后因为时间紧张+资料少+没想清楚,最后越写越乱。