目前在游戏中主流的AI框架是 Behavior Tree
先上一张网上找到的行为图
从图中可以看到一个怪物的行为被拆分成了,很多的节点,通过节点组合成树形结构。
每个叶子节点是实际正真执行的动作或条件判断,称之为Action 或Condition,从根节点到叶子节点,中间路径上的节点,是组合节点。
叶子节点:会将执行结果返回,返回类型有Success,Failed,Running,三种状态
而组合节点分类三类:
1、Sequence :按照序执行子节点,直到其中一个子节点返回Failed,就停止执行。该节点的返回值也是Failed。如果所有子节点中没有返回Failed的,就会全部执行完,并返回Success给该父节点。该节点,也会返回Success给自己的父亲节点。
2、Selector:按序执行子节点,直到遇到子节点,返回Success,才停止执行后续的子节点。并返回Success给自己父节点,如果所有子节点都返回Failed,那当前节点也返回Failed给自己的父节点。
以上这两类组合节点会通常会比较常用,节点的访问顺序,是深度优先,当遇到符合对一个的条件时,才会终止遍历。
另外还有基于这两类的变种,比如随机Sequence,就是不按照顺序执行子节点,随机挑选。
3、Paraller:并行执行,会有一个主节点,根据主节点范围Runniing状态的情况,其他节点将会按序执行,并将结果返回 running结果,否者就直接返回主节点的执行结果Success or Failed
返回的结果:具体策略
1. Parallel Selector Node: 一False 则返回False,全True才返回True
2. Parallel Sequence Node: 一True则返回True,全False才返回False
3. Parallel Hybird Node:指定数量的Child Node 返回True或False后才决定结果。
整体架构就是将不同的Action或Condition各种组合,拼装成一颗树,并通过对应的访问策略来访问每个分支,并执行叶节点。
在gthub上有一个比较容易理解写C#版本,主要是应用于Unity3d的行为树开源框架
https://github.com/f15gdsy/BT-Framework-2 比较容易理解,可以直接导入unity3d工程使用。
有unity3d上还有一些其他的插件可以使用,比如Behavior Design,Node Canvas 还有腾讯开源的behaviac;
可以找到适合自己项目的框架就足矣。
要使用这种架构设计的AI框架,绝大部分的工作量,还是集中中Action 和 Condition的具体实现上,工作量会比较大,另外就是对于Action 元行为的设计,需要做到足够的抽象,而且Action的行为一定要 低耦合、高内聚。只有这样才能可能有比较高的复用性。
一般游戏中的主要Action和Conditon抽象行为
- 元action行为动作
- 行走
- 跑步
- 待机
- idle 状态
- 冲刺
- CastSkill --》需要参数,skillId
- 顺序
- 随机
- 概率分布
- 搜敌--》仇恨最高
- 走路+射击(并行操作)
- 动画播放
- 条件判断
- 根据血量的判断条件
- 根据距离的判断条件
- 根据时间的判断条件