孙广东 2018.7.3
市面上Unity人工智能的书籍基本上都是介绍这几个方面:
- AI角色的自主移动 --- 操控行为, 单体,小队,群体的行为。 我之前的文章 Unity Movement AI (一) , Unity Movement AI (二)
- 找到最短路径并避开障碍物 --- A* 寻路, NavMesh等
- 角色自主决策 --- 有限状态机FSM和 行为树
- 机器学习 --- Unity 机器学习 ML-Agents (一)官方介绍概念【必读】
说 goap 之前可以先了解一下, FSM和 行为树
- 有限状态机由一组状态(包括初始状态),输入和根据输入及现有状态转换为下一个状态的转换函数组成。
Unity有名插件 PlayeMaker, Unity内的 Animator动画状态机。 游戏的启动器,选人创角流程, 场景转换流程,网络状态 都可以使用FSM进行设计。
状态机可以使用下面 状态转换矩阵来表达:
- 行为树中最常用的节点包括:
l 动作节点(Action): 属于叶子节点,用于描述一个最终执行的动作。
l 条件节点(Condition): 属于叶子节点,用于描述一个条件是否成立。
l 选择节点(Selector): 属于组合节点,用于顺序执行子节点,只要它的一个子节点返回成功,则整个分支返回成功,反之返回失败,类似程序中的逻辑或(OR)。
l 顺序节点(Sequence):属于组合节点,用于顺序执行子节点,只要它的一个子节点返回失败,则整个分支返回失败,反之返回成功,类似程序中的逻辑与(AND)。
Unity中行为树编辑器 也是特别多的!
关于FSM和行为树百度一下遍地都是,他们在中国游戏中应用非常广泛, 但是 goap 的文章很少。 也听人说过goap 在国外用的多一些。
文章内的代码:
http://github.com/sploreg/goap
网上代码的改进版本:
https://github.com/losetear/goap
主要GC和性能
针对原文的翻译:
http://gamerboom.com/archives/83622
目标导向型行动计划(简称GOAP)是一种能够轻松呈现给你的代理选择的AI系统,也是帮助你可以无需维持一个庞大且复杂的有限状态机而做出明智的决策的机器。
什么是GOAP?
目标导向型行动计划是代理的一种人工智能系统,让你能够计划一系列行动去满足一个特殊的模板。特殊的行动序列不仅依靠于目标,同时也依靠于世界和代理当前的状态。这意味着如果同意的模板是针对于不同的代理或世界状态,你变回获得一个完全不同的行动序列,浙江能够让AI变得更加东太后且显示。让我们着眼于一个例子,即上述演示中所看到的内容。
注:原文使用伐木工为例子, 其实都类似!
例如,假设代理人的目标是收集小麦。 人类可以通过许多不同的方式实现这一目标,例如:
• 寻找镰刀>>收割小麦>>获取小麦
• 寻找小麦青贮>>收割小麦>>获取小麦
• 用手收割小麦>>获取小麦
GOAP能够基于可行的先决条件去选择最佳事件序列。 即如果代理人agent 无法使用镰刀,那么他们必须手动收割。
上面定义的行为可以使用FSM实现,如下所示:
或像这样使用GOAP实现:
GOAP使代码更加模块化,易于维护,通过将状态彼此分离,变得更容易进行测试与维持,每个动作都可以在其他动作的同时进行 。 此外,GOAP允许自发地添加和删除动作; 代理agent 必须只有一个已定义的操作列表,这些操作由GOAP计划程序planner自动处理。
Plan & Goal计划和目标
plan 计划只是满足目标的一系列动作,其中动作将agent 代理从起始状态带到满足goal目标的任何状态。
goal目标是代理想要满足的任何条件。在GOAP中,goal目标只是定义满足目标需要满足的条件,达到这些满意条件所需的步骤由GOAP计划员planner实时确定。目标是能够确定其当前相关性以及何时满足。
Actions操作
每个agent代理都被分配了一些actions操作,这些actions操作是plan 计划中的单个原子步骤,使代理执行某些操作。actions动作的例子是播放动画,播放声音,改变状态,拾取鲜花等。
每一个动作都被封装,对其他动作一无所知。