UE4 AI行为树(一)AI追逐玩家

如果觉得不会做,就多做几次就好了,之前参加比赛匆匆各种百度课程,虽然功能实现了但是行为树逻辑乱七八糟,昨天本来跟着中文文档做了一遍但发现莫名其妙AI 就是不动,于是又看了视频,最后二者整合起来,自己感觉很不错,哈哈~总之整理一下吧,有需要的大家可以看一下。

1. 准备工作

(1).AI使用UE4第三人称模板复制了一份
UE4 AI行为树(一)AI追逐玩家_第1张图片
(2)然后,重命名为EnemyCharacter后 打开蓝图
(3)在内容了浏览器里新建一个控制器,右键BluePrintClass ,z最下面AllClasses 中搜索AIController,选择后重命名为EnemyContrlloer 这个东西是之后把AI联系起来的关键。
UE4 AI行为树(一)AI追逐玩家_第2张图片
(4)打开EnemyCharacter 这个AI角色蓝图,删除EventGraph里所有逻辑,因为我们不需要对AI进行手动控制,同时删除组件里面的摄像机部分。最后将右侧细节面板中Pawn栏目下的AIController Class选为我们刚才新建的EnemyController.
到此准备工作完成,接下来正式建行为树、黑板等。

UE4 AI行为树(一)AI追逐玩家_第3张图片

2.创建黑板Blackboard和状态Enumeration

黑板相当于AI的大脑
artificial intelligence —blackboard,命名为BB_Enemy
UE4 AI行为树(一)AI追逐玩家_第4张图片
打开BB_Enemy 里面通过添加KEY来设置跟踪的内容 在detail里面选择内容的类型和他的父类
(1).object类型的父类为actor的key—命名:EnemyActor(这个是指对于AI 的敌人,也就是玩家)
UE4 AI行为树(一)AI追逐玩家_第5张图片
(2)vector类型的key,用来记录AI不追逐玩家时可以移动到的关卡位置,命名:PatrolLocation
(3)enum类型的key,用来规划AI不同状态 命名为:State

这里,至此我们目前需要的黑板的数值都建立完毕,接着我们可以先建立一个Enumeration 存储State状态,命名为:AIState
UE4 AI行为树(一)AI追逐玩家_第6张图片
(4)打开AIState ,添加两个状态Idle 和combat(此时不用截图了)
记得在黑板里的State的细节面板,勾选好EnumStype
UE4 AI行为树(一)AI追逐玩家_第7张图片

3.创建行为树

.行为树BehaviorTree–数据可视流
★★★★行为树 会从左到右和自上而下执行,因此节点的排列很重要
▶将行为树和黑板链接起来:新建行为树BT_Enemy并打开,右侧AI栏目下选择你的BB_Enemy黑板,通常此时默认就是这个。
UE4 AI行为树(一)AI追逐玩家_第8张图片
(1)从root 下拖拽选择selector 命名为:AIRoot(默认的Root:可用于配置行为树的属性并指定它所使用的黑板资源,而这个selector的root是行为树真正的“根”,它将在子分支之间切换)
UE4 AI行为树(一)AI追逐玩家_第9张图片接下来我们需要添加一个服务,点击后默认打开,我们需要重命名:BTS_Vision,这是判断AI是否看到玩家,我们这么想,AI无非就看到玩家追逐,没看到随机点巡逻。接下来我们进行该服务的蓝图逻辑编写。至此你终于可以写蓝图逻辑 了。

UE4 AI行为树(一)AI追逐玩家_第10张图片
(2)打开BTS_Enemy
首先我们找到Event ReceiveTickAI这个事件,然后添加事件内容。首先我们需要一个条件判断是否玩家在AI视野范围内,那么通常这个范围应该在AI前方的扇形区域,故而我们需要规范出这个区域,先规范出距离差:获取玩家的位置减去AI的位置(向量有方向,所以注意减数和被减数)然后Normalize归一化 ,距离有了以后,我们需要告诉AI 是他的正前方位置左右55度方向上的玩家被感知,详细见图。(其中dot属于向量部分,我搜索了一篇文章供参考:
链接奉上请自行点击)

[Nornalize:归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在某个区间上是统计的坐标分布。归一化有同一、统一和合一的意思。
归一化的目的简而言之,是使得没有可比性的数据变得具有可比性,同时又保持相比较的两个数据之间的相对关系,如大小关系;或是为了作图,原来很难在一张图上作出来,归一化后就可以很方便的给出图上的相对位置等。]

UE4 AI行为树(一)AI追逐玩家_第11张图片
(3)后面连接是判断语句,也就是Branch分支,条件就是我们刚写的上面的逻辑,如果条件成立,也就是AI感知到了玩家,那么我们将对黑板里的数值(object 和 state进行更新)
需要建立两个公共变量 EnemyActor和State 名字对应之前黑板里的变量名方便使用,其类型均为:Blackboard Key SelectorStructor.
在这里插入图片描述
如下图连接:
UE4 AI行为树(一)AI追逐玩家_第12张图片
(4)此时基本BTS_Enemy写完,我们来到行为树,给AIRoot添加该服务(注意服务里对应都勾选好,截图里面State笔者当时马虎了,造成后面AI一直跟着我,太可怕了~)
UE4 AI行为树(一)AI追逐玩家_第13张图片
注意右侧细节面板对应选择好:
UE4 AI行为树(一)AI追逐玩家_第14张图片
然后下面添加任务Move To
UE4 AI行为树(一)AI追逐玩家_第15张图片
(5)下面我们行为树需要调用起来,那就是打开我们之前说的关键的蓝图控制器EnemyController:
如图:UE4 AI行为树(一)AI追逐玩家_第16张图片
到此,你可以测试了。你会发现你的AI很恐怖的一直追随你。

4.AI追逐和跟丢目标

(1)首先我们考虑,AI 看到我们后要转向我们,然后追我们,这个行为肯定和他巡逻的时候是不一样的,所以我们需要修改AI 的Max Walking Speed 的数值,你可以直接修改,也可以写一个函数方法。
写函数会比较规范,我们下面打开EnemyCharacter 新建一个函数UpdateWalkintSpeed.编译后给他一个输入值 UpdateSpeed,然后引脚set max walkingspeed ,修改这个函数的对象为组件最下面的characterMovemnet
如图
UE4 AI行为树(一)AI追逐玩家_第17张图片(2)然后打开行为树,我们需要在AIRoot下面添加一个sequence ,然后给Sequence添加装饰器,也就是一个判断的条件,如图添加黑板装饰器
UE4 AI行为树(一)AI追逐玩家_第18张图片
(3)新建一个task :BTT_ChasePlayer用来设置追逐速度,请看图吧
UE4 AI行为树(一)AI追逐玩家_第19张图片
UE4 AI行为树(一)AI追逐玩家_第20张图片
然后继续添加我们刚才新建的一个任务追逐速度的任务BTT_Enemy 和move to 如图:记得把BTT_ChasePlayer里速度自己按需求该数值。
这里是这样的:AI 先进行一个状态选择,因为我们没有写巡逻,所以只有战斗状态一条分支,当AI感知到玩家后,先转向玩家,然后更新速度,最后跑向玩家,一旦玩家逃出AI的追逐范围,AI又变成闲置状态。
UE4 AI行为树(一)AI追逐玩家_第21张图片
这里多加了一个转向,我们就还需要在enemyCharacter里面勾选。

UE4 AI行为树(一)AI追逐玩家_第22张图片
最后注意把StateIsCombat这个Sequece设置为Self.此时就真正实现了AI追着你跑和跟丢后静置了。

之后会继续写AI巡逻,今日宝宝实在累啦,休息啦~~~
那个normalize我还百度到一个视频,大家想看就看吧视频点击

你可能感兴趣的:(UE4,蓝图)