unreal 5 实现角色拾取功能

news2024/11/25 12:38:52

要实现角色拾取功能,我们需要实现蓝图接口功能,蓝图接口主要提供的是蓝图和蓝图之间可以通信,接下来,跟着教程,实现一下角色的拾取功能。
首先,我们要实现一个就是可视区的物品在朝向它的时候,会有一个描边效果,先说一下这个功能的实现逻辑:

  1. 创建一个蓝图接口,蓝图接口内增加两个函数显示描边和隐藏描边。
  2. 创建一个可视区物品的父类,添加蓝图接口,然后制作这两个接口函数的实现
  3. 在角色蓝图中,去获取应该设置描边的模型,然后调用接口,去实现效果。
  4. 最后创建后处理,通过后处理去实现模型的描边渲染效果。
    这样就实现了需要拾取的物品高亮显示的效果。

创建蓝图接口

右键创建蓝图接口
在这里插入图片描述
然后再蓝图接口中,定义三个函数,不需要实现,只需要定义函数名
在这里插入图片描述
就创建完成了蓝图接口内容,函数的实现,我们在蓝图里面实现即可。

创建可拾取物品的蓝图父类

首先创建一个可以拾取的物品的蓝图父类,父类里面,我们需要创建两个组件,一个是用于显示模型的骨骼网格体组件,另一个是用于碰撞检测的球型碰撞体
在这里插入图片描述
在类设置里面设置
在这里插入图片描述

在项目设置中,找到碰撞,设置一个新通道 Pickup,用于相应拾取通道,默认值为忽略,只有在对象碰撞上面开启了碰撞,才会在这个通道产生作用,也是为了性能考虑
在这里插入图片描述
然后将拾取蓝图的父类的球体碰撞体的碰撞属性里面的这个通道设置成阻挡
在这里插入图片描述
在事件里面,鼠标右键,实现描边的函数创建,注意是添加事件,不是调用函数或者调用函数接口
在这里插入图片描述
将函数创建完成
在这里插入图片描述
然后制作对函数的实现,这里的函数,其实只是实现了对模型的自定义深度渲染的开关。原因在于描边的实现也是根据深度进行的描边绘制。
在这里插入图片描述

在角色蓝图中实现模型检测功能

首先在角色蓝图中创建一个拾取范围检测的函数,这个函数是基于相机视角进行拾取的,根据相机位置和相机朝向,可以创建一个范围,然后按通道进行球型拾取,会生成一个胶囊体的区域,将拾取结果返回。注意,通道拾取的通道是我们上面刚创建的Pickup通道,这样可以减少拾取内容。
在这里插入图片描述
这里我debug了一下, 可以看一下拾取区域具象化
在这里插入图片描述
接下来,我们要对拾取到的物体进行逻辑判断,实现一个拾取物体描边效果事件。事件首先调用函数,获取拾取结果。然后判断是否拾取到物体
在这里插入图片描述
如果没有拾取到,我们将取消所有物体的描边,主要是为了bug,其实如果处理的好,只需要将上一次拾取到的描边取消就行了,取消描边其实就是调用接口事件,然后拾取物体那边的事件就能够被调用触发。
在这里插入图片描述

如果拾取到了,就要判断是否和上一次拾取到的是否相同
在这里插入图片描述
如果相同,则不用处理,不同的话,先把之前的描边关闭,然后重新设置变量,并设置新的变量对象模型的描边效果
在这里插入图片描述
最后,这个在每一帧调用,即可实现。
在这里插入图片描述

添加后处理实现描边

首先添加一个后处理体积
在这里插入图片描述
将后处理范围设置为全局
在这里插入图片描述
添加后处理相关材质,用于实现后处理渲染
在这里插入图片描述

创建一个拾取物品子类

添加模型,并调整位置
在这里插入图片描述
设置碰撞球体的半径
在这里插入图片描述
然后放到场景内测试
在这里插入图片描述

创建拾取物品的类别

接着,后面我们需要实现将物体附加到角色身上,那么我们需要确定物品的类型以及所需的数据。
首先,我们需要创建一些枚举
在这里插入图片描述
这些枚举能够实现在角色事件中判断当前拾取的物件到底是个什么东西。
然后我们还需要一个结构体,用于存储上面的枚举类型还有一些附加到角色身上的数据
在这里插入图片描述
PickupType 拾取类型为判断当前为武器或者身上的衣物
WeaponType 武器类型为判断是什么类型的武器,拾取类型为武器时,才会有用
ClothesType 衣服类型为判断物品附加到身上的什么部位,拾取类型为衣服是起作用。
Mesh 骨骼网格体位衣服的骨骼网格体,如果是衣服的某个部位,只需要将衣服附件到角色身上,所以只需要在这里设置即可。
Class 类为实例化武器的类,用于实例化武器即可,我们之前创建的武器都是通过类实例化的。

所以,如果是一个衣服物件 我们需要设置PickupType ClothesType Mesh
如果是一个武器 我们需要设置 PickupType WeaponType Class
有了这些内容,我们就可以实现将拾取的物品附加到角色身上。

拾取功能的实现

在增强输入中增加一个输入
在这里插入图片描述
在角色蓝图中设置拾取事件,首先判断状态,我们之前实现了描边功能时,已经保存到了变量里,只需要判断变量里面的内容是否存在即可,然后发送事件通知。
在这里插入图片描述
在拾取物品父类里面,我们要在里面调用父类实现将拾取物品数据传递给角色蓝图,并在角色动画播放到拾取时,将自身销毁掉。
在这里插入图片描述
在角色蓝图里面,首先设置变量
在这里插入图片描述
这种方式是比较简单的方式,其实可以直接将整个结构体存下来比较好,然后在使用的地方break结构体获取数据。
然后修改状态,并设置动画蓝图为拾取状态
在这里插入图片描述
然后设置两个队列,第一个队列实现拾取逻辑,在拾取的一瞬间,调用附加到身体上函数。另一个队列则是在退出动画时,退出拾取状态
在这里插入图片描述

物品附加到角色身上逻辑

实现物品逻辑附加到角色身上,首先需要判断当前是何物品
在这里插入图片描述
如果是身上的衣服,我们只需要将衣服的网格体放置到对应的部位
在这里插入图片描述
能实现这个,首先角色模型下面有相应的模型部位
在这里插入图片描述
然后还设置了相应的事件能够让骨骼组件去更新当前模型
在这里插入图片描述
而在武器这里,我们之前创建过武器的类,并且将武器直接创建到了角色身上,现在,需要修改为拾取功能,所以,将武器附加的那套,不可以直接事件开始时运行,而是,修改为在拾取时运行
在这里插入图片描述
然后运行之前书写的那一套逻辑即可,区别就是修改了参数。
在这里插入图片描述
这里只是实现一下附加的简单实现,实际项目中还有很多数据判断,甚至和ui之间的交互,毕竟拾取背包增加身上物品容量,拾取衣物增加防御等

拾取动画实现

在拾取动画里面,使用了一个混合空间,主要是为了实现拿着武器和不拿武器播放的动画不同,站立和蹲着播放的也不相同,所有,实现了四个动画的混合,然后根据判断实现。并且将动画的播放事件都调整成了固定时间,这样方便退出拾取状态时,动画都是一同播放完成的。
在这里插入图片描述
然后再功能状态机里,创建一个切换到拾取状态。切换条件是由是否拾取的状态判断。
在这里插入图片描述
有可能遇到每次拾取未完成时,又进入了拾取状态,所以在状态上面配置项上每次进入从新开始播放
在这里插入图片描述
状态里,播放拾取动画,使用之前设置好的拾取动画,由于使用的混合空间,需要设置是否站立和是否持有武器,这里我使用布尔值变换浮点数的方式实现,布尔值转换数字,false就是0,true就是1
在这里插入图片描述
这就是拾取功能的大概逻辑。

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

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

相关文章

基于云技术的域名解析系统研究一:传统解析技术弊端(中科三方)

域名解析是互联网的一项重要基础作用,主要用于将域名翻译成计算机可识别的IP地址,完成对网络中其他主机的寻址任务。我们日常工作生活中的大部分网络应用,如网站访问、电子邮件以及其他各种web应用服务,都需要经过域名解析的寻址去…

Oracle的登陆问题和初级学习增删改查

1:学习Oracle首先需要安装Oracle,网上已经有很多很多教程了,这里不做叙述,自己百度即可,这里安装的标准版,个人根据需求安装学习或者企业开发即可。如果安装出错,自己百度Oracle的卸载即可&…

终极指南:Scrum中如何设置需求优先级

需求众多不知道如何下手?总想先做简单的需求,复杂需求却一拖再拖?那么,我们是时候开始考虑如何设置需求优先级了。 本期终极指南将展示如何为需求设置有效优先级,如何有效管理工作量,让效率指数倍增长&…

软件测试和软件开发哪个发展更好?我来告诉你怎么选

目录 一、基本素质要求 二、性格要求 三、入职门槛 四、转行难度 五、知识结构 六、竞争压力 七、职业发展 八、职业前景 总结 一、基本素质要求 这里的基本素质包括比如速辑思维能力、分析问题能力、沟通能力、协作能力、怀疑精神等方面, 【软件测试】: …

详细分析开发一个Servlet的步骤从实现Servlet接口,继承GenericServlet抽象类,继承HttpServlet抽象类逐步完善

实现Servlet接口 jakarta.servlet.Servlet是Servlet规范中的核心接口 Servlet对象的生命周期 Servlet对象的创建,对象上方法的调用,对象最终的销毁都是由Tomcat服务器全权负责的,JavaWeb程序员是无权干预的 第一步: Tomcat服务器本质是一个WEB容器, …

cocos creator 鼠标画笔|画线

cocos creator 版本使用 至少适配版本2.3.2以上 案例: 简要思路:MOUSE_MOVE事件和Graphics组件实现 前端也可以通过canvas和mousemove事件实现,原理一致 具体步骤如下: 1.添加节点Node 2.在Node节点上绑定组件Graphics 3.添加下方脚本drawcontroll.ts…

JMeter测试笔记(三):基本组件的使用

引言: 关于JMeter的测试笔记,这是第三篇,主要是介绍JMeter的基本组件的使用。 在进行性能测试时,了解并掌握基本组件的使用非常重要,因为它们是构成JMeter测试计划的基础。在本文中,我们将深入了解JMeter…

解决IDEA 引入GO SDK无法加载本地Go,The selected directory is not a valid home for Go SDK

解决IDEA 引入GO SDK无法加载本地Go,The selected directory is not a valid home for Go SDK 解决方法: 找到按照go目录下对应: C:\Program Files\go\go1.20.4\src\runtime\internal\sys 位置有一个文件名“zversion.go” 编辑文件 const …

JAVA开发(保姆级微服务搭建过程)

一、微服务的概念以及发展过程 微服务是指只提供一项功能的服务。 微服务是围绕某个业务领域展开的。比如把电商业务比较一个业务领域,技术部、产品部等就是围绕电商业务领域展开的微服务。在电商项目领域,由支付、商品、订单等微服务组成。 微服务架构…

【TypeScript】枚举类型和泛型的详细介绍

目录 TypeScript枚举类型 TypeScript泛型介绍 🎲泛型的基本使用 🎲泛型接口的使用 🎲泛型类的使用 🎲泛型的类型约束 枚举类型 枚举类型是为数不多的TypeScript特有的特性之一, JavaScript是没有的: 枚举其实就…

CiteScore 2022正式发布,AI Open首获即达22.5分,三大高被引论文值得一看

当前,由 ChatGPT、Stable Diffusion 等 AI 大模型掀起的新一轮科技浪潮,正在引领各个行业的变革性发展。及时、深入、全面地了解 AI 行业的前沿动态,有助于我们跟上 AI 行业的发展步伐,抓住时代机遇。 一本学术期刊的高影响力&am…

Java避免踩坑:Set对象排重注意避免重复-以commons-csv读取csv文件并排查为例

场景 HashSet HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。HashSet 允许有 null 值。 HashSet 是无序的,即不会记录插入的顺序。 HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet, 则最终结果是…

Classification-based framework for binarization on OCT-ME论文学习和总结

论文:Classification-based framework for binarization on mice eye image in vivo with optical coherence tomography 源码:https://github.com/MIP2019/mip2019.github.io/blob/main/spsvm 目录 一、背景和出发点 二、创新点 三、SPSVM的具体实现…

hive创建udf函数流程

1.编写udf函数 引入pom文件 <dependencies> <dependency> <!-- 这个属于额外的jar包 自己按需引用 比如你想搞得函数 里面要连接mysql 这里肯定需要引入mysql的驱动包 我这个包是为了计算字符串的表达式的。 --> <groupId>org.apache.com…

Git GitLab 使用及规范

Git 基本操作 Git安装配置及基本使用 从官网下载安装包&#xff0c;手动完成安装。打开Git Bash命令行工具&#xff0c;执行命令ssh-keygen -t rsa -C Email-Addresss生成一个密钥对。登录到GitLab&#xff0c;点击右上角你的用户头像&#xff0c;点击Edit Profile settings&…

【Linux】linux和Linus

1991.09.17 21岁的芬兰学生林纳斯.托瓦兹在网上发布开源操作系统Linux0.01。 林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff0c;1969年12月28日- &#xff09;&#xff0c;芬兰赫尔辛基人&#xff0c;著名的电脑程序员&#xff0c;Linux内核的发明人及 …

Revit如何在体量中进行放样及如何生成垫层

一、Revit如何在体量中进行放样 体量中的放样在常规族放样的基础上进行了简化&#xff0c;下面通过实例来说明如何在体量中进行放样。 &#xff08;1&#xff09;新建概念体量。点击“新建概念体量”→“公制体量”→“打开”。 &#xff08;2&#xff09;绘制放样路径。点击“…

盖雅「劳动力账户」助力物业行业实现精细化工时成本管理

物业行业的用工形式和工时制度多样&#xff0c;需要大量的劳动力提供安保、清洁、维修及其他服务&#xff0c;所以人工成本成为了物业公司最大的经营成本之一。而这些员工近半数都是外包人员。因此&#xff0c;物业公司需要利用数字化工具实时记录员工的出勤和工时&#xff0c;…

Grid++Report多个子报表实现

子报表实现参考 GridReport子报表实现 基于上述单个子报表的实现&#xff0c;我们可以衍生多个子报表实现 子报表与主报表可以是关联关系&#xff0c;也可以是独立存在。 配置主从关系字段即代表有关联关系 只有明细网格节点内配置的子报表才可以设置主从关系字段 报表头、…

强光LED手电筒方案开发设计

在户外活动中&#xff0c;不管是徒步还是露营&#xff0c;经常需要使用多功能强光手电筒。宇凡微推出的多功能战术强光LED手电筒方案&#xff0c;具有十多年LED灯项目研发经验&#xff0c;方案成熟&#xff0c;支持定制开发。 一、战术强光LED手电筒方案功能介绍 户外使用的LED…