UE5增强输入系统 Enhanced Input

关键字:
Enhanced Input 、 输入、映射、事件、鼠标、键盘、键鼠、动作、Trigger、触发器、

疑问:

  • 新输入系统怎么做一个基础的案例?
  • Trigger修改器中每个项都是什么功能?
  • InputAction和InputMappingContext中都有修改器,那么听谁的?
  • 如何获得鼠标平移? 如何将WSADQE的三维XYZ的事件进行输出?

增强输入系统 Enhanced Input

在这里插入图片描述

最主要的两个组件

  • Input Mapping Context 输入映射管理器 建立映射关系,是一套映射方案 简称 IMC
  • Input Action 输入动作 单个键盘鼠标动作事件 简称 IA

二者关系:

Input Mapping Context
|——Input Action
|——|——映射对应键鼠
|——|——映射对应键鼠
|——|——… …
|——Input Action
|——|——映射对应键鼠
|——|——映射对应键鼠
|——|——… …
|——Input Action
|——|——映射对应键鼠
|——|——映射对应键鼠
|——|——… …
|—— … …

简单的例子:制作一个鼠标左键事件,单击、抬起并print信息

一、制作Input Action

创建一个IA,在空白区域右键,弹出菜单Input / Input Action ,起名IA_LMB,用它表示单击左键
在这里插入图片描述

  • 这个IA起名字,根据项目而定。可以是键鼠对应的按钮名称,也可以是角色行走、开枪的动作名称。 命名方式很重要,它是蓝图中的事件的名称。
  • 类似载具类操作,如汽车,大多将水平和垂直轴分开处理,即WS一组、AD一组、有的还会有QE一组。这样分开输出比起合在一个事件里的三维坐标更容易控制,因为车辆前后是油门,在没有油门的时候,左右是不动的。
  • 我的项目以 键盘操作 为主,所以用 <键鼠按钮名字_事件名称> 命名。如下图,展示了正式项目中,围绕鼠标左键的双击、按住、按下、抬起事件。之所以分的这么细致的产品需求是:项目有大量键鼠组合操作。

在这里插入图片描述
注意: 时刻、时段,有区别。

名称事件描述
IA_LMB_DubbleClick鼠标左键双击事件
IA_LMB_Hold鼠标左键持续按住,并持续输出事件
IA_LMB_Pressed鼠标左键按下时刻事件
IA_LMB_Released鼠标左键抬起时刻事件

这么做对于后续的键鼠事件配置,也将更为复杂 。

回到简单案例,当前的案例没有那么复杂的命名方式,双击打开IA_LMB,将Value Type 修改为Digital(bool)类型
在这里插入图片描述

如上图,在value Type中对于:

  • 鼠标按下、抬起的瞬时动作, 使用bool 输出范围 true、false;
  • 鼠标滚轮缩放, 使用 Axis1D(float) 输出范围0.0-1.0f;
  • 鼠标水平移动,键盘WSAD, 使用 Axis2D(Vector2D) ;

二、制作Input Mapping Context,设置对映按键

创建一个IMC_起名FL_IMC
在这里插入图片描述
双击打开,添加一个mappings,指向IA_LMB,映射按钮设置成鼠标左键,如下图
在这里插入图片描述

三、做蓝图

在Playercontroller蓝图中添加 AddMappingContext ,如果不添加无法获取事件。
在这里插入图片描述
再添加事件 IA_LMB ,并打印
在这里插入图片描述
测试如下:
在这里插入图片描述
完成。

扩展与详解

细节1:Triggered触发是什么频率?帧率可以自定义吗?

答:频率可以调节
打开案例中的 IA_LMB
下方Triggers里,添加一个 Pulse脉冲修改器
Interval:频率,每秒钟的次数,输入0是按Tick频率
TriggerLimit:触发限制,一次按下的累计次数,到达次数返回Completed。输入0是不限制次数。

这个效果类似于枪械射击,但真正的枪械还有换弹夹、射速不同的复杂动作不会使用从此方式制作射击的。 狙击枪右键开镜,可以设置为1。

此外:Trigger on Start : 勾选按下就触发事件;不勾选,延迟间隔频率时间后再触发事件。
在这里插入图片描述

Triggers的设置
在这里插入图片描述

Trigger修改器详解(重点)

默认的顺序在Pressed之前,所以如果想得到纯洁的hold按住事件,最好用Hold延迟0.05秒的办法。
通常正式项目中只关注蓝图中的Trigger事件,少数特殊需求才会用到Completed事件。
● Pressed:按下时刻,先后各触发一次Trigger和Completed事件;在抬起时刻,无任何事件;Pressed是非持续事件。
● Pulse:脉冲事件,可设置为单次、多次、不同频率或持续Trigger事件。自由度最高可以模拟其他各类事件。
● Released,按下时段,无任何事件;抬起时刻,先后触发各一次Trigger和Completed事件;非持续事件。
● Hold:按下时长N以后,开始持续发出Trigger事件,在抬起时,触发一次Completed事件;勾选Is one Shot则Trigger和Completed一起被先后触发各一次。在N时间内无事件。
● HoldAndRelease:按下多久后,抬起时刻,先后触发各一次Trigger和Completed事件,按下时长不足时无事件。
● Down:按下时段,持续Trigger事件,频率不可调;在抬起时刻,Completed事件。
● Tap:按下后,在TapReleaseTimeThreshold时间内抬起,则先后各触发一次Trigger和Completed事件,超时抬起,无任何事件。
● Combo:按键组合,如Ctrl+T。在Time to Press Key时长内的按键有效,超过时长无任何事件。还可以设置两个按钮,一个开启事件和另一个关闭事件。
请添加图片描述

此外在IMC里调节也是一样的
在这里插入图片描述

那么IA和IMC两个地方都调了,谁最终有效?

经测试:最终使用了IMC参数,IMC参数覆盖了IA的Modifiers。

细节2:我想要鼠标移动的XY参数怎么传递和接收?

制作一个Axis2D的IA_MouseMove
在这里插入图片描述

IMC里,映射给Mouse XY 2D-Axis
在这里插入图片描述

PC里蓝图
在这里插入图片描述
给蓝图Pring的key添加名字,mm是我随便起的,可以避免被持续打印的信息刷屏
效果:
在这里插入图片描述

此时我们看到Triggered并不完全是Pressed。所以翻译为“触发”更加准确,意为当事件发生了。
完成

细节3:WSADQE对应的3D如何区分横纵轴向?

创建IA_WSADQE
在这里插入图片描述

IMC添加映射
WS的映射如下图, Modifiers在不添加任何修改器的时候,默认是输出X轴向正方向,长度1.0f
S后退,为负,所以给S增加一个Negate修改器,意为反向将取值范围从1.0f改为-1.0f
在这里插入图片描述

AD的映射,其中给AD都添加了Swizzle Input Axis Values 混合输入轴向值
这个下面有一个order,给AD选择YXZ,但是为啥不是YZX呢?我也不知道这个原理是怎么看的,难道是右手定则?
此外给A一个Negate反向修改器,让A与D值相反
这样通过Swizzle Input Axis Values 确定了AD共轴向并与WS垂直。轴值范围是0.0-1.0f,反向就是-1.0f。
在这里插入图片描述

QE的映射,Q下降,E上升,还是要确定轴向,继续使用Swizzle Input Axis Values ,order选择ZYX。
给Q增加Negate反向修改器。
在这里插入图片描述

在PC中连接ActionValue三维向量,打印
在这里插入图片描述

打印如下:
在这里插入图片描述
测试Swizzle Input Axis Values 在QE上的设置
正确——ZYX 打印输出时 Z值变化
错误——ZXY 打印输出时 Y值变化并不是Z值变化

测试Swizzle Input Axis Values 在AD上的设置
正确——YXZ 打印输出时 Y变化
错误——YZX 打印输出是 Z变化

也就是说
键盘AD采用ZYX 并且 QE采用YXZ 方案 AD是左右 QE是下上
键盘AD采用ZXY 并且 QE采用YZX 方案 AD是下上 QE是左右

我试着查询数学原理,但我也没看懂,此处整理碎片知识点:

  • 东北天,北东地才是地理信息行业通用的,一般用于导航。
  • UE是北东天坐标系,这并不是一个广泛通用的坐标系,只是UE自己用。
  • UE是X,Y,Z左手坐标系。
  • 欧拉角阐述了三维空间中的任意角度都可以使用三个轴向的旋转而得到,即使用Yaw、Pitch、Roll可以得到任意角度。这也引出了三个轴向的排列顺序,有XYZ、XZY、YXZ、YZX、ZXY、ZYX六种情况。

备注:我对这个轴向旋转也是一知半解。目前的仅凭经验整理了规则,并非数学上吃透。
下面分享一下基于经验性的规律总结
在这里插入图片描述
如上图ZYX中,第一位是输出位,想输出Z轴值,就把Z放在第一位,即对应的是世界坐标的X位为输出位。
此时后两位有两种排列情况XY和YX,该选哪个呢?
假定推测是必须要有一个轴是不变的,与世界坐标系XYZ位置对应,才能保证轴变换有支撑。如下框图。
请添加图片描述
Z已经变了,而且占用了世界X的位置,即X也对不上了。那么Y就不能变了,所以第二位是Y,第三位自然就是X了,也就有了ZYX。经测试,ZYX正确。假定成立。

细节4:载具类轴向,WS一组AD另一组,横纵向分开。

原因:转向不含油门功能。
创建三个IA,IA_GoForward前后WS,IA_GoRight左右AD,IA_GoUp上下EQ
在这里插入图片描述

三个IA都是Axis1D Float类型,如下图中的IA_GoForward
在这里插入图片描述
在IMC中添加三个IA。
IA_GoForward前后添加WS按键,其中S添加Negate反向修改器
IA_GoRight左右添加AD按键,其中A添加Negate反向修改器
IA_GoUp上下添加EQ按键,其中Q添加Negate反向修改器
在这里插入图片描述

复杂设置案例

将鼠标每种动作独立出来

鼠标左键按下

在这里插入图片描述

鼠标左键按住

在这里插入图片描述

鼠标左键抬起

在这里插入图片描述

鼠标左键双击

此处使用了一个Combo组合修改器,将两个release组合在一起
在这里插入图片描述

蓝图

在这里插入图片描述### 测试效果如下
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python基础02-掌握HTTP API的秘诀

在下面文案基础上扩展&#xff0c;写一篇技术博客&#xff0c;标题要有吸引力&#xff1f; 标题&#xff1a; 在Python中&#xff0c;使用HTTP API已成为一种常见的操作。本文将深入探讨如何使用Python的requests库与HTTP API进行交互。我们将学习如何发送GET和POST请求、处理…

消息队列选型(RabbitMq、RocketMq、Kafaka)

文章目录 前言RabbitMq优点缺点 RocketMq优点缺点 Kafaka优点缺点 总结 前言 当引入消息队列时&#xff0c;常见的选择包括ActiveMQ、Kafka、RabbitMQ和RocketMQ。然而&#xff0c;近年来&#xff0c;ActiveMQ的活跃度已经下降&#xff0c;很多公司已经不再使用这款消息队列中…

TSINGSEE青犀算法中台消防通道堵塞/占压AI检测算法的介绍及应用

消防通道是建筑物内用于紧急疏散的通道&#xff0c;其畅通无阻对于保障人员生命安全至关重要。然而&#xff0c;由于各种原因&#xff0c;消防通道经常会被杂物、车辆等堵塞&#xff0c;一旦发生火灾等紧急情况&#xff0c;后果不堪设想。为了有效解决这一问题&#xff0c;我们…

【氮化镓】GaN HEMT失效物理和可靠性

概述: 本文是一篇关于AlGaN/GaN基高电子迁移率晶体管(HEMTs)的失效物理和可靠性研究的综述文章,发表在2013年10月的《IEEE Transactions on Electron Devices》上。文章由Enrico Zanoni等人撰写,主要关注了影响栅极边缘和肖特基结的失效机制,并探讨了提高这些器件可靠性…

文档加密软件哪个好用?为什么迅软DSE加密软件更受用户青睐?

通过对文档内容进行加密处理&#xff0c;以确保其安全性和保密性。文档加密软件采用加密算法对文档进行加密处理&#xff0c;在加密过程中&#xff0c;文档加密软件会将文档的原始内容转换为一种不可读的形式&#xff0c;即加密后的文档。这个加密过程是通过应用特定的加密算法…

SQVI创建以及生成程序

SAP数据快速查询工具&#xff1a;Sqvi-QuickView 项目实施&运维阶段&#xff0c;为了快速获取一些透明表数据&#xff0c;一开始接触项目肯定会通过大量的数据表查找&#xff0c;然后线下通过EXCEL通过VLOOKUP进行数据关联&#xff0c;这种方式在关联数据较少的情况比较适应…

spring boot获取请求参数并响应

获取请求参数并响应&#xff1a; 响应&#xff1a; 在Controller类或方法上加上ResponseBody注解&#xff0c;可以将方法返回值直接响应&#xff0c;如果返回值是实体对象或者集合&#xff0c;将转换为json格式响应。如下例&#xff1a; RestControllerResponseBodyControll…

Linux最常用的40个基本命令

目录 Linux基本命令命令1&#xff1a;ls &#xff08;查看指定目录中有哪些内容&#xff09;ls / 相当于查看根目录中的内容&#xff0c;相当于查看我的电脑ls -l&#xff08;小写l&#xff0c;或者使用ll&#xff09;详细查看目录下所有内容ls /usr/lib&#xff08;ls目录名称…

Java | Leetcode Java题解之第38题外观数列

题目&#xff1a; 题解&#xff1a; class Solution {public String countAndSay(int n) {String[] arr {"","1","11","21","1211","111221","312211","13112221","1113213211",…

基于springboot的网上二手商城的设计与实现

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

盛情邀请 | 4月24-26日成都工博会科东软件邀您共赴蓉城

2024成都国际工业博览会(简称“成都工博会”)将于2024年4月24日-26日在中国西部国际博览城隆重揭幕。立足未来工业的高站位&#xff0c;精确聚焦中国智能制造&#xff0c;为上下游企业搭建高效的供需对接桥梁&#xff0c;促进制造业向数字化网络化智能化转型&#xff0c;推动西…

CTF竞赛:一场网络安全技术的盛宴

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

若依框架后台管理系统_修改后台管理密码

若依框架后台管理系统_修改后台管理密码 1. 找见加密函数&#xff1a; /*** 生成BCryptPasswordEncoder密码** param password 密码* return 加密字符串*/public static String encryptPassword(String password){BCryptPasswordEncoder passwordEncoder new BCryptPasswordE…

深入探索生产者拦截器的使用以及源码设计

文章目录 一、介绍二、使用1. ProducerInterceptor接口2. 实现之统计3. 实现之二次处理4. 小结 三、实现原理1. 初始化流程2. 生效流程 四、总结 一、介绍 在软件设计中&#xff0c;为了方便能够应对不同的场景&#xff0c;一般在一些容易有差异的环节会考虑允许用户自定义逻辑…

相机1:如何系相机肩带

开始解锁新领域&#xff0c;多看几个相关视频&#xff0c;大概也就可以掌握一两种系相机肩带的方法&#xff0c;本质就是新知识的学习过程&#xff0c;不可能等着或者期待出来一个完整的教程&#xff0c;一步一步自己去探索&#xff0c;自己去查资料。 目录 总述 第一步&#…

仓库管理系统 warehouse

系统概要 仓库管理系统总共分为两个大的模块&#xff0c;分别是系统模块和业务模块。其中系统模块和业务模块底下又有其子模块。 功能模块 一、业务模块 1、客户管理 客户列表 客户分页和模糊查询 客户添加、修改、删除、批量删除 2、供应商管理 供应商列表 供应商分页和模糊查…

XiaodiSec day017 Learn Note 小迪渗透学习笔记

XiaodiSec day017 Learn Note 小迪渗透学习笔记 记录得比较凌乱&#xff0c;不尽详细 day 17 主要内容&#xff1a; php 框架 thinkPHPyiilaravel 使用 fofa 搜索 thinkphp 市面上 thinkphp5 版本较多 url 结构 域名/.php(文件名)/index(目录)/index(函数名)模块名-控…

Pyjion:一个解决Python性能瓶颈的利器!

在Python编程领域&#xff0c;性能一直是一个备受关注的话题。随着项目规模的增长和需求的提升&#xff0c;对代码性能的要求也越来越高。 为了解决这一问题&#xff0c;Python社区不断努力优化解释器和引入新的工具来提升代码执行效率。 其中&#xff0c;Pyjion模块作为一个…

Redis key(BigKey、MoreKey)的存储策略

1. MoreKey 案例 1.1 大批量往 redis 里面 插入2000w 测试数据key (1) Linux Bash 下面执行&#xff0c;插入 100w rootspray:~# for((i1;i<100*10000;i)); do echo "set k$i v$i" >> /tmp/redisTest.txt; done; 查看 rootspray:~# more /tmp/redisTest.…

SpringBoot多数据源(五)

SpringBoot多数据源-集成多个mybatis框架 1.基本框架2.使用2.1项目结构2.2 依赖导入2.3 application.yml配置2.4 创建读与写的SqlSessionFactoryBean 3.总结 1.基本框架 通过启动多个SqlSessionFactoryBean&#xff0c;每个SqlSessionFactoryBean对应一个datasource和指定位置的…
最新文章