【原】游戏AI的综合设计
学校的MSTC要出杂志,第一期做游戏专题,我写了一下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类)中,各派生类继承并重写关键方法,从而表现出不同的智能。