迈布-----UE4AI自动巡逻与攻击

这个行为树给我恶心的都想吐,我用的是4.24,跟着官网做达不到那个效果,跟着视频做也达不到那个效果,跟我弄的非常不耐烦,最后终于在今天整出来了。有的地方用了一下我自己的逻辑。//诸位依靠教程的,一定得自己动脑思考,锻炼独立编码的能力,不要“过度”依赖教程,要学会举一反三

我用的是第三人称模板

OK,我来给你从1讲到8,其中一个没啥用

首先第一个,是行为树里面的一个服务,

ps:若不知道行为树服务是什么的话参考官方文档:https://docs.unrealengine.com/zhCN/Engine/ArtificialIntelligence/BehaviorTrees/BehaviorTreesOverview/index.html

里面的逻辑我当你说一下,获取玩家坐标,AI坐标,玩家到AI坐标相减画一条线,最后合一,好像叫什么Nor......,我们就记他Nor,这个是合一向量的,

之后去前方坐标,Forward,这两个东东点乘,也就是dot,然后去反余弦值,判定,是否在55°角之内,设一个if分支

如果是,则说明看见玩家了,采用追逐(Attack),如果没有,采用不追逐(Idle)

ps:若不知道点乘:https://blog.csdn.net/kebu12345678/article/details/80724336    这个博客可以参考一下。

第二个,黑板,节点:TargetActor,Object类型,底下要设为Actor;枚举类型:目的是定义AI攻击还是不攻击(巡逻),两种状态,Idle,Attack,均为枚举类型

那么第一个蓝图,行为树服务蓝图就可以设置黑板值了,蓝图SetBlackBoardASObject,新建一个变量,类型为BlackBoardKey,名字TagetActor,把它和蓝图SetBlackBoardASObject键值连上,还有个Object就是GetPlayerCharacter,我是凭记忆写的不一定正确,把它和Object连上。

设置枚举,SetBlackBoardAsEnum,枚举在黑板上确认使用上图第5个,也就是AI_Enum,枚举选项选择那个Attack,不是idle。因为已经发现玩家了,应该是攻击

忘了说了第一个一开始调用的是 事件 Tick AI,我是凭记忆写的,每秒更新AI,

在if那个false分支上,重复上面的,调用Idle,好像还有个事件,再次调用AI,好像是A打头的,事件  A......   AI......

在那里再调用一遍SetBlackBoardAsEnum 值为Idil

在这里设置速度,因为我是默写,所以把思路写下来:

首先先GetMovementComponent,castToMoveComponentCharacter,SetMaxWalkSpeed,

我头疼就头疼在这儿,因为我一设置单独的速度task,或者函数,寻路就不成功,所以我把它给设置到服务里了。

这个是行为树,我追逐玩家和巡逻的行为树,

第4个,控制蓝图,一定要把AIcharacter类里面的AI控制改为这个我们新建的AI控制,我这个是AI_Controller,设置的话在组件图标中最上面的,细节面板应该能看到,第8个就是我的character,我把第三人称那个给拷贝了一份,然后清空里面的事件。摄像机和弹簧臂我都给删了。

控件蓝图需要写一个EventBegin,就是默认三个事件中的最上面的那个,让RunBehaviourTree与他连接。

别忘了把BehaviourTree设置为我们新建的Tree,我这个是AI_BT,蓝图节点有选项的,选择我们建的蓝图就可以了

第6个巡逻,我不写了,太累了,上图讲一下重点。

主要用到MoveToLocation,移动到坐标,下面的三个是检测移动成没成功,成功后,FinishExcute结束事件,我觉得没有必要,直接一个结束事件得了

ReceiveExcuteAI,这个节点是此任务运行时,就是行为树指到到你这个任务时出发的,上面4个是设置速度的,那个GetRandomLocation...的是获取随机坐标,

我直接用ActorLocation。

上面那个树节点MoveTo是移动到,选择器上的装饰器设置如下:

开发一定要自己动脑,不要“过度”依赖教程

后记:Nav...mesh打头的在编辑器界面左面搜索,这个是路径追踪,让它覆盖游戏中的所有物体,然后按下P键即可设置完毕,设置完是绿色的。

猜你喜欢

转载自www.cnblogs.com/tilyougogannbare666/p/12078558.html
今日推荐