米游社 · 原神

【小黄鸡的内鬼时间】科普向/大量文字/基于游戏引擎的AI解析

来自版块: 酒馆
11245
278
2529
296
文章发表:03-25 最后编辑:03-27

基于unity的AI行为树解析




    各位旅行者们大家好呀,这里是小黄鸡,原神二测已经有一段时间了,很多大佬们也已经推出了各式各样的Boss攻略,但知其然更应知其所以然,我们通过大佬们的攻略,知道了Boss的技能以及攻略方法,但我相信,也有旅行者们希望通过自己的力量来攻略Boss,以达成满满的成就感。




    今天,小黄鸡将用自己作为unity相关从业人员(内鬼)的知识,给大家讲解一下游戏中AI的行为逻辑,希望大家看完以后,能够在攻略Boss的时候,能够更加理解Boss的行为,从而找出相对应的方法去攻略TA们。




    当然,我们这里只谈AI的行为逻辑,不谈各个Boss的机制问题,例如无相家族们最后阶段的回血等这种设定。




    好的,让我们进入今天的内鬼时间吧!




    在unity游戏引擎当中,最常见的AI行为的控制是两种,一种叫做控制机,另一种叫做行为树,而这两者中,行为树的设计方式更适合大批量以及复杂行为的AI的设计(个人经验),并且行为树具有更加清晰的逻辑可视性,所以,本篇文章将会基于行为树来为大家讲解Boss的行为逻辑。




    行为树,正式名称:Behavior Designer(行为设计器),在unity当中所表现的则是一种树状图



程序员们通过里面自带的逻辑节点,将各种脚本连接起来,组成一个AI完整的行为逻辑。当游戏(程序)运行的时候,这些AI将会遵从这个行为树来进行相应的行为活动,所以说,其实Boss,都是“死”的,再厉害的Boss,也只是遵循代码逻辑进行活动的,而我们玩家想要攻略TA们,则需要去探索和理解他的行为模式以及TA的设计者的想法。



或许上面的介绍让你有些云里雾里,接下来,我会来用最简单直白的话来告诉大家,AI行为的基本准则,掌握了这些准则,在应对Boss的时候,相信大家会更从容,至少不会因为搞不清楚Boss的下一步动作而白给。



AI的基本行为:




1.定点巡逻/原地待机


这里很好理解,当Boss没有进入战斗的时候,基本上就是保持这个状态,当然,这里要排除类似风魔龙这种一上来就进入战斗阶段的Boss。

该图中小怪们的待机分别为睡觉和观望(此外还包括尬舞,打坐,烤史莱姆等一系列待机行为, 这就是AI们的私生活状态)


2.寻找玩家


当Boss原地等待或巡逻的时候(例如野图Boss),他们同时是在进行着寻找玩家的行为,可以理解为Boss是否看见或者听见了玩家接近,在行为树中,存在视野判断与声音判断的节点,这种节点的功能就并非直接计算玩家与自身的距离,而是一个区域范围,如果玩家进入这个区域范围,则Boss的行为树将会获取到“玩家”这个物体,如果获取到了玩家,Boss将会进入设定的下一个阶段。但是就是因为这个区域的存在,所以Boss们存在拉脱的机制。

这里就是AI发现来玩家,立即从待机状态进入了战斗状态,可以看出,是存在一定距离的,当玩家到达这个距离的时候才会触发。(在被打的边缘疯狂试探)


从图中可以看到,当玩家在Boss观察范围外将Boss激活后,Boss并没有找到玩家,此时Boss就处于:收到攻击->开始战斗->获取玩家坐标->没有玩家坐标->获取玩家坐标.....这样的循环中,最后在逻辑保护机制下,重置了Boss的所有状态,同理,玩家跑的过远的时候,也是这样的。


3.攻击玩家


这基本上上就是Boss们最主要的行为了,攻击玩家,基本上Boss的行为就是,找玩家->找到玩家->攻击并消灭玩家,这个也是整个Boss设计当中最主要的部分,而这个部分最重要的就是攻击动画,也就是玩家们所看见的Boss的行为(跳击,劈砍等),因为Boss与玩家之间的伤害判定等,都不需要从这里面控制,甚至Boss与玩家的碰撞(无敌帧/无效帧)的控制可以直接在动画中控制,所以不需要在这里设置。而我们要考虑的,就是看清楚TA们的这些动画并记住(前摇,技能这些东西)。

这里看见,我在小怪举起武器的时候离开来原地,而小怪的落点就是我再TA举起武器时候待着的地方,这个举起武器就是大家常说的前摇,我们单从图里的情况来说就是,过去玩家坐标->攻击(表现形式为:跳到玩家所在位置后向前挥武器)


图中就是Boss对玩家坐标进行攻击的例子,但是这里我要提出一个坐标点的另一种运用,向量,不知道向量的旅行者们可以单纯的认为是一个有方向的量,图中Boss在获取玩家坐标后,并非直接射到玩家所在坐标,而是给了发射物一个向量,方向则是玩家所在的方向,所以我们能看到,后面几发飞弹没有撞击地面而是飞过去了。我们熟知的龙车(怪物冲向玩家)就是标准的使用向量进行引导的。


4.死亡


是的,就像许多英雄故事一样,反派最大的作用就是死亡,用TA们的死亡来成就英雄的事迹。Boss们被设计的初衷也是,被玩家打败,当行为树中判定Boss已经死亡或者战斗结束,则Boss也将停止TA的一切行为。


死亡判定是最优先,每次进入下一个节点的时候都会进行顺序检测,所以,只要判断死亡,无论做什么都会终止(特定死亡后的操作除外,那属于设定,比如死了以后自爆什么的)



    以上四点就是AI设计的最基本的四个要点(你这不是废话吗,谁不知道啊,问题是我还是打不过,被Boss按在地上摩擦呀),讲完上面AI设计的四个基本要点后,我来给大家从代码的角度来讲解该如何去理解这四个要点。




    首先,我要告诉大家这四个点的优先级:死亡>攻击>寻找>待机


    这四个点的判定方式就是,当上一级不成立时,进行下一级的行为,通俗的说就是


    设计师:死了吗?


    行为树:没死。


    设计师:在打吗?


    行为树:没打。


设计师:看到玩家了吗?


行为树:没有。


设计师:那你待着吧。



死亡的判定很多,常见的就是Boss血量归零,这大家都知道,待机也是没什么特别需要说的。我们来重点说一下寻找玩家与攻击玩家。



在说这两点前,我需要告诉大家,推动这一切的——坐标



在unity中,任何东西,包括UI都是有坐标的,而Boss寻找玩家也是获取了玩家的坐标,Boss的逻辑就是,获取玩家坐标—>对坐标或坐标所在方向进行攻击行为(划重点!!)



Boss不是在攻击玩家,而是攻击玩家所在的坐标点(无差别AOE除外,例如无相之风的三次冲击,无相之雷的激光和地上波动,无相之岩的王之宝库),Boss的一切行为都是以玩家的坐标点为前提而行动的,具体TA在这个坐标点做什么,那就是需要玩家记住的,毕竟每个Boss不一样。


我给大家举一些例子:

无相之雷的激光:


无相之雷的地脉(先上DJ!先上DJ!):


无相之岩的王之宝库:


无相之风的龙卷风:


类似以上的都是不以玩家坐标为考虑的攻击行为方式,也可以叫地图炮。


但是,在这个Boss只针对玩家坐标点而非玩家本体做出行动的前提下,我们可以知道,远离TA获取的坐标点=躲开Boss的攻击。(这不是废话,玩了这么多年游戏,我们会不知道躲开Boss攻击吗,我们还知道闪避能躲开Boss攻击呢)闪避能躲开Boss攻击,闪避或某些技能存在无敌帧,但是原理我会在下一期单独谈“有关unity的碰撞知识”。



好了,现在我们知道了Boss的行为逻辑顺序,知道了Boss的行为目标,那最后,我们再说一下,行为树的运行逻辑吧。



行为树节点的运行顺序是:从上至下,从左至右


这里我用自己写的一个只会冲撞的AI的行为树进行讲解:


注意:图中的12345则是执行顺序,其中2和3这个节点大家可以这么理解,2节点代表:只要下面节点中,有一个节点告诉说:我成功了,那么2节点就告诉1,我成功了;3节点则是只有下面节点全部成功了,3才会对2说:我成功了。否则为失败。



现在,在以上三个知识点的基础上,我给大家举一个例子,让大家知道,当我们了解了一个Boss的行为树时,有多可怕。



在《只狼》这款游戏中,有一个名叫狮子猿的Boss(不清楚的可以去B站搜一下“狮子猿无限连”),当我们进入TA的范围内时,TA会起身面对我们,这时候TA的判断就是:没死,没进入二阶段,发现敌人,开始攻击。但是TA的机制导致了我们在一次性给足伤害让TA进入一个“低头”(僵直)时,TA开始判断“是否受到三次攻击”,如果受到了,则执行一个后翻的躲避动画,如果没有,则继续正常攻击,而无限连的关键则是不打出第三下,这对于普通玩家而言叫机制,而对于我的理解,这叫行为树判断死循环,揪出行为树漏洞加以利用。(当然,我没有自大到去说《只狼》对于这个Boss的设计有漏洞,毕竟游戏分量摆在这里,我也只是借来帮助大家理解,还请不要误会,尤其是狼学家们别喷我,我也是双难白金玩家,一家人,一家人)。



是的,当我们充分理解了以上三点以后,在排除Boss特殊机制的情况下,我们能够很好的理解Boss的下一步是要做什么,即便探索过程中我们一次次白给,但是,TA的行为有限,大不了多白给几次,我相信很多玩家都能很好的攻略Boss。



以上,便是这次小黄鸡带给大家的,用游戏引擎的开发角度来看待Boss攻略的理解,非常感谢你能看到这里,或许本文还是会有些比较难懂的地方,但我相信,能够有耐心看完的小伙伴,一定会有所收获,如果还有什么疑问,欢迎在评论区留言,我也会尽力为你解答,如果有什么错误也欢迎指出,谢谢。

2529
296
看帖是喜欢,评论才是真爱:
  • 全部评论
  • 只看楼主
排序:热门
管理
看不懂,感觉和代码一样
03-25
回复
60
举报
因为还是属于科普向的,可以试着慢慢理解,这里其实更多的是一种逻辑啦~
回复
1
看不懂可以和我一样点完赞就走。
回复
1
管理

那么问题来了,我在遗迹遇到的牛头人不止一次的回到出生地点回满血是怎么回事呢

03-26
回复
35
举报
超出它的查找范围了吧,那么就会停止攻击,然后回去,然后回血
回复
3
举报
是不是你打他然后他不打你,打掉一定血之后回到原处他自己又回满血了?
回复
1
查看全部 16 评论 >
管理
表面知识分享
实则新一期开发者共研计划
03-26
回复
35
举报
回复
0
大概看懂了,可是c#对我还是有很大难度的
03-26
回复
25
举报
其实这个和C#没关系的,真的不是代码,就是把一堆节点用线连起来的,关键是逻辑
回复
0
管理
眼睛:我懂了,大脑:你不懂
03-25
回复
21
举报
细细品啦~逻辑很重要哦~
回复
0
管理
嗯以前不懂,看帖总是不回。一直没升级和增加经验,现在我明白了。反正回帖就可以升级,还可以赚经验。升级又需要经验,于是我把这句话复制下来。遇贴就回,捞完就闪。不要说我氵,动动您的小手,点个赞或者回复一个小表情啦,回复的我都会点赞的。拜谢
03-27
回复
15
举报
那我就来了
回复
1
举报
回复
1
查看全部 3 评论 >
管理
03-26
回复
18
举报
回复
0
管理
有一说一,我觉得原神的怪物都有点憨,和这些逻辑树有关系吗?
03-26
回复
15
举报
有关系,其实就是攻击间隔,上一次攻击和下一次攻击之间有一个延时,这个延时如果时间长怪攻击欲望就低,如果时间短怪的攻击欲望就强
回复
1
举报
你所谓的有点憨,就是因为他们的行为树简单,判定条件少
回复
1
查看全部 3 评论 >
管理

很有意思哦!

03-25
回复
17
举报
谢谢~
回复
0
万能的碰撞体
03-25
回复
15
举报
其实不是啦~大部分boss们的攻击,更多是触发器,要是碰撞,超容易出问题(至少我是这样的,碰撞物体乱飞😂
回复
0
管理
眼镜:你看看,懂不?
大脑:????不不不,不懂
03-27
回复
11
举报
回复
0
管理
666不过
03-26
回复
9
举报
不过什么呀?
回复
0
举报
不过我没内测资格
回复
0
查看全部 3 评论 >
管理
你就是内鬼?
03-25
回复
9
举报
回复
0

03-25
回复
8
举报
回复
0
04-01
回复
3
举报
1
回复
0
举报
回复
0
查看全部 4 评论 >
管理
斯~哈~
是大佬的味道
03-27
回复
5
举报
不是鸭
回复
0
管理
一看就是高深的东西不是我能看的懂的更不是我能学会的
03-27
回复
3
举报
是可以的鸭!
回复
0
管理
补充02:
原神里面的怪物寻人ai和攻击决策ai会考虑到z轴,也就是说,怪会跳起来打你(虽然也没什么用就是了)
再补充上一个补充,怪物活动范围似乎是圆形的而不是球形的,如果你在山崖上面惹了一个怪,他会自动寻路爬山上来找找你,当然被卡地形的概率更大
03-30
回复
1
举报
这里其实还涉及一个东西,叫做“导航面板”,TA没有爬悬崖上来打你,大概率是因为导航面板没有铺设到悬崖这个面上,在unity里,至少我使用的行为树来设计的时候,是需要导航面板的;可以这么理解:导航面板≈AI被允许的行动面:从unity的行为树的实现来说,是可以球型的。
回复
0
举报
还有,你说的应该是Y轴,这里的xyz和初高中学习时候的画法不一样哦~(一般情况是y上下,x左右,z里外),如果还在上学的话请忽视,避免影响你学习时的认知~
回复
0
管理

小黄鸡这么骚,可以去B站当up主给我们讲解这一类的知识嘛

04-02
回复
2
举报
程序员时间不是很允许文字的话可以慢慢码字
回复
0
管理

耶斯莫拉

03-27
回复
2
举报
回复
0