【AI】p54-p58导航网络、蓝图和AI树实现AI随机移动和跟随移动、靠近玩家挥拳、AI跟随样条线移动思路
p54-p58导航网络、蓝图和AI树实现AI随机移动和跟随移动、靠近玩家挥拳、AI跟随样条线移动思路
- p54导航网格
- p55蓝图实现AI随机移动和跟随移动
- AI Move To(AI进行移动)
- Get Random Pointln Navigable Radius(获取可导航半径内的随机点)
- Set Timer by Event(以事件设置定时器)
- Random Float in Range(范围内随机浮点)
- p56AI树实现AI随机移动和跟随移动
- 目标感知跟新时(AIPerception)(On Target Perception Updated(AIPerception))
- 中断AISimulus(Break AISimulus)
- AI行为树
- p57靠近玩家挥拳
- 蒙太奇
- p58AI跟随样条线移动思路
p54导航网格
在体积找到“导航网格体边界体积”拖拽到视图中出现一个线框和绿色覆盖,线框覆盖部分属于AI可以行动范围
快捷键“P”可以显示消失的查看绿色覆盖
绿色导航网格分为静态和动态
静态代表游戏运行之前就已经计算好了AI可以运动的范围
动态代表游戏运行时实时的计算AI可以运动的范围
p55蓝图实现AI随机移动和跟随移动
ctrl+w复制ThirdPersonCharacter,创建的新蓝图类重命名为AI
新建文件夹AI,把蓝图类AI放到新文件夹AI中
打开蓝图类AI,删掉蓝图、遍历、摄像机、其他事件图表
AI Move To(AI进行移动)
作用:让AI进行移动
Pawn:连接(使其移动的)对象(一般都连接self(获得一个对自己的引用))
Destination:(将要移动到的)目标
Target Actor:跟踪(某个角色)移动(如果连接的是玩家,就会一直跟着玩家跑)(和Destination选择一个使用,区别为Target Actor传入的是演员,Destination传入的是向量)
Acceptance Radius:走到目标的多少范围
Stop on Overlap:大勾后Acceptance Radius变成了走到目标的多少范围停止
成功时:AI到达目的地成功时触发
失败时:AI到达目的地失败时触发
创建新的自定义事件“AI移动”连接输入执行引脚
Pawn连接self
Destination拉出引线搜索Get RandomPointln Navigable Radius(获取可导航半径内的随机点)
Get Random Pointln Navigable Radius(获取可导航半径内的随机点)
Origin:(需要传入一个圆心)在此圆心范围内找到一个点
Radius:半径范围数值
Origin拉出引线搜索“获取Actor位置”
创建事件开始运行,拉出引线连接事件AI移动
蓝图如下
现在AI会在以自身为半径的Radius范围内随机选一个点移动,之后就会停下,当前目的需要AI在移动到一个点后再次移动
Set Timer by Event(以事件设置定时器)
Time:可以设置时间
Looping:循环(打勾即会循环)
Random Float in Range(范围内随机浮点)
如图连接蓝图
如此,每过5到7秒触发一次时间AI移动,循环(如果AI还没到目的地时间就到了,AI会选择向新的点走去)
p56AI树实现AI随机移动和跟随移动
右键内容浏览器-》人工智能-》黑板
右键内容浏览器-》人工智能-》行为树
右键内容浏览器-》蓝图类-》搜索AIController(AI控制器)(这是所有AI控制器的父类)
AI_BP可以看作是傀儡,AI_BT控制AI_BP,行为树控制AI的行为,黑板存储变量
在黑板新建两个变量,一个bool变量重命名为“是否看到玩家?”,另一个是向量重命名为“要去的坐标”
打开AIController,在组件面板添加“AI感知组件”(作用是让AI感知周围的敌人友军等)
点击AIPerception(AI感知组件),在细节面板找到“AI感知”点击“感官配置”右侧的加号
有许多配置,选择视力配置
实力配置可以修改如下参数
次要视觉半角角度:AI的视力范围
按归属检测中的中立方要打勾,这样才可以检测到玩家(如果想要更改敌友等需要更改c++代码)
目标感知跟新时(AIPerception)(On Target Perception Updated(AIPerception))
Actor:AI看到(因为之前选的视力配置)的”Pawn和角色蓝图类“会传到此处
Stimulus:刺激物
Actor拉出引线搜索”类型转换为ThirdPersonCharacter"(类型转换的作用是只有看到小白人才会响应之后的逻辑)
Stimulus拉出引线搜索“中断AISimulus”
中断AISimulus(Break AISimulus)
Successfully Sensed:是否成功感测到了小白人
如下图连接蓝图,进行测试
想要进行测试还需要打开AI_BP,在细节面板-》Pawn-》AI控制器类-》选择AI_BT(刚才的AIContoller)
编译保存
如此在游戏中出现在AI视野范围内左上角会出现true,走出AI视野会在左上角出现false
AI行为树
从根拉出的Composites:复合节点(用于分支的规则)
Selecter:选择,几选一……
Sequence:序列,按顺序进行
因为目的是AI看到玩家冲到玩家身边挥拳,所以先连接Selector根据有没有看到玩家而判断,接下来连接Sequence(如果看到了玩家依次进行什么动作)
如下图连接
在左侧Sequence右键添加装饰器,选择黑板Blackboard(调用了黑办里的变量)
在右侧细节面板选择要调用的变量“是否看到玩家?”
当黑板太多时,点击空白处,在细节面板可以选择使用的黑板
右侧Sequence也添加装饰器黑板,在细节面板-》黑板-》键查询-》未设置,黑板键选择变量“是否看到玩家?”
(选择未设置就代表未看到,已设置就是看到)
现在设置优先级(使其优先级相等)点击Sequence的黑板,在细节面板-》流控制-》观察器终止-》Both
两个都如此设置,现在两个在同一优先级
在AI_BT的事件图表右键搜索“获取黑板”拉出引线搜索“将值设为布尔”,此时“将值设为布尔”出现Bool Value节点,连接中断AIStimulus蓝图的Successfully Sensed节点
从Key Name拉出引线搜索“创建文字命名”,在“创建文字命名”写上“是否看到玩家?”
如此就可以实时的传递bool值“是否看到玩家?”了
现在行为树的规则有了,但是还没有内容,接下来添加内容
点击左上角新建任务,选择BTTask_BlueprintBase(如果没下拉,选择即可)
在新建的任务(蓝图)在左侧我的蓝图,点击函数右侧的重载“事件接收执行AI”
删除之前创建的蓝图实现随机移动的蓝图
如图在新建的任务如下图链接
Comtrolled Pawn连接AI Move To的Pawn(这一步是连接AI控制器的对象)
AI Move To的成功时连接”完成执行“(Finish Execute)(这一步是让AI在执行完成后告诉系统到底是成功还是失败了,才能进行下一个任务)(不要忘记给完成执行的bool打勾)
(必须在完成任务时让编译器知道,不然就不会做任何事了)
这是随机找点的逻辑,逻辑写完该让行为树调用了
在右侧行为树”没看到玩家时“拉出搜索”随机找点_BP“(刚才新建的任务的重命名)
再添加一个Wait。设置为5秒,这样就会,找个点,待5秒,再找个点,待5秒,如此循环
现在行为树还没有和AIController产生联系
在AIController的蓝图中创建”事件开始运行“,连接”运行行为树“
在”运行行为树“的BTAsset选择对象行为树”AI_BT“
在AI_Tree新创建一个任务”寻找玩家_BP“,重载”接收执行AI“如图连接
现在AI会一阵跟着玩家,但是很容易视野丢失玩家就会跑开
解决办法:让AI看到玩家后一直朝向玩家
打开AI小白人蓝图,在组件选中角色移动,在细节面板搜索朝向,取消勾选
选中类默认值,在细节面板找到Pawn-》使用控制器旋转Yaw
打开寻找玩家_BP,搜索”设置焦距“目标连接Owner Controller,New Focus连接Return Value
控制AI旋转方向的是设置焦距的New Focus,New Focus连接获取玩家角色,就会一直看向玩家角色方向
使用焦距后AI会一直朝向玩家,会在还没看到玩家的时候斜着走等等
所以需要在没看到玩家时关掉设置焦距
在随机找点_BP中创建清除焦距蓝图,如下图连接
p57靠近玩家挥拳
给AI添加一个碰撞盒子(Sphere Collision)调整大小
点击Sphere,在细节面板点击两个蓝图(组件开始重叠时(Sphere)、组件结束重叠时(Sphere))的加号创建蓝图
蒙太奇
蒙太奇就是多个动画或片段剪辑组合在一起,通过程序驱动播放某一个片段
点击组件面板的“网格体(CharacterMeshO)”拖出,拉出引线搜索“获取动画实例(Get Anim Instance)”,拉出引线搜索“蒙太奇播放(Montage Play)”
(蒙太奇播放的目标是动画实例,所以先创建前面两个蓝图。因为要让“网格体(CharacterMeshO)”里的模型播放动画,所以选用“网格体(CharacterMeshO)”来连接)
为蒙太奇播放添加一个动画
可以通过调节In Play Rate而更改动画播放时间
返回值是直接获取动画的长度,练到time效果如下:
当播放蒙太奇的同时,触发计时器,计时器开始倒计时,时间为蒙太奇的总时间,倒计时结束时,正好是动画播放完,触发自定义事件,就会再一次播放动画,触发计时器,勾选looping之后,就会如此重复播放动画
以事件设置定时器的Return Value拉出引线搜索“Clear and Invalidate Timer by Handle(以句柄清除定时器并使之无效)”
按上述路径打开,复制第一个,在AI文件夹复制并改名“AI_AnimBP”(以防和玩家的混掉)
打开AI_BP蓝图,点击组件面板的“网格体(charaMeshO)(继承)”在细节面板的动画-》动画类。选择刚才命名的“AI_AnimBP”
双击打开“AI_AnimBP”
双击左侧动画图表的AnimGraph
两个连线之间添加一个插槽“DefaultSlot”
插槽的作用相当于标签(分类),为了更好的识别
完整蓝图如下
现在拳头靠近玩家摄像机时会被阻挡,所以进行如下操作
打开蓝图AI_BP,选中网格体-》在细节面板-》碰撞-》碰撞预设改为Custom-》Camera勾选忽略
p58AI跟随样条线移动思路
如图,随着点走
新建一个Actor蓝图类
在添加组件添加“样条组件”
拉出蓝图到视口会出现下图
选中左侧点,按住Alt键拉动可以快速创建一个点
打开事件树,在左上角新建任务,新建
拉出时间接收执行AI,连接获取类的所有Actor(Actor Class选中刚才创建的蓝图)
相关文章:

【AI】p54-p58导航网络、蓝图和AI树实现AI随机移动和跟随移动、靠近玩家挥拳、AI跟随样条线移动思路
p54-p58导航网络、蓝图和AI树实现AI随机移动和跟随移动、靠近玩家挥拳、AI跟随样条线移动思路 p54导航网格p55蓝图实现AI随机移动和跟随移动AI Move To(AI进行移动)Get Random Pointln Navigable Radius(获取可导航半径内的随机点)…...

mysql事务隔离级别详细讲解
mysql事务讲解 MySQL事务处理(TransAction) 大家好,我是一名热爱研究技术并且喜欢自己亲手实践的博主。 工作这么多年,一直没有深入理解MySQL的事务,因为最近也在面试,准备复习mysql的相关知识࿰…...

如何利用 EMC 模型解决能源服务提供商的瓶颈
01. 什么是合同能源管理? 合同能源管理(EMC-Energy Management Contract) 是一种新型的市场化节能机制,其实质就是以减少的能源费用来支付节能项目全部成本的节能投资方式。:节能服务公司与用能单位以契约形式约定节能项目的节能目标,节能服…...
C#--StringComparison枚举值解析
StringComparison 枚举值是在 C# 中用于指定字符串比较规则的枚举类型。它提供了不同的选项,以满足不同的比较需求。下面是 StringComparison 枚举值的解析: StringComparison.CurrentCulture:使用当前线程的区域设置(Culture&am…...

adb对安卓app进行抓包(ip连接设备)
adb对安卓app进行抓包(ip连接设备) 一,首先将安卓设备的开发者模式打开,提示允许adb调试 二,自己的笔记本要和安卓设备在同一个网段下(同连一个WiFi就可以了) 三,在笔记本上根据i…...

【EI复现】考虑区域多能源系统集群协同优化的联合需求侧响应模型(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

日常BUG —— Java判空注解
😜作 者:是江迪呀✒️本文关键词:日常BUG、BUG、问题分析☀️每日 一言 :存在错误说明你在进步! 一. 问题描述 问题一: 在使用Java自带的注解NotNull、NotEmpty、NotBlank时报错,…...

【基础类】—前端算法类
一、排序 1. 排序方法列表 2. 常见排序方法 快速排序选择排序希尔排序 二、堆栈、队列、链表 堆栈、队列、链表 三、递归 递归 四、波兰式和逆波兰式 理论源码...

中国信通院腾讯安全发布《2023数据安全治理与实践白皮书》
导读 腾讯科技(深圳)有限公司和中国信息通信研究院云计算与大数据研究所共同编制了本报告。本报告提出了覆盖组织保障、管理流程、技术体系的以风险为核心的数据安全治理体系,并选取了云场景、互娱、社交等场景,介绍相应场景下数据安全治理实践路线及主…...
linux下用脚本将目录内的文件分类到各自的创建年份(如2023)或年月份(如2023/202308)目录内
第一个if判断语句中判定只有是文件的时候才执行mv操作,并忽略一些特定 第二个if判断目录不存在时创建目录 最后mv文件到目录内 脚本执行前目录内容: 2022-01-file 2023-02-file 脚本执行后目录内容: 2022 |2022-01-file 2023 |2023-02-file …...

新手如何快速学习单片机?
初步确定学习目标:是学习简单便宜的51呢,还是学习简单但是性价比已经不算太高的,但是功能强大稳定可靠的avr,还是物美价廉的stm32,或者ARM9(可以跑系统了),再往上x86什么的如果是学8…...

【容器化】Oceanbase镜像构建及使用
通过该篇文章可以在国产X86-64或ARM架构上构建商业版oceanbase,只需要替换pkg安装包即可。下面截图主要以国产X86-64安装为例,作为操作截图: 镜像构建目录说明 pkg:用来存放安装包及脚本,抛出rpm其他是脚步,这些rpm包…...

软考第二章 信息技术发展
本章内容:软件硬件、网络、存储、新技术。 文章目录 2.1 信息技术及其发展2.1.1 计算机硬件2.1.2 计算机网络2.1.3 存储和数据库2.1.4 信息安全 2.2 新一代信息技术2.2.1 物联网2.2.2 云计算2.2.3 大数据2.2.4 区块链2.2.5 人工智能虚拟现实 2.1 信息技术及其发展 …...

【Unity每日一记】向量操作摄像机的移动(向量加减)
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:uni…...

C++初阶之一篇文章教会你queue和priority_queue(理解使用和模拟实现)
queue和priority_queue(理解使用和模拟实现) 什么是queuequeue的使用1.queue构造函数2.empty()3.size()4.front()5.back();6.push7.emplace8.pop()9.swap queue模拟实现什么是priority_queuepriority_queue的使用1.priority_queue构造函数1.1 模板参数 C…...

性能场景和性能需求指标
目录 一 性能场景 1、基准性能场景 2、容量性能场景 3、稳定性性能场景 4、异常性能场景 二 性能需求指标 1、业务指标 2、技术指标 2.1 时间指标 RT 2.2 容量指标 TPS 2.3 资源利用率 3、指标之间的关系 “TPS”与“响应时间” “用户数”与“TPS”与“压力工具中…...
Python学习 -- 常用函数与实例详解
在Python编程中,数据转换是一项关键任务,它允许我们在不同数据类型之间自由流动,从而提高代码的灵活性和效率。本篇博客将深入探讨常用的数据转换函数,并通过实际案例为你展示如何巧妙地在不同数据类型之间转换。 数据类型转换函…...

MySQL 账号权限
mysql 在安装好后,默认是没有远端管理账号。 一、账号管理 1. 查看账号列表 MySQL用户账号和信息存储在名为 mysql 的数据库中。一般不需要直接访问 mysql 数据库和表,但有时需要直接访问。例如,查看数据库所有用户账号列表时。 USE mysql; …...

[Mongodb 5.0]单机启动
安装完mongodb后,会自动生成下面两个目录(mongod.conf中设定的),用来存放日志和数据 /var/lib/mongo (数据目录) /var/log/mongodb (日志目录) 要启动一个单机版的mongodb,一般有两种方式: 第一种启动方式:直接使用…...

[HDLBits] Exams/m2014 q4b
Implement the following circuit: module top_module (input clk,input d, input ar, // asynchronous resetoutput q);always(posedge clk or posedge ar) beginif(ar)q<1b0;elseq<d;end endmodule...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...