3评论

Unity简易AI设计思路

Pluto 2018-11-02 1.7k浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏开发行业精英群711501594

【参与Unity AI算法”征文活动】

人工智能是一个涉猎广泛的领域,与其复杂繁琐的定性相比,我个人认为,只要是非生命产生的有规则的运动都是人工智能。

在游戏领域,人工智能其实早就发展的如火如荼。

还记得小时候看我爸爸在电视上玩任天堂的红白机,超级玛丽里面的板栗和乌龟、魂斗罗里面的关底BOSS、中国象棋里面那个难度超高的老头……

这些使得游戏更具有可玩性的角色,都是由一行行的逻辑代码堆砌而成的。

超级玛丽

魂斗罗

中国象棋

游戏行业发展迅速的今天,利用到完善的游戏引擎,可以很轻松的就制作出这些游戏,但不能否认的是,这些游戏都为现在科技的进步起到了不可或缺的作用。

在那个卡带机容量只有几Kb的时代,不光是美术资源,每一行代码都得是经过反复推敲,最后编写成机械语言刻进卡带里。

追根溯源,机械代码无非就是一大串的壹和零的有序排列组合,而壹和零就又是代表了一个逻辑关系,开或者关,True or False

这也就说明,无论是程序本身,或者是某个敌人怪物NPC的人工智能,也都是一段逻辑判断。

最近有一款名叫《太吾绘卷》的国产游戏在Steam上卖的火热。

太吾绘卷

据传言,这款游戏的代码十分混乱,上万条if语句堆积在一个main函数里面,被称为逆天代码。

这里面肯定有夸张的元素,不过可以肯定的是,只靠着if语句也是能够完成一款游戏的。

游戏中的人工智能分为很多,从简单到复杂。

在游戏中,尤数RPG游戏的AI系统最为复杂,相比之下,FPS游戏和RTS游戏的AI要更为简单一些。

举个例子。

现在有一款RPG游戏。

玩家需要操作人物进入一家酒吧。

有一名叫做“小明”的NPC需要给玩家开门。

如果没有其他的先决条件,那么这个小明的人工智能就只是一条判断面前是否有玩家的逻辑语句。

虽然很简单,但不可否认,小明是具有人工智能的。

好了。

在玩家进入酒吧之后,可能会和小明产生对话,根据玩家说的不同话,小明需要做出不同的反应。

根据小明反应的不同,玩家会继续问出别的问题,然后小明会继续回答,直到玩家得出想要的结果。

这里的小明就不光会开门,而且还能和玩家产生一定范围内预先规定好的交流。

虽然玩家只能点选固定的话,小明也只能根据这些话产生对应的反应,但小明要更“聪明”了一些。

玩家看着小明商店里的东西很值钱,产生了盗窃的想法,小明作为酒店老板,怎么能坐视不管?你偷了我的东西,我不可能只骂你就算了,我还得把你赶出去,不然你还会继续偷。

突然玩家就和小明打了起来,若是玩家在远处朝小明射箭,那小明也不能傻乎乎的追过去拿刀砍,小明也得跟玩家对着射;若是玩家拿刀砍,那小明就得用盾牌格挡。

这样的话,小明又具有了战斗的功能。

一阵打斗之后,玩家败退,落荒而逃,小明决定放他一马,但记住了玩家的那张脸,只要他下次出现,就不给他好脸色看。

小明又拥有了记忆能力。

到此位置,这名叫做“小明”的NPC就已经很像一名正常的人类了,作为一名酒吧老板,他的工作已经够尽职尽责了。

小明身上挂载了几个较为大的逻辑判断点。

1. 玩家是否要进门。

2. 玩家跟自己说了啥。

3. 玩家是不是偷东西了。

4. 下次见玩家我该怎么办。

其中,每个大的逻辑点又可以分为更多的先决条件,比如要求玩家的等级必须达到100级才给看门、或者玩家偷的东西价值高于一千才还手。

如果小明是个无关紧要的角色,那他的活动到这里就可以结束了,若是小明是个关乎剧情发展的角色,那他身上就得担负起更重要的任务。

如果和玩家好感度过低会怎样?如果小明死了会怎样?

这些先决条件的判断,依靠的就是挂在在小明身上的每一项数据。

因为有了亲密度这一项数据,小明会对玩家做出的不同事情带有不同的反应。

亲密度低于30,小明会主动攻击玩家。

亲密度高于80,小明会主动给玩家送礼物。

数据划分档次越多,玩家就会感觉NPC越“聪明”,越像是一个真正的人类。

人工智能之父,图灵先生,提到过一个名叫“图灵测试”的实验,用于研究人工智能,虽然图灵先生并没有对通过这项测试的结果做出任何结论,但普遍认为,能够通过这项测试的即为一个合格的人工智能。

在游戏领域,尤其是单机游戏中,就算把小明的AI编译的最为出色,很多玩家认为小明的行为让人叹为观止,也不会有玩家认为操控小明的并非是一个人工智能,而是一个在现实中存在的人类。

Python是公认的最为适合编写人工智能的语言,稳坐数据分析的宝座。

Unity因为其易学性,学习成本很低,显然为了AI再系统学习Python是很不现实的,用C#编写就是很稀松平常的一件事。

就个人经验而言,用C#AI的时候,在写之前,要考虑到运行效率的问题。

如果单纯像是小明开门的一条简单逻辑,在激活状态时,写在UpDate中就行,就算每帧执行一次,对游戏运行的总体效率也不会产生太大的影响。

可如果小明“聪明”到了一定程度,对代码的运行效率就要进行一定的限制,这里有很多的解决办法,可以根据自己的需要对代码进行优化。

还是拿小明开门做个例子。

比如小明开门的时候,需要判断玩家当前等级、与自己好感度、是否处于被通缉状态、是否持有武器等等……这时候每帧执行就会影响游戏的运行效率。

不光是调整检测的时间间隔,更重要的是对小明逻辑判断的前后顺序,优先判断最难以满足的条件,若是不合格就直接跳出,余下的内容就可以忽略掉,以此往复,直到全部条件满足,才会给小明开门。

这还只是一个小明,如果有很多个小明组成的一个村落呢?

这时候,就需要小明们选举出一个“村长”,村长负责标准逻辑判断,比如是否处于通缉状态、等级是否达到了最低标准。

如同开枝散叶一样领导所有的小明,干路条件不通则全不通,支路条件不通,则单条支路不通。

像这样的逻辑嵌套和递归的累加,就可以构成一个简单的人工智能。