目录游戏AI是什么?智能的假象机器学习介绍一些游戏AI4X游戏AI《求生之路》系列角色扮演/沙盒游戏中的NPC基于AI自动生成的文字冒险游戏游戏AI 需要学些什么?有限状态机(FSM)行为树(Behavior Tree)路径规划(Path Planning)脚本驱动(Script Driving)机器学习(Machine Learning)群体智能(Group AI)模糊逻辑(Fuzzy Logic)黑板(Black Board)协程(Coroutine)杂项技巧(Trick)参考
游戏AI是什么?
在以前游戏AI基本上都是程序员预先定义编写好可能发生的行为,而不具有机器学习那种自我学习的特性。
智能的假象
这是因为游戏AI主要职责是模拟出智能行为,而并非学习(例如:街道上会避让车的人群,天空中乱飞的小鸟,来回巡逻的守卫,兵线上的小兵…)。而游戏AI往往使用的是以行为树为代表的人工设计方法,而很少应用到机器学习技术。
可以说游戏AI是智能的假象。
机器学习
使用机器学习方法的游戏AI实际上也有不少,包括人们所熟知的围棋AI,DOTA2的OPEN AI等…..但是这些都是基于玩家角度的AI,而非传统意义上为玩家服务的从NPC角度出发的AI。
但到了机器学习方法越发流行的今天,机器学习方法也渐渐运用到了传统意义上的游戏AI中。现在通过机器学习方法可以训练出一些简单的生物(看到人类就跑的兔子),也可以是更复杂的事物(遵守交通规则的车辆、行人),甚至是整个游戏机制都是学习的结果(例如AI自动生成游戏环境)。而这些,只需要将AI扔到服务器让它自己跑一段时间就可以完成,再也无须设计师手工设计AI,极大解放生产力。这在将来的游戏工业会是很重要的技术。
因此现在看来,机器学习方法可以归纳为游戏AI的一部分。游戏AI应该分为人工制作的和机器学习训练的。
介绍一些游戏AI
4X游戏AI
《群星》《文明》《王国风云》等为代表的4X游戏,战略游戏的一种,其主要的四个游戏目的分别是:
eXplore(探索),eXpand(扩张),eXploit(掠夺),eXterminate(毁灭)。
为了让玩家在4X进程中受到阻挡,4X游戏AI必须得足够聪明做出决策,
但又同时为了不让玩家觉得无法胜利,它往往不是采用最优策略,而是使用更“人性化”的策略,
(例如反应延迟,走的路径稍微扭曲,模糊决策等做法)。
《求生之路》系列
作为一款FPS游戏,很难说《求生之路》里的怪物有多智能——它们本来就该是愚蠢而凶猛的。真正有技术含量的是它的“导演系统”,AI Director作为后台的核心,会根据玩家在游戏中的具体表现调控游戏的节奏。怪物出现的地点、数量,何处刷新道具等等,配合上根据形势动态变换的音乐,给了用户更真实的游戏体验。
角色扮演/沙盒游戏中的NPC
在一些自由度较高的游戏中,为了让玩家更好的融入这个世界,游戏会对NPC进行很多详细的设定。比如在《巫师》系列中,每个NPC都有自己的性格设定,包括会话数据库,让他们可以进行丰富的动作和对话。在GTA这种沙盒游戏中更是这样。
基于AI自动生成的文字冒险游戏
游戏AI 需要学些什么?
因为游戏AI需求多端,博主在查阅多方资料和平时实现时知道的所有可用的基础知识/解决方案/杂项技巧列举出来,当然对于重要的基础知识会mark出来。
有限状态机(FSM)<重要>
状态机是一种表示状态并控制状态切换的设计模式,常常用于设计某种东西的多个状态。
例如一个人有站立状态,跑动状态,走路状态,蹲下状态,开火状态等…
当应用在游戏AI时,它也可以作为AI的决策结构(以前老游戏的AI决策结构几乎都是采用状态机)。
行为树(Behavior Tree)<重要>
行为树是一种以树状结构表达的决策模式,也是一种设计模式。这也是现代游戏AI最常用的决策结构。
路径规划(Path Planning)<重要>
所谓路径规划,就是指在一张已知的地图上,AI规划出一条位置A到位置B的路径。而寻路是游戏里极为常见的操作,常用的寻路算法有A*算法,D*算法,JPS算法等。而为了实现游戏中高效而合理的寻路,需要对寻路算法做出很多改进方法。
脚本驱动(Script Driving)
使用脚本的好处是可以随意编写出逻辑代码而无需再次编译,从而极大减少修改逻辑的成本。UE4甚至让脚本可视化(也就是大名鼎鼎的蓝图),从而让设计师无需编写任何代码也可以创造出一段段游戏逻辑。游戏AI的逻辑修改往往很频繁,而通过脚本的方式来编写无疑是非常合适的。游戏程序中的脚本语言有很多,这里就列举几个常见的:lua(包括各种衍生版,如xlua)、python、C#。
机器学习(Machine Learning)<有潜力>
机器学习训练出游戏AI的优势在于:
目前绝大部分游戏AI都是人工制作,工作量庞大。机器学习可以大大解放AI设计师的生产力,只需放台电脑让其训练出更真实的AI。
但缺点也是有的:
过于复杂的环境,或者需要复杂交互的AI几乎很难训练出来(例如开放世界RPG游戏的NPC,它们都得有自己的一套复杂剧本台词和NPC行为)
因此目前看来,机器学习训练出来的AI可用于简单交互的AI,例如看到人就跑的小动物,更复杂的例如会遵守交通规则的路人/车辆。
若对Unity的机器学习感兴趣:
Unity 用ml-agents机器学习造个游戏AI吧(1)(Windows环境配置) – KillerAery – 博客园
Unity 用ml-agents机器学习造个游戏AI吧(2)(入门DEMO) – KillerAery – 博客园
群体智能(Group AI)
群体智能意味着集群的AI。例如足球游戏里,集群AI操控一方所有球员互相配合传球踢球。又或者射击游戏里,集群AI操控一支小队通过战术进攻据点。
如果对于一个智能体集群情况,使用大量的自治智能体(一个AI控制一个智能体)很容易出现CPU性能瓶颈:因为这些自治智能体互相不可知,需要经过复杂的获取信息阶段,复杂的决策阶段才可做出团队行为。
而集群AI,则可以看成一个AI控制多个智能体,这样集群的信息数据甚至是行为都可以共享,也方便集群AI统一调配管理控制下属各个智能体。
群体智能的一个GDC演讲:GDC2012讲座:《杀手:赦免》中的人群系统
模糊逻辑(Fuzzy Logic)
为了让游戏AI更人性化,模糊逻辑很有必要。做游戏AI往往不是做最优解,而是做像人类的解。
在某些时候,例如:某个AI战斗结束后,判断如果子弹数量少,则回基地取弹药,
“子弹数量少”这个条件就可以做成一种模糊逻辑条件。
模糊逻辑的一个扩展是 模糊状态机(FuSM)
传统状态机往往是个确定的状态,例如要么是On状态要么是Off状态。但是通过结合模糊逻辑和状态机,便可以有稍微On的状态、不太Off的状态等更多的选择性,这可以给AI设计师添加更多模糊状态对应的行为,这给游戏添加了更多乐趣:非常害怕时抛下武器逃跑,害怕时带着武器逃跑,有点害怕时且战且退…
黑板(Black Board)
“黑板”简单来说就是多模块间数据共享的数据结构。编写游戏AI引擎时,往往避免不了各模块之间的通信,而使用黑板模式无疑是极好的选择。
协程(Coroutine)
协程,也叫微线程,它会在每个时间段(通常是每一帧)间隙更新执行一些代码,效果看起来就好像另一个线程在执行一样(但实际是同一个线程)。游戏AI有大量的关于时间的动作(例如延时2秒执行某某操作),使用协程可以大幅简化一堆Update的计时代码。
杂项技巧(Trick)
通过“抖动”(Dithering),"平滑"等技巧可以增强拟人性,让AI愚笨的像个人。
简单的解释抖动的话,就是说先计算一个最优解(不可战胜的AI),然后给这个最优解做一些随机数的修正,从而偏离最优解(有点难但可战胜的AI)。
资源分配树(Resource Alloction Tree)是一种树状结构,用于表示一个玩家的所有资产类型及其权重。决策时可根据资源分配树各个节点权重来执行不同的分配策略。例如在《文明5》里,各个AI文明有些偏重和平发展政策,有些偏重军事征服政策,有些偏重文化政策…通过不同的资源分配树可以制作特征各不同的AI。
依存图(Dependency Graph)则是一种有向图结构,用于表示不同资产类型的依存性。例如玩家进入中世纪时代才可以建造射箭场,建造了射箭场才可以生产弓兵,因此可以构造出这样一个依存图:中世纪时代->射箭场->弓兵。依存图常常被AI用来规划当前的发展路线,也可以用于推理对方玩家的科技树,从而调整发展策略(例如调整资源分配树权重)。举个例子:例如发现敌方玩家的一个弓兵,那么容易推断敌方玩家已经建造出了射箭场,那么在军事分配上就会偏向发展骑兵,而不是发展步兵(被弓兵克制)。
势力图(Influence Map)是将游戏地图划分网格,每个网格都有一个势力值(实际上也可以有其他数据),该值受周围元素影响。例如足球游戏里,每个球员AI有一张势力图,球和队友会对周围网格造成正值影响,而对手和边界会对周围网格造成负值影响…这样将所有影响元素考虑之后,球员AI会偏向将球踢向/传向势力值最大的网格。
参考
[1]《游戏人工智能编程案例精粹(Programming Game AI by Example)》 Mat Buckland [2012-9]
[2] Finney的AI分享站 | http://www.aisharing.com/
[3]《游戏编程精粹2(Game Programming Gems 2)》 Mark DeLoura [2001-10]
[4]《游戏编程精粹3(Game Programming Gems 3)》 Dante Treglia [2002-7]
[5]《游戏编程精粹4(Game Programming Gems 4)》 Andrew Kirmse [2005-9]
[6]《游戏编程精粹5(Game Programming Gems 5)》Kim.Pallister [2007-9]
[7]《游戏编程精粹6(Game Programming Gems 6)》Michael Dickheiser [2007-11]
[8] GDC Vault | https://www.gdcvault.com/
游戏AI 系列文章:游戏AI – 随笔分类 – KillerAery – 博客园
更新日志:于2020年6月更新。