草庐IT

谈一谈游戏AI - 综述

零壹协奏 2023-05-18 原文
成功者总是善于发现 “可学之处”,执着精进;失败者总是善于发现 “不可学之处”,怨天尤人。

郑重说明:本文适合对游戏开发感兴趣的小白初学者,本人力图将事物用简单的语言表达清楚,但水平有限,能力一般,文章如有错漏之处,还望批评指正。

最近,人工智能应用chatGPT火遍全球。今天,我想开一个小专题,谈一谈游戏AI。但此AI非彼AI,形式和机制差别巨大,相同的是,两者都创造了价值。

AI,全称为 Artificial Intelligence,是任何可以让机器模拟人类行为的能力。那么,在游戏开发中,是怎么让机器模拟人类的行为的?

一、游戏AI的应用

在游戏领域,AI的应用范围大致应用在以下一些方面:

  1. NPC决策。我们在玩游戏的过程中,经常会与大量的NPC打交道,真实生动的NPC带来的体验让人心情愉悦。NPC在与游戏玩家交互的过程中,如何模拟人类的反应来做决策至关重要。

  1. 移动与导航。地图游戏中,移动成为必须。有大量的算法来研究如何智能地模拟人类的移动行为。

  1. 博弈AI。棋牌或者即时对战类游戏中,存在大量的博弈。近些年知名的AlphaGo就是其中的典型代表。

  1. 游戏内容生成。在引入工业化生产的现代社会,游戏内容也是一类快速消耗的产品。如何快速有效地生产丰富多彩的游戏内容,也引起了开发商的关注。游戏AI也能辅助开发者生产,如地图生成等。

  1. 数值平衡性。一些游戏的战斗中,往往涉及大量的技能、效果,互相作用带来了无穷的结果。因此用AI来辅助我们做数值平衡性的跑测,力求公平,避免产生致命的问题也很重要。

二、NPC决策:sense-think-act 模型

2.1 决策模型

设想一下,你设计的一款游戏里有一个NPC怪物,我们叫他小木吧:

在游戏开始后,小木应该怎么做决策,来决定接下来做什么呢?

对游戏有过了解的同学应该清楚,游戏内状态的更新和变化都是通过一个叫做循环的东西来控制的。小木身处这样一个循环的世界,要做的也就是自身不停的循环。

在每一次的循环中,小木需要经历三个阶段,我们称为 sense-think-act 循环模型:

  • Sense: 在这个阶段,小木需要探测周围世界中的信息,或者被告知周围世界中发生了什么事情。这些信息或者事情会影响它的行为。例如,有危险正在靠近,地上有物品可以拾取,或者受到了攻击。

  • Think: 小木需要做出决策,对上述的Sense做出适当的反应,比如应该战斗还是逃跑,亦或是拾取物品。

  • Act: 小木需要以上述决策作为目标,来具体实施。比如移动到某个低点,释放技能,或者做出拾取的动作。

每一次的循环中,都依次执行这个 sense-think-act模型,如此无限往复。

2.2 与通用AI决策的区别

需要注意的是,游戏内的AI 并不一定要做 “最优” 的决策,而是要有趣或者富有挑战性,要表现的很逼真,拟人,最优解并不一定是设计者需要的。所以类似 AlphaGo 这种超级智能的AI 并不符合游戏中实际的需要。

另外,最优解往往需要大量的训练或者计算,并不能满足游戏中大量AI 对实时性和性能的要求。所以 GameAI 和 实际机器学习中的 AI 还不太一样。

2.3 有关 Sense

很多游戏引擎中,会集成主动sense模块。如 UE4 中的感知(perception):

从图中,我们可以看到很多具体的感知:

  • 听觉

  • 视觉

  • 触觉

  • 团队感知

  • ...

在游戏中除了每一次思考时主动感知(sense)之外,往往还有另外一类感知:

对事件做出反应(responding to events)

在每一次的循环中,可以主动感知,每一次的感知间隔(循环间隔)可以是一帧,或者一次思考间隔的时间,如0.5秒。

正是因为有感知间隔,NPC决策往往不够实时。因此,还需要有对被动感知的处理。例如,NPC收到队友的呼救信息,受到攻击等等。通过对事件做出实时反应,NPC的决策才会更真实。

三、AI决策模型的实现

3.1 发展历程

对于决策模型 sense-think-act,其实现方式经历了一系列的演变。大致有以下一些方式:

3.2 基础决策

hardcode

如 hardcode 在代码中一个例子:球拍击球的小游戏AI:

every frame/update while the game is running:

if the ball is to the left of the paddle:

    move the paddle left

else if the ball is to the right of the paddle:

    move the paddle right

每一帧的循环中,对照 sense-think-act 模型:

  • sense 就是两个 if 条件。AI 在 if 中主动从 game 中拉取需要的数据:球是在球拍的左边还是右边。

  • think 也体现这两个 if 条件中,体现了决策分支,只不过是 hardcode 的方式,这几个分支是互斥的关系。

  • act 就是 move 的操作,会涉及具体的 move 实现,如设置方向和速度等。

配置表

hardcode的方式过于死板了,调整起来非常不方便。游戏中成千上万的AI如果都使用hardcode的方式来实现,基本是无法维护的。

如果使用数据驱动的方式,如配置表驱动,则要更方便,参数可以灵活调整,但是具体的决策项还是要提前通过代码实现好。

Script 脚本

配置的方式毕竟还是有不少限制。此时,我们可以使用脚本语言如 Lua,其可以实现更为强大的功能。很重要的一点是,它和配置表一样也可以热更新。这对开发调试,以及在线修复或调整AI的逻辑错误等比较重要。

3.3 高级决策

在基础决策实现的基础上,又发展出了一些更高级的决策方式,如状态机、行为树、Utility权重决策等,这一部分我们后面再继续阐述。

三、移动与导航

在前面的文章中,我们说明的是AI应用中比较典型的NPC决策模型。

而这里我们要讨论的另一大类,移动与导航,其实是上述决策模型中的 act,因为它非常常用,所以可以作为典型单独讨论。

移动会涉及到速度(velocity)的设置以及方向。在 think 环节,我们可以设置这个 velocity 或者设置其目的地或者追击的 target 等,然后在 act 环节做具体的 move。

导航在游戏中更为常见,涉及到一些经典的寻路算法如:

  • A* 算法

  • JPS 算法

  • NavMesh算法

这些算法如果要应用到地图导航中,还需要涉及地图如何表达的问题。这些我们也会在之后的系列文章中讨论。

关于AI在博弈对战、游戏内容的生成以及数值平衡性的使用,本人经验也不多,以后有研究成果了再单独分享。

有关游戏AI的综述我们就说到这里。

【参考资料】

The Total Beginner's Guide to Game AI

AI分享站

有关谈一谈游戏AI - 综述的更多相关文章

  1. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

    修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

  2. python - Ruby 或 Python 的 3d 游戏引擎? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion是否有适用于这些的3d游戏引擎?

  3. ruby - 使用 Ruby 编写 Unity 游戏 - 2

    所以我看到unity支持c#、JS和Boo。我可以学习其中一个,但我想制作一个“编译器”或类似的东西,让我可以编写ruby​​代码并输出JS代码或制作一个可以被Unity编译器读取的层。这有可能吗?我愿意在这方面投入很多时间并且有相当多的经验。 最佳答案 如果您的问题实际上是“我如何将Ruby编译为JavaScript”,那么这更容易回答:Opal:RubytoJavaScriptcompiler但是,学习其中一种受支持的语言会更好。当运行的是用另一种语言解释的代码时,很难调试“您的”代码。

  4. 【Unity游戏破解】外挂原理分析 - 2

    文章目录认识unity打包目录结构游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包建议方案锁血飞天无限金币攻击力翻倍以上统称内存挂透视自瞄压枪瞬移内购破解Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆实战查看目录结构用il2cppdumper例子2-森林whoishe后记认识unity打包目录结构dll一般很大,因为里面是所有的游戏功能编译成的二进制码游戏逆向流程开发人员代码被编译打包到GameAssembly.dll中使用il2ppDumper工具,并借助游戏名_Data\il2cpp_data\Metadata\global-metadata.dat

  5. Unity游戏开发:背包系统的实现 - 2

    背包是游戏中经常使用的一个组件,它负责管理玩家在游戏中所获得的道具。一个完整的背包系统应当具有将物品放置进背包、对背包内物品进行管理和使用背包内物品等功能。而往往一个背包系统的逻辑关系较为复杂,如果把所有功能都放在一个脚本中实现会使代码显得十分冗杂且缺乏逻辑。所以在背包系统的设计过程中,我们常将其分解为数据、逻辑和UI三部分分别来进行完成。一、UI设计以CottonPuzzle中的背包设计为例,我们需要有物品展示栏、物品切换按键和物品提示信息等部分。在Canvas中创建ItemHolder,在ItemHolder中创建LeftButton和RightButton控制物品的左右切换、Slot来控

  6. 未来的趋势————以ChatGPT为标杆的AI对生活的影响是巨大的 - 2

    文章目录前言1.AI的发展历程2.我是如何接触到人工智能的概念和产品的3.对于ChatGPT的一点看法4.AI对大学毕业生的职业发展的利与弊5.对于AI的思考和问题前言随着ChatGPT的爆火,生成式AI,大模型的人工智能被越来越多的人注意到,同时他也带来了许多问题。本文将对几方面进行探讨。1.AI的发展历程远古时期在公元前第一个千禧年,中国,印度和希腊哲学家都提出了一些推理的研究理论,比如亚里士多德(Aristotle)进行了演绎推理三段论的完整分析,欧几里得(Euclid)所著Elements是一种形式推理的模型,MuḥammadibnMūsāal-Khwārizmī,发明了代数学,即我们

  7. 焕新古文化传承之路,AI为古彝文识别赋能 - 2

    目录1古彝文与古典保护2古文识别的挑战2.1西文与汉文OCR2.2古彝文识别难点3合合信息:古彝文保护新思路3.1图像矫正3.2图像增强3.3语义理解3.4工程技巧4总结1古彝文与古典保护彝文指的是云南、贵州、四川等地的彝族人使用的文字,区别于现代意义上的彝文,古彝文指的是在民间流通使用的原生态彝文,多达87046字。古彝文的起源距今至少数千年,是世界上最古老的文字之一。对古彝文字集研究有助于理解尚未被翻译成汉文、用字尚未规范化的古籍,更深层、透彻地作用于传统文化保护。古彝文字义对照图(网络资料+邵文苑供图)古籍是不可再生的宝贵资源,应当得到妥善保护。中国的古籍在历史上迭经水火兵燹等自然灾害、

  8. 仍在积极维护的 Ruby 游戏框架? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭7年前。Improvethisquestion我发现很难调查使用Ruby进行游戏编程的选项。其他帖子和文章中提到的几个包装器和框架不再维护或使用。Gosu/Ruby似乎仍然活跃:官方论坛上的讨论一直很稳定。是否还有其他积极维护的ruby​​游戏框架?编辑:我发现使用MacRuby进行大量游戏开发。

  9. ruby - 基于 OOP 的文本游戏中的优雅命令解析 - 2

    我正在玩用Ruby编写MUD/文本冒险(请不要笑)。谁能给我任何关于解析输入文本的优雅的、基于oop的解决方案的建议?我们在这里谈论的只是“把魔杖放在table上”更复杂的事情。但是一切都需要柔软;我想稍后轻松地扩展命令集。我目前的想法,稍微简化一下:每个项目类别(盒子、table、房间、播放器)都知道如何识别“属于”它的命令。游戏类理解一种特定于领域的语言,涉及诸如“将对象X移入对象Y”、“显示对象X的描述”等Action。游戏类询问房间中的每个项目是否识别输入命令。先说是赢。然后它将控制传递给项目类中处理命令的方法。此方法重新表述DSL中的命令,将其传递回游戏对象以实现它。必须有一

  10. ruby - 此修改后的二十一点游戏的最佳获胜策略是什么? - 2

    问题有没有可以保持的最佳值(value),这样我才能赢得尽可能多的比赛?如果是这样,那是什么?编辑:是否可以为给定的限制计算出确切的获胜概率,而与对手的所作所为无关?(自大学以来,我还没有做过概率和统计)。我有兴趣将其作为与模拟结果进行对比的答案。编辑:修复了我算法中的错误,更新了结果表。背景我一直在玩改进的二十一点游戏,其中对标准规则进行了一些相当烦人的规则调整。我已将与标准二十一点规则不同的规则斜体化,并为不熟悉的人添加了二十一点规则。修改二十一点规则正是两个人类玩家(经销商无关)每个玩家面朝下发两张牌双方玩家_ever_都不知道对手纸牌的_any_的值在_both_完成手牌之前,

随机推荐