zoukankan      html  css  js  c++  java
  • 游戏AI之初步介绍

    游戏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决策结构几乎都是采用状态机)。

    游戏设计模式——有限状态机 - KillerAery - 博客园

    行为树(Behavior Tree)<重要>

    行为树是一种以树状结构表达的决策模式,也是一种设计模式。这也是现代游戏AI最常用的决策结构。

    游戏AI之决策结构——行为树 - KillerAery - 博客园

    路径规划(Path Planning)<重要>

    所谓路径规划,就是指在一张已知的地图上,AI规划出一条位置A到位置B的路径。而寻路是游戏里极为常见的操作,常用的寻路算法有A*算法,D*算法,JPS算法等。而为了实现游戏中高效而合理的寻路,需要对寻路算法做出很多改进方法。

    游戏AI之路径规划 - KillerAery - 博客园

    脚本驱动(Script Driving)

    使用脚本的好处是可以随意编写出逻辑代码而无需再次编译,从而极大减少修改逻辑的成本。UE4甚至让脚本可视化(也就是大名鼎鼎的蓝图),从而让设计师无需编写任何代码也可以创造出一段段游戏逻辑。游戏AI的逻辑修改往往很频繁,而通过脚本的方式来编写无疑是非常合适的。游戏程序中的脚本语言有很多,这里就列举几个常见的:lua(包括各种衍生版,如xlua)、python、C#。

    C++与Lua交互之配置&交互原理&示例 - KillerAery - 博客园

    机器学习(Machine Learning)<有潜力>

    机器学习训练出游戏AI的优势在于:

    • 目前绝大部分游戏AI都是人工制作,工作量庞大。机器学习可以大大解放AI设计师的生产力,只需放台电脑让其训练出更真实的AI。

    但缺点也是有的:

    • 过于复杂的环境,或者需要复杂交互的AI几乎很难训练出来(例如开放世界RPG游戏的NPC,它们都得有自己的一套复杂剧本台词和NPC行为)

    因此目前看来,机器学习训练出来的AI可用于简单交互的AI,例如看到人就跑的小动物,更复杂的例如会遵守交通规则的路人/车辆。

    若对Unity的机器学习感兴趣:

    群体智能(Group AI)

    群体智能意味着集群的AI。例如足球游戏里,集群AI操控一方所有球员互相配合传球踢球。又或者射击游戏里,集群AI操控一支小队通过战术进攻据点。
    如果对于一个智能体集群情况,使用大量的自治智能体(一个AI控制一个智能体)很容易出现CPU性能瓶颈:因为这些自治智能体互相不可知,需要经过复杂的获取信息阶段,复杂的决策阶段才可做出团队行为。
    而集群AI,则可以看成一个AI控制多个智能体,这样集群的信息数据甚至是行为都可以共享,也方便集群AI统一调配管理控制下属各个智能体。

    群体智能的一个GDC演讲:GDC2012讲座:《杀手:赦免》中的人群系统

    模糊逻辑(Fuzzy Logic)

    为了让游戏AI更人性化,模糊逻辑很有必要。做游戏AI往往不是做最优解,而是做像人类的解。
    在某些时候,例如:某个AI战斗结束后,判断如果子弹数量少,则回基地取弹药,
    “子弹数量少”这个条件就可以做成一种模糊逻辑条件。

    游戏AI之模糊逻辑 - KillerAery - 博客园

    模糊逻辑的一个扩展是 模糊状态机(FuSM)
    传统状态机往往是个确定的状态,例如要么是On状态要么是Off状态。但是通过结合模糊逻辑和状态机,便可以有稍微On的状态、不太Off的状态等更多的选择性,这可以给AI设计师添加更多模糊状态对应的行为,这给游戏添加了更多乐趣:非常害怕时抛下武器逃跑,害怕时带着武器逃跑,有点害怕时且战且退...

    黑板(Black Board)

    “黑板”简单来说就是多模块间数据共享的数据结构。编写游戏AI引擎时,往往避免不了各模块之间的通信,而使用黑板模式无疑是极好的选择。

    游戏设计模式——黑板模式 - KillerAery - 博客园

    协程(Coroutine)

    协程,也叫微线程,它会在每个时间段(通常是每一帧)间隙更新执行一些代码,效果看起来就好像另一个线程在执行一样(但实际是同一个线程)。游戏AI有大量的关于时间的动作(例如延时2秒执行某某操作),使用协程可以大幅简化一堆Update的计时代码。

    Unity C#笔记 协程 - KillerAery - 博客园

    杂项技巧(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月更新。

  • 相关阅读:
    Mac nginx 简单文件服务器
    cocos-lua
    Sublime Text 3 快捷键精华版
    VS中dumpbin工具的使用
    【2022新教程】Ubuntu server 20.04如何安装nvidia驱动和cuda-解决服务器ssh一段时间后连不上的问题
    linux如何将一个正在运行的进程转入到后台执行且中断shh连接不被kill掉
    Ubuntu如何修改默认python版本-sudo和不用sudopython不一致怎么办
    Ubuntu中virtual enviroment在sudo下无效怎么办?
    时间复杂度为O(1)的抽样算法——别名采样(alias sample method)
    Luke技术小站公告板
  • 原文地址:https://www.cnblogs.com/KillerAery/p/10003678.html
Copyright © 2011-2022 走看看