游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2500|回复: 0

深度强化学习的人工智能在游戏中的运用:游戏AI入门及AI优化指南

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2020-3-5 09:44:04 | 显示全部楼层 |阅读模式
1.jpg


前言:

现如今,所有电子游戏都离不开AI的运用,对于游戏策划而言AI是什么,AI又是如何运作,可以说是面试时的加分项,本文在这里不探讨理论的AI(采用深度强化学习的智能AI,如腾讯AI Lab、网易伏羲AI等),旨在分享现游戏领域广泛运用的AI,给新人策划针对游戏AI、游戏脚本有一个初步的了解。

(本文接下来不包括AI底层代码,AI工具开发等程序向内容,该部分在网络上已经有很多教程大家可以去学习,个人认为策划对于底层AI的具体实现是不需要了解的,而对于AI制作与优化是需要学习的。)

2.jpg
本文的具体结构

一、AI的应用场景

人工智能开发是游戏研发中最具挑战性的任务之一[1],那么游戏中AI的具体使用场景在哪里呢?

3.jpg
英雄联盟里怪物战斗AI、场景AI(作用于野怪刷新)、人机挑战中机器人战斗AI

除了大家熟知的LOL,3A大作里AI一般运用到哪里呢?

4.jpg
巫师3中的NPC AI,怪物AI等AI运用基本可以囊括现有AI的运用场景

从上面举的两个例子,已经可以看出现在制作游戏离不开AI。

二、AI通过什么方式进行设计?

现有游戏AI基本通过下面两个方式进行实现:行为树(Behavior Tree)与有限状态机(Finite State Machines),那么下面我们就对于这两个实现方式进行探讨。

2.1 什么是有限状态机

“状态机”是一种表示状态并控制状态切换的设计模式,常常用于设计某种东西的多个状态。而有限状态机是指游戏内的条件逻辑封装到各个状态类里。例如一个人有站立状态,跑动状态,走路状态,蹲下状态,开火状态等[2],当一个事件发生,将会触发一个动作,或者执行一次状态的迁移。

但却有两个缺陷:

1. 各个状态类之间互相依赖很严重,耦合度很高。

2. 结构不灵活,可扩展性不高,难以脚本化/可视化。

下图是游戏中怪物入战的有限状态机,如果我们想对攻击敌人/追击敌人状态进行修改,是需要程序给我进行状态类中内容修改的。

5.jpg

那如果我们可以把本来的巡逻、追击敌人、攻击敌人等状态先进行更细分的封装,是不是更好呢?那你就可以见到状态机如下图一样的混乱,后期的维护基本很难进行。

6.jpg

结合前面两种情况,我们又可以发现,使用有限状态机,策划不能充分参与其中,只能由程序员来完成,这会增加程序员的工作量。

综上所述:在游戏开发中使用状态机显然不失为一种选择,首先它的概念并不复杂,其次它的实现也十分简单而直接,所以当一个简单的npc所需AI,使用状态机是完全可行的。

但它的缺点却也十分明显,例如难以复用,因为它往往需要根据具体的情况来做出反应,当然当状态机的模型复杂到一定的程度之后,也会带来实现和维护上的困难。

而现在行为树比有限状态的几个优势:

1. 行为树提供了强大的灵活性,很容易更改行为树的结构,也易于后期的维护与扩展;

2. 在程序开发了元件后,逻辑层面全部交给了策划,减少程序员工作量的同时,让策划也可以进行AI问题的初步排查。

正好弥补了我们上面所说的状态机的缺点,那么接下来我们就着重介绍行为树吧。

2.2 行为树

行为树就是一棵节点层次分明的树,控制着AI物体的一系列决定。从树延伸出的叶子节点,执行控制AI物体的指令。各种工具节点组成树的分支,来控制AI指令的走向以形成一系列的指令,这样来满足游戏需要。

它可以是一棵很高的树,可以具有完成特定功能的子树,开发者可以创建行为库并把它们适当地连接起来以达到非常真实的AI行为。开发过程是高度可迭代的,你可以先排出一个基础的行为树,然后创建新的分支来处理各种达到目标的可选方案,这些分支按照它们的优先级排列,这样AI在一个特定的行为失败可以回溯到另一个策略,这是行为树巨大优势所在。[3]

现在的很多项目就是Lua做逻辑开发,下图分享一下项目中使用的Lua版本行为树。

Lua行为树执行上图状态机的相同AI功能:

7.jpg

如果对于上图,一个简单的行为树看不懂的话,可以阅读行为树的工作原理:

AI 行为树的工作原理

在例子中,行为树的优点是逻辑直观、一目了然,策划可以借助工具直接配置,不需要程序介入。而缺点则是树分支数量庞大,每次遍历寻找合适节点的过程消耗高。

三、如何优化AI中的设计

如果仅仅只是讲述前面两点事实,这篇文章就没有什么意义,接下来分享一些自己对于AI方面的经验,也希望在你优化AI的时候,这一部分能够起到帮助。

3.1 NPC AI

在RPG游戏发展的过程中,NPC摆脱了原本傻站原地,无脑发放任务的基本模式,融入了各种各样的AI来丰富行为,《巫师3》中,白天开业的商人,巡逻街道的卫兵;《刺客信条》中,围成一团的群众,穿梭街道的小孩;《如龙0》中让玩家印象深刻的勒索哥等等,这些游戏中NPC AI的加入让整个游戏世界更加的真实,也让玩家的沉浸感有着质的提升。

拿《逆水寒》NPC来举例:

1.天气影响:下雨时,NPC会自己打伞,或奔跑到屋檐下避雨,天气放晴又会自动收起雨伞。

8.jpg

2. 互动:撞击NPC可以触发奇遇,与NPC好感度不同所进行交流的内容不同。

3. 行为:NPC有自己的活动路线,他们有自己的生活区域。

其实在NPC中还有很多其他的内容,更多的天气感应、更多种类的职业配置,工作任务配置等等,都是让游戏内场景显得更鲜活的方式,在AI中实现NPC具体的功能很简单,这里我们分析一下在AI拿到相应的行为前,是如何判定的。

NPC行为类型可以为两类:

1.外部互动(玩家进行碰撞NPC等)

2.系统变化(天气、时间等的变化引发NPC行为变化)

而一个NPC的智能行为过程主要分为三步:

1.事件触发检测

2.触发响应得到候选的可执行行为

3.决断出最终行为并通知AI

事件触发

外部互动行为本身就是一个事件,所以当客户端上传外部事件消息时,直接处理就行了。

系统变化是一个值变化事件,例如天气值从原来的1(晴天)变为现在的4(小雨),这时系统特征变化事件被触发。

触发响应

1.优先级高的行为触发时,将打断当前正在执行的低优先级行为。

2.优先级相同的行为触发时,根据设定的行为类型优先级进行判定,如躲雨被撞击,触发外部互动。

3.当前帧在触发过程中产生的新的触发,会在下一帧执行,防止循环触发。

行为决断

通过触发响应,得到了对应的候选可执行行为,此时我们就需要根据当前状态得到最终执行的行为:

1.排除与当前正在执行的行为互斥的行为(行为互斥机制)。

2.优先挑选可持续的行为。

3.进行行为的更新。

在这样一套流程下来后,AI就可以拿到NPC相应的Action,而具体需要触发喊话,还是打伞,躲雨等动作,简单的写出行为子图即可。

3.2 机器人AI

机器人AI,在这里不是指传统Robot的AI,而是指游戏中各种活动需要,而生成的玩家镜像机器人的AI。

在制作机器人AI,首先要知道机器人AI设计的主要目标:

◆ 模拟玩家进行对战,用于PVP破冰和体验提升。

◆ 新手过渡,让玩家体验活动时,培养成就感,避免尚未熟悉游戏导致的挫折流失。

◆ 陪伴玩家,用强度合理的AI来陪伴玩家参与活动,减少玩家单人参与的有损体验。

那么机器人AI所需要参考的具体内容是哪些呢?

如果按照功能点维度,游戏中运用到的机器人战术一般分为三种:

◆ 单体战术AI——AI的战斗细节

◆ 事件响应AI——AI对于事件的响应

◆ 协同战术AI——AI能够互相配合

而机器人本身一般需要涵盖以下特性:

◆ 流畅性——技能释放与衔接,追击与逃跑等战斗效果。

◆ 拟真度——符合常识的PK反馈,让玩家没有违和感。

◆ 环境适应——机器人能够适应游戏内不同情境/活动的需要(机器人的广度)。

◆ 难度可调——机器人的难度(战斗能力)可调(机器人的深度)。

那么你具体的优化方向就可以往三种战术、四种特性上扩展,以《英雄联盟》与《逆水寒》为例:

《英雄联盟》[4]

单人战术:濒死逃亡,当电脑在较低血量会逃走。

事件响应:尾刀响应,玩家残血时,电脑会感知到,并使用全图技能进行攻击;推塔响应:玩家推完一塔后,二塔电脑玩家都会响应前来防守;换线响应,上路机器人来中路补线的时候,原本中单机器人会前往上路。

协同战术:Gank行为:电脑帮助其他线玩家进行多打少局部战斗。

在上面的三种战术的具体实行中,单人战术大多仅需简单的配置,而像事件响应与协同战术需要更丰富的底层机制去支撑,一个协同战术就需要:Group机制(可以通过发送Message来控制)、目标选择机制、追击与逃跑机制等的支撑。

《逆水寒》

虽然逆水寒机器人是深度学习AI进行控制,但其表现仍然可以用在很多先用的MOMORPG之中。

9.jpg
逆水寒机器人中一些出彩的机器人AI

以上就是机器人AI部分的分享,具体机器人AI的Lua行为树该怎么写,这个反而应该是很简单的存在,并且所需篇幅较长,这里就不再拓展。

3.3 怪物AI

怪物AI整体的含义很宽泛,这里不做过多的设计方面的分享,有太多的关卡/战斗策划有自己的真知灼见,这里就不献丑,只在AI逻辑中进行一个分享。

前提:一个分为简单、困难两个难度的BOSS,拥有普通攻击1、技能2,50%血量触发的技能3,困难模式30%血量才有的技能4,撰写简单的Lua行为树。(你可以思考一下打开的行为树逻辑方式,甚至自己写一些具体几个节点的框架)

下图,是上述BOSS AI子图中的一部分,这里为了方便阅读并理解其中逻辑含义省去了很多重复的逻辑元件运用(castSkillAll应该为一张子图,这里就简单合并为一个元件)。

10.jpg
一个简单的BOSS AI子图

在上图中,需要注意以下几点对你撰写AI子图会逻辑清晰以及方便很多:

1.returnBattle,在我们平时撰写AI中,我们总会把线迁回到一开始,完成一个闭环,让整个怪物AI循环起来,这样做法没有错,但是循环再复杂BOSS本身会造成难以阅读、修改等成本,让程序直接创建一个回到战斗的元件,整个流程图线性铺开,十分利于阅读。

2.putNewAction,有的怪物AI会把不同血量怪物掌握的不同技能再写一遍,这样的作法十分冗余,也让AI逻辑不利于阅读,利用插入优先行为的形式,在技能达到触发条件时,插入到怪物的技能列表里,让整个怪物逻辑更加清晰。

3.SkillFlag,起到的是保护作用,设置这样一个参数,是为了当新技能不会被重复加入,第一次加入技能后,该参数自动变化,后面不会再插入该技能。

当然,在怪物 AI的子图中还有很多小细节需要注意,但篇幅有限,仅先展开到这里。

四、深度强化学习的人工智能在游戏中的运用。

这一部分仅仅作为简单的分享,本人也并没有制作深度强化学习人工智能的能力,在与该类AI合作的过程中,能够知道现在这类理论AI在游戏中能运用到什么水平。

4.1 深度学习的应用场景

深度学习机器人需学习、调整3个月左右(参照简单RPG角色,时间受角色信息、样本数量、场地因素等等多方面限制),能够达到单人优秀玩家的水平。

11.jpg
如果想见识AI能达到的水平,可以参考逆水寒的流派挑战

至于简单的多人合作也可以做到,但是复杂场景中理论AI的运用会受到很高的局限性。

所以AI在游戏中以Lua行为树的形式存在应该还要很久,当然你也可以采用理论AI配合脚本AI的形式,所有玩法形式都由脚本控制,载入战斗状态时调用理论AI即可。

PS:本文只是浅度分析了一下游戏中的AI,具体AI的设计还是需要你自己接手项目,频繁练习后方能有更深的感触,这里也只做抛砖引玉,欢迎坚持阅读到这里的朋友们在下方评论交流~

参考


[1]《游戏人工智能》
https://baike.baidu.com/item/%E6%B8%B8%E6%88%8F%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/22147006?fr=aladdin
[2]游戏状态机
https://www.cnblogs.com/KillerAery/p/10003678.html#有限状态机fsm
[3]AI行为树的工作原理
https://www.gameres.com/846263.html
[4]MOBA英雄AI设计分享
https://cloud.tencent.com/developer/article/1146677

作者:泪的天堂
专栏地址:https://zhuanlan.zhihu.com/p/82567889

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-11-22 01:00

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表