游戏AI的综合设计
游戏AI的综合设计
游戏 AI 的综合设计
AI (Artificial Intelligence) 作为游戏的重要组成部分,对游戏的可玩性起到越来越大的作用。玩家早已不满足傻瓜似的敌人和 NPC ,渴望见到能像人一样思考的虚拟人物。本文首先介绍游戏常见的人工智能技术,然后综合利用各种技术设计一个较为通用的 AI 引擎。
有限状态机 (FSM)
:有限状态机是游戏中最常用的人工智能技术,其他技术基本都需要有限状态机的支持。有限状态机把单位的行为抽象成若干种状态,在一定的条件下状态之间可以相互转换。例如,敌人开始处于巡逻状态,当玩家靠近时,转换成追击状态,当玩家远离后,又恢复巡逻。单位的 AI 可以用一张状态图表示。
模糊逻辑 (Fuzzy Logic)
:模糊逻辑是布尔逻辑的扩展。布尔逻辑中“是”和“否”是绝对的,而模糊逻辑中会有“有点是”、“不怎么是”、“非常是”的区别。例如上例,玩家靠近巡逻状态的敌人,这种靠近就是一种模糊的概念。使用了模糊逻辑后,有时敌人认为距离 3 米就算靠近了,有时认为距离 2 米才算靠近。
模糊状态机 (FuSM)
:结合模糊逻辑和有限状态机,就产生了模糊状态机。模糊状态机中,单位不是绝对的处于某种状态,而是同时处于几种状态,只是每种状态的比重不同。
智能地形 (Smart Terrain)
:智能地形是给地形赋予特殊的信息,从而用于 AI 寻路、伏击等战术。 CS 中的路径点 (Way Point) 就是一种智能地形。相似的还有智能物品等。
A 寻路算法 (A Star Path Finding)*
: A* 算法被证明是最高效的寻路算法,在寻路中被广泛应用。 A* 算法是对迪杰斯特拉算法的改进,详细资料网上有很多。
脚本系统 (Script System)
:脚本系统应该是游戏引擎的组成部分,但也可以算作 AI 的一种技术。例如 DOTA 使用的是 WarCraft 的引擎,地图编辑者使用地图编辑器为 DOTA 中的各个英雄编写不同的 JASS 脚本,英雄们才有了一定的 AI 。目前最流行的脚本语言是 Lua 脚本, WOW 就是使用 Lua 做脚本语言。
遗传算法 (Genetic Algorithm)
与 神经网络 (Neural Network)
:这二者属于较为高级的 AI 技术,都具有机器学习,进化的性质。但是,实际游戏中应用的并不多,因为游戏中的单位通常不能接收足够的学习,学习的结果也不好控制,容易出现意想不到的情况。
游戏中的 AI 引擎就是要综合利用上述技术,并且要与渲染、物理模拟等引擎部件配合。首先我们了解一下人类大脑的结构:
人脑 | 作用 |
脑干 | 呼吸、血液循环等生命中枢 |
小脑 | 平衡 |
运动区 | 动作 |
感觉、视觉、听觉、嗅觉区 | 各种感受 |
额叶 | 高层大脑功能 |
颞叶 | 记忆 |
模拟人脑结构,设计我们的 AI 引擎结构:
AI | 作用 | 技术 |
物理模拟 | 碰撞检测、碰撞反应 | 物理引擎完成 |
导航 | 寻路 | A* 算法、路径点 |
动画渲染 | 渲染 | 有限状态机、 渲染引擎完成 |
感知器 | 感知 | 脚本系统、智能地形、智能物品 |
决策器 | 决策 | 脚本系统、有限状态机、模糊逻辑 |
记忆器 | 学习 | 神经网络、遗传算法、脚本系统 |
各部分可以用消息系统连接起来,并且对外公开接口 API ,下面是整体结构图:
下面解释该系统的工作原理:
l
物理部分由物理引擎完成,包括碰撞检测、碰撞反应,保存着物体坐标等物理信息。某些碰撞信息要通知感知系统,也就是该单位的触觉。
l
感知系统在不同单位中差别很大。例如最简单的敌人可以没有任何感觉。稍复杂的敌人可以拥有视觉,即可以发现其前方的玩家,这时玩家可以绕的敌人身后偷袭。更复杂的敌人可以拥有听觉,即玩家在身后偷袭时如果打碎了物品也会被敌人发现。魔兽争霸中的单位可以感知附近的敌人,发现敌人进入了一定区域就会自动去攻击。感知系统可以直接决定单位行为,类似与条件反射,例如“受到伤害”的感觉会让单位逃避伤害,哪怕这个单位没有高级决策能力。
l
决策系统是单位的高级 AI ,单位可以综合感知系统提供的各种信息和其他单位对其下达的命令做出判断。命令可以是玩家的输入,也可以是团队指挥者(也是一个 AI 单位)下达的。例如 DOTA 中一个 AI 英雄通过综合衡量自身的生命、攻击力、对方生命后,决定和对方 PK 。决策系统可以使用有限状态机、神经网络等技术。同时也可以让单位拥有学习功能,但平衡的学习功能实现起来比较困难。
l
决策系统直接知道单位的行为,是攻击、移动,还是跳跃。单位行为可以由有限状态机管理。另外,较为复杂的游戏地图里,决策系统有时需要导航系统把“前往某处”分解成“先到哪,后到哪”,再控制单位的行为。
至此,整个 AI 引擎已经比较完善了,在各种类型的游戏中也比较通用。可以把 AI 的整体框架放到游戏物体基类 (GameObject 类 ) 中,各派生类继承并重写关键方法,从而表现出不同的智能。