【UE】AI行为树入门——以小白人跟踪玩家并攻击为例

目录

前言

效果

步骤

一、准备工作 

二、用蓝图实现AI随机移动

三、用行为树实现AI随机移动与跟踪玩家并攻击的效果

3.1 AI随机移动 

3.2  AI看到玩家后跟踪玩家

3.3 AI攻击玩家


前言

        本篇文章要实现的效果是:小白人随机移动,并且在移动过程中如果看见了玩家,小白人就会跑向玩家,靠近玩家之后就会进行攻击。

效果

步骤

一、准备工作 

1. 新建一个第三人称游戏工程,复制一份第三人称模板蓝图,命名为“AI_BP”

打开“AI_BP”,删除事件图表中的所有节点

删除摄像机和弹簧臂组件

接下来需要完成AI随机移动的功能

二、用蓝图实现AI随机移动

首先介绍一下最关键的“AIMoveTo”节点,其中“Pawn”引脚表示是哪个AI要移动,“Destionation”表示AI要移动到哪个地方,“Target Actor”表示要移动到哪个actor所在的位置,“Acceptance Radius”表示距离目标半径为多远就可以停止,“Stop on Overlap”表示AI移动到指定位置后是否停止。

2. 向场景中拖入一个导航网格体边界体积

3. 在“AI_BP”的事件图表中创建一个AI随机移动的自定义事件,如下,让AI在以自身为圆心半径5000cm的范围内随机移动

每3~5s执行以下“AI移动事件”

4. 将“AI_BP”拖入场景,此时运行就可以看到小白人在随机移动

三、用行为树实现AI随机移动与跟踪玩家并攻击的效果

3.1 AI随机移动 

将“AI_BP”事件图表中的所有节点删除

5. 新建一个行为树和黑板

6. 再添加一个AI控制器

这里就命名为“MyAIController”

打开黑板,新建一个布尔类型的变量

这里命名为“是否看到玩家”

再添加一个向量类型的变量,这里命名为“要去的地方”

8. 打开“MyAIController”,添加一个AI感知组件

在右侧细节面板中添加一个感官配置元素,然后这里用到的是“AI视力配置”

在AI视力配置中需要勾选检测中立方,这样AI才能感知到玩家

添加目标感知更新时的事件

在目标感知更新时的节点中,actor引脚传入的是AI感知到的Actor(Pawn或角色),“Stimulus”引脚传入的是感知到的Actor的一些其它信息

我们可以尝试打印看一下AI能否成功感知

下面需要让AI使用AIController

9. 打开“BP_AI”,设置AI控制器类为“MyAIController”

此时运行游戏,当玩家进入AI的视野后就可以看到打印了True,当玩家在视野外时可以看到打印为Fasle。因为我们可以根据这个结果对AI的行为进行设置。

10. 打开AI行为树,设置黑板资产为我们创建的那个黑板

选择完成后可以看到右下角出现了我们在黑板中设置的变量

添加如下节点,我们希望当AI看到玩家时走左边的路线,没看到玩家时走右边的路线

选择左边的“Sequence”节点,点击添加装饰器,选择“Blackboard”

此时就可以将黑板中的变量调用过来

选中“Blackboard Based Condition”,然后设置黑板键为“是否看到玩家”

同样的步骤设置一下右边的“Sequence”节点,但是键查询设置为未设置。此时左边就表示了看到玩家,右边表示没有看到玩家。

设置左右两边的观察器中止都为“Both”

        ·None:不中断。它的子节点将继续执行。

        ·Lower Priority:打断除去自己子树外所有比自己优先级更低(执行索引更大)的节点,抢夺执行权。

        ·Self:立即终止自己子节点的执行,让出执行权。

        ·Both:结合了Lower Priority和Self的特性,打断包括自己子节点在内的所有比自己优先级低(执行索引更大)的节点。

下面我们需要将AI是否看到玩家的这个变量实时的传入黑板。

11. 打开“MyAIController”,添加如下节点,此时就可以将是否看到玩家的结果赋值到黑板中的变量“是否看到玩家”

12. 回到行为树中,继续编辑当AI看到玩家之后要做什么的逻辑。

点击“新建任务”

 这里命名为“随机找点”

13. 在“随机找点”中,重载函数“接收执行AI”

引脚“Controlled Pawn”表示AI控制器控制的Pawn 

添加如下节点,表示AI移动到目的地后就完成执行,完成执行后继续做下一个任务。注意最后的“完成执行”很重要,如果不加这个节点,流程就会卡在这里,不会执行后面的任务。

14. 回到行为树中,此时可以在“Tasks”中找到任务“随机找点”

我们还可以添加一个系统自带的任务“Wait”,这样每次随机找点后就会等待5s(注意这里的每次循环是从Sequence出发,不是从跟出发)

15. 需要在“MyAIController”中设置使用行为树

 此时我们已经完成了AI在没有看到玩家时的行为。此时运行可以看到AI能够随机移动。

下面我们还需完成AI在看到玩家后的行为。

3.2  AI看到玩家后跟踪玩家

16. 回到行为树中,再次新建一个任务

选择“BTTask_BlueprintBase”

命名为“寻找玩家”

17. 打开“寻找玩家”,重载函数“接收执行AI”

在事件图表中添加如下节点,让AI向着玩家所在位置移动

此时我们完成了寻找玩家任务的创建,还需在行为树中使用。

18. 在行为树中添加寻找玩家的任务。

此时运行可以发现AI在看到玩家后已经可以跟踪玩家了。

这里的问题是一旦玩家走出视锥角度外,AI就不会跟踪玩家了,因此我们需要AI一直朝向玩家。

19. 打开“AI_BP”,在类默认值中取消勾选将旋转朝向运动

勾选“使用控制器旋转Yaw”,此时AI的旋转就由AIController控制

在“寻找玩家”的事件图表中,添加“设置焦距”节点,该节点能够让AI控制器获取玩家的朝向,从而控制AI一直朝向玩家

20. 打开“随机找点”,在AI失去玩家的视野后我们还需关闭焦距

此时运行游戏可以看到无论我们怎样绕圈AI都能跟随玩家

下面我们需要实现AI在靠近玩家一定范围内后会向玩家挥拳。

3.3 AI攻击玩家

21. 打开“AI_BP”,添加一个球形碰撞

这里设置球体半径为80

22. 添加一个AI攻击的动画序列,对该动画序列创建动画蒙太奇(注意导入动画序列时选择的骨骼是女性的小白人骨骼)

23. 当玩家进入球形碰撞区域内时,让AI播放攻击的蒙太奇动画

上面的逻辑只能让AI攻击一次,我们需要在玩家进入碰撞区域后让AI一直播放攻击动画直到玩家离开。因此我们使用一个定时器来实现循环攻击的效果。当玩家离开球形碰撞区域后就清除定时器。

此时运行可以看到当玩家进入球形碰撞区域后小白人会播放攻击玩家的动画

参考视频:

https://www.bilibili.com/video/BV155411P7Tx/?spm_id_from=333.999.0.0&vd_source=36a3e35639c44bb339f59760641390a8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电玩城游戏大厅计时软件怎么用,佳易王计时计费管理系统软件定时语音提醒操作教程

电玩城游戏大厅计时软件怎么用,佳易王计时计费管理系统软件定时语音提醒操作教程 一、前言 以下软件操作教程以 佳易王电玩计时计费软件V18.0为例 说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、软件计时计费,只需点击开…

国际前十正规外汇实时行情走势app软件最新排名(综合版)

外汇交易,作为当今世界金融市场上一个重要的板块,备受关注和热议。随着金融市场的日益发展,外汇交易也发展成为一个新兴的投资交易渠道。为了更好地满足投资者对外汇市场的需求,外汇实时行情走势app软件应运而生,它为投…

Material UI 5 学习03-Text Field文本输入框

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Text Field文本输入框 一、最基本的本文输入框1、基础示例2、一些表单属性3、验证 二、多行文本 一、最基本的本文输入框 1、基础示例 import {Box, TextField} from "…

【Python】新手入门学习:详细介绍里氏替换原则(LSP)及其作用、代码示例

【Python】新手入门学习:详细介绍里氏替换原则(LSP)及其作用、代码示例 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyT…

前端基础篇-深入了解 JavaScript(一)

文章目录 1.0 JavaScript 概述 2.0 JS - 引入方式 3.0 JS - 基础语法 4.0 JS - 数据类型 5.0 JS - 函数 6.0 JS - Array 数组 7.0 JS - String 字符串 1.0 JavaScript 概述 JavaScript(简称:JS)是一门夸平台、面向对象的脚本语言。使用来控制网页行为,它…

C++训练营:引用传递

大家好: 衷心希望各位点赞。 您的问题请留在评论区,我会及时回答。 一、引用传递 简单来说,“引用”就是给已有的变量起一个别名。引用并没有自己单独的内存空间,作为引用,它和原变量共用一段内存空间。引用的定义格…

算法空间复杂度计算

目录 空间复杂度定义 影响空间复杂度的因素 算法在运行过程中临时占用的存储空间讲解 例子 斐波那契数列递归算法的性能分析 二分法(递归实现)的性能分析 空间复杂度定义 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大…

Springboot中Redis的配置使用

新建 向pom.xml中添加依赖&#xff0c;这个可以不用标注版本号 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 配置yml文件&#xff08;文件名不可以错…

钉钉与实在智能达成战略合作,实在Agent助力钉钉AI助理成为“新质生产力”

3月12日&#xff0c;浙江实在智能科技有限公司&#xff08;简称“实在智能”&#xff09;与钉钉&#xff08;中国&#xff09;信息技术有限公司&#xff08;简称“钉钉”&#xff09;签署战略合作协议&#xff0c;达成战略合作伙伴关系。 未来&#xff0c;基于双方创新领先的技…

echarts - 鼠标事件详解

一、echarts 事件概念 chart.on(eventName, query, handler);1. 鼠标事件类型 eventName ECharts 支持9种常规的鼠标事件类型&#xff0c;包括click、 dblclick、 mousedown、mousemove、mouseup、mouseover、 mouseout、 globalout、contextmenu事件。 click&#xff1a;鼠…

C语言【典型算法编程题】总结

以下最全总结! 一,分支结构 1,if 编写程序,从键盘上输入三角形的三个边长(实数),判断这三个边能否构成三角形(构成三角形的条件为:任意两边之和大于第三边),如果能构成三角形,则计算三角形的面积并输出(保留2位小数);如果不能构成三角形,则输出“Flase”字符…

OCR-free相关论文梳理

⚠️注意&#xff1a;暂未写完&#xff0c;持续更新中 引言 通用文档理解&#xff0c;是OCR任务的终极目标。现阶段的OCR各种垂类任务都是通用文档理解任务的子集。这感觉就像我们一下子做不到通用文档理解&#xff0c;退而求其次&#xff0c;先做各种垂类任务。 现阶段&…

App Inventor 2 Clipboard 拓展:实现剪贴板的复制粘贴功能

效果如下&#xff1a; 此 Clipboard 拓展由中文网开发及维护&#xff0c;最新版本 v1.0&#xff0c;基于 TaifunClipboard 开发。 使用方法 属性及方法很简单&#xff0c;默认操作成功后显示提示信息&#xff0c;SuppressToast设置为 假 后&#xff0c;则不显示提示信息。 经测…

工业界真实的推荐系统(小红书)-重排:多样性算法-MMR、DPP、结合业务规则

课程特点&#xff1a;系统、清晰、实用&#xff0c;原理和落地经验兼具 b站&#xff1a;https://www.bilibili.com/video/BV1HZ421U77y/?spm_id_from333.337.search-card.all.click&vd_sourceb60d8ab7e659b10ea6ea743ede0c5b48 讲义&#xff1a;https://github.com/wangsh…

掌握SWOT分析:深入了解企业战略利器

在当今充满挑战和机遇的商业世界中&#xff0c;SWOT分析成为了企业战略制定和执行的不可或缺的工具。SWOT分析是一种系统性方法&#xff0c;用于评估企业内部的优势和劣势&#xff0c;以及外部环境中的机遇和威胁。本文将深入探讨SWOT分析的各个方面&#xff0c;揭示其深层次的…

数据结构从入门到精通——堆

堆 前言一、二叉树的顺序结构及实现 (堆&#xff09;1.1二叉树的顺序结构1.2堆的概念及结构 二、堆的练习题答案 三、堆的实现3.1堆向下调整算法3.2堆的创建3.3建堆时间复杂度3.4堆的插入3.5堆的删除3.6堆的代码实现 四、堆的具体实现代码Heap.hHeap.cTest.c堆的初始化堆的销毁…

数据结构(二)——顺序表和链表的比较

1、存取(读/写)方式 顺序表可以顺序存取&#xff0c;也可以随机存取&#xff0c;在第i个位置上执行存取操作&#xff0c;顺序表仅需一次访问. 链表只能从表头开始依次顺序存取&#xff0c;链表在第i个位置执行存取则需从表头开始依次访问i次. 2、逻辑结构与物理结…

unity显示当前时间

1建立文本组件和一个空对象 2创建一个脚本并复制下面代码 using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine;public class showtime: MonoBehaviour {public TextMeshProUGUI time;private void Update(){string currentTime Sy…

sqllab第十五关通关笔记

知识点&#xff1a; 布尔盲注 无任何有价值的回显&#xff1b;但是回显信息只有两种&#xff08;区别正确和错误&#xff09;通过布尔盲注爆破处正确的信息利用过滤条件对数据进行过滤&#xff1b;只显示自己想要的信息 尝试进行admin admin登录发现没有任何的回显信息 通过b…

Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现双快门采集两张曝光时间非常短的图像(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现双快门采集两张曝光时间非常短的图像&#xff08;C&#xff09; Baumer工业相机Baumer工业相机定序器功能的技术背景Baumer工业相机通过NEOAPI SDK使用定序器功能预期的相机动作技术限制定序器的工作原理 Baumer工业相机通过NE…