前言
继续抽空学一学公司的课程,最近可真是懒得不行。
AI和游戏
AI,人工智能,这几年很火的概念,简单来说,人工智能就是让计算机能够完成人类/动物的思维。人工智能也许比你想象的更广范,早期人工智能,称为专家系统,就是一种穷举大法,也算是人工智能。 在游戏中,我们也大量使用人工智能,人工智能运用于游戏性提升,游戏内容创作(美术),玩家数据分析。运用人工智能也会带来成本上升,以及有可能带来游玩时的不可控性。由于考虑到成本和收入不匹配,最新的机器学习以及神经网络还没有被运用到商业游戏中。
AI在Gameplay中的模块
由于不能截图,我也只能简单表达一下。
世界接口 AI获取游戏中的信息
集群AI 计算整个集群的策略 单个角色AI 做出决策 移动
表现动画/物理
执行管理器
移动和寻路
移动
AI移动方式可以分为:
- 掌舵移动(Steering Behaviors):可以理解为AI拥有比较完整的控制器,我们可以像普通玩家控制游戏角色一样控制AI,只需要通过传入输入参数。这种AI移动更真实,更复杂。
- 坐标移动(Coordinated Behaviors):Unity navmesh导航系统中,给AI一个坐标他就会自动移动到那个位置。这种基于终点坐标的移动就是坐标移动。
- 物理模拟(Predicting Physics):就是使用物理引擎来移动AI。
到达目的地的判断
当然是使用和目的地的位置对比/碰撞检测。但是有时候AI物体的 体积太大,速度太快,或者集群AI数量太多,导致AI物体在目的地附近蠕动,对此我们往往需要做出相应调整。比如按物体大小加权的方式加大目的地检测范围,外围添加一个更大的减速圈。
寻路
寻路往往首先需要我们将场景抽象为一系列空间节点,然后根据寻路算法计算出起点到目的地的路径。游戏中最常见的最短路径算法为迪杰斯特拉/A算法,及其自定义魔改算法。 使用A算法,当运用于大量房间的场景时,可以将每个房间看作一个节点,先找到房间到房间的路径,再在每个房间中单独寻路,能节省不少。
世界表述
前面提到运用寻路算法需要将场景抽象为一个个空间节点。我们有好几种技术去实现。
- 网格类(Tile Graphs):先前的A*算法学习笔记中的项目使用的就是网格类,将场景抽象为一个二维/多维网格,网格中的每个节点表示场景中的一个位置。要考虑角色是否能被一个网格容纳,以及当网格空间中的一部分有障碍物时应该如何判定网格性质。
网格类更多运用于战棋类游戏。 - 狄利克雷域/圆锥域(Dirichlet Domains):由空间中某个高度的点向下的圆锥投影决定的一块区域,这块区域的大小,形状对于程序来说其实很好定义,但往往需要关卡策划进行实际的配置。特别适合大型网游中的AI寻路。
- 可视点(Points of Visibility):将场景中的每个转角点看作节点,通过射线检查判断点与点之间的连接情况。这是一种很直观的世界表述法,有时对于节点我们更愿意选择一个偏移点作为实际移动目的地,因为节点完全靠墙。可视点方法的缺点是往往会生成很多无意义的连接。
- 导航网格(Navigation Meshes):这是现在最流行的方式,导航网格有点集大成的感觉,具体方案就是将场景分割为一个个三角形/多边形,类似模型网格的感觉,然后以各个多边形的重心作为一个节点位置。通过记录上一帧物体所在位置,就可以很快得到当前帧物体在网格中的位置。和网格一样,我们需要主要划分的多边形能够容纳角色,由于导航网格是二维的,在三维空间中也需要判断上下。
当然,导航网格实际上要更复杂一些,往往根据项目进行不同优化。
决策制定
状态机
定义AI的有限个状态,根据条件在状态间切换。对于游戏编程,状态机非常好用且直观,不仅仅局限于AI。缺点是随着状态的增加,状态机会变得难以维护。为了更好的维护,我们往往对状态机进行分层。
行为树
一个树的数据结构,和数据结构一样,有根节点。有复合节点,叶子节点,以及装饰器。节点有三个结果:成功、失败和正在执行。 复合节点定义行为树的执行逻辑,分为选择节点和序列节点,选择节点从左到右依次执行,直到执行到成功的节点就会返回成功,没有返回成功的节点就返回失败。顺序节点则相反。叶子节点实际定义了行为。装饰器就是对结果进行取反。 行为树的逻辑清晰,并且复用性好,但是由于每一帧遍历整棵树一次,如果行为树的深度大,执行起来就比较慢,而且行为树往往要制作太多小节点。 为了对行为树进行优化,我们可以将多个节点放到一个数组,这样执行前一个节点,无论成功还是失败,下一个要执行的节点是明确的。我们也可以将状态机和行为树混用,比如在状态机进入某一个状态时执行一个子行为树。
GOAP
现在我们的AI有一个目标和若干行为,我们从所有行为中筛选能达成目标的一系列行为去执行,这就是GOAP。上述的行为和目标会被抽象成图,运用寻路算法(什么IDA*)来获取行为路径,这被称为Planner。 GOAP的决策是否灵活,但是稳定性差不可控。模拟人生就使用了这种方案。
AI的战术和策略
战术点(Waypoint Tactics)
路径点(Waypoint)就是游戏关卡中的一个位置。这个位置定义一个战术。比如LOL的草丛,AI会蹲进去埋伏。
战术分析(Tactics Analyses)
通过势力图(Influence Masp),也就是一个定义了游戏区域中的控制区域、影响区域的图,让AI分析出战术。比如有一队AI马润要抢滩登陆,我们提前做好了海岸的敌人势力图,比如机枪碉堡的位置和射击范围,敌人士兵的分布位置和巡逻路线,甚至敌方士兵的作战能力,考虑上述要素形成的势力图。AI马润就可以根据势力图以最小的代价策划进攻路径。或者LOL队友在地图的某个地方和敌人打起来了,要让AI去参团,等等。 我们还可以加入地形分析,比如在RPG游戏中,射手站在高地攻击范围更远,伤害更高,也可以影响AI的战术分析。 势力图是相当有用的,但是往往会造成更多消耗,往往需要一些优化。
团队协作(Coordinated Action)
AI往往还有考虑和团队的协调,比如简单的,一对AI要一起走到一个地方,走的快的AI等走得慢的队友跟上自己。或者RPG游戏中让战士在前排承担伤害,射手和法师在后排输出。这些都需要团队的AI算法来实现。
|