[toc]
# 概述
这篇个人手记目标是将一个一直以来都挺想学到的 Goap 技术熟悉一下.
# 我对于游戏层面 AI 的想像
游戏 AI 的算法实际上已经发展了很久了。相比于传统计算机学科中的 AI,游戏 AI 更像是一种定式 / 启发式的固定 AI 构造器。而我所理解的基于深度学习一类的 AI,更类似于基于统计学来计算出一个可以拟合特定问题的高维函数,而这个函数的参数要远大于游戏领域的 AI 参数 (毕竟什么读指令,环境因素等参数输入也不是很多嘛),从这个角度出发,我们似乎可以得出这样一个结论,传统游戏 AI 在算力优先的前提下,是需要找出让 NPC 看起来不那么愚蠢的小型函数 在我个人的观点中,我认为状态机可以解决众多的问题,而极其极其复杂的状态机,实际上就可以描述成一个极其复杂的函数式,状态的变更就是根据参数寻找下一步的变更。
这里指的状态机并非传统科学中死板的状态转换的状态机,而是一个很自由的图状结构 (状态 / 状态下的行为 / 状态间转换的条件)
基于统计的 AI 的目的是要去得到一个极其复杂的这样的结构。
而游戏的 AI 的目的则是使用一个尽量简单的结构来做出一个看起来不那么愚蠢的游戏 NPC。 在这个前提下,前辈们提出了很多优秀的系统架构,如行为树、分层状态机等。
那么,既然状态机本身就可以拟合大量的结构了,为什么还要搞出行为树 / 分层状态机等更抽象一层的状态机呢?
我的理解是,更深一层次的抽象,可以让本来需要编写极其极其繁琐的 AI 状态转换图变的更加直观与清晰,所以,这种更深一层次的抽象还是有必要的。 而我今天要记录的一个游戏层的 AI 架构,就是 GOAP,业界称他为基于目标的行为规划
而这个算法实际上也更符合我对于一个高层次抽象游戏 AI 的想像。 想像:
1. 每个个体都是单独的,即每个个体都需要一个上下文 (Context) 2. 世界需要有世界的上下文 (Context) 3. 个体可能对个体的上下文产生影响 4. 个体可能对世界的上下文产生影响 5. 个体的状态转换完全依赖于当前自身的上下文与世界上下文 6. 个体的状态存在优先级 7. 不同的状态对应个体不同的行为 8. 个体行为即会造成 3、4 的产生
# ReGoap
ReGoap 是 Unity 开源的一款 Goap 的插件,学习了一下,做出的代码简单的流程图如下: 但是 ReGoap 有一个很恶心的点,即虽然它使用了多线程进行优化,但是在数据的处理和数据的传递方面仍然使用了大量的 GC 方法,这就注定了他的性能会很差… 所以后面需要基于它的思想进行 Goap 的重构 而且另一个问题是,我没有从中看到 Action 行为被打断后的处理逻辑 但是其实也可以支持 Action 行为被打断,比如在 Acton Run 的时候去检查上下文,如果发现不满足可以 Run 的条件了,就出发中断函数,重新计算目标
# Action 的作用
Action 的作用就是让智能体执行某个 Action 之后可以改变世界 / 自身的某些状态
# Goal 的作用
Goal 的作用就是判断世界 / 自身的状态是否满足当前 Goal
# Planner 的作用
Planner 就是负责规划所有可行的 Goal, 并且计算通过所有 Action 可以达到 Goal 的最优路径
# Agent 的作用
Agent 是负责收集智能体的所有 Action, 以及负责计算当前所有 Ation/Goal 的 Enter/Exit/Plan/Run