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正确。假定成立。

复杂设置的案例

将鼠标每种动作独立出来

鼠标左键按下

在这里插入图片描述

鼠标左键按住

在这里插入图片描述

鼠标左键抬起

在这里插入图片描述

鼠标左键双击

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

蓝图

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

载具类轴向,WS/AD/QE 各个轴向分开。

原因:车辆的转向在没有油门值时,车辆原地不动。
创建三个IA,IA_GoForward前后WS,IA_GoRight左右AD,IA_GoUp上下EQ
在这里插入图片描述

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

在PC里面的蓝图
这里我将输入对应到了自定义事件中。方便以后使用。
对应三个自定义事件E_GoForward / E_GoRight / E_GoUp

题外话: 养成良好的代码习惯,以下方案供抛砖引玉:

  • 自定义事件命名使用 “E_” 前缀
  • 自定义函数命名使用 “Fn_” 前缀
  • 事件 Event 在框架上用于应用层,主要职责是业务流程的搭建,如流程判断、分支
  • 函数 Function 在框架上用于数据层,为业务流程搭建做方法支撑
    “框架”与“架构”有区别。架构范围更大。单专业做模块或子系统叫框架,跨专业做总体叫架构。
  • 事件中可以包含函数、函数中不可以包含事件
  • 将事件与函数有效解耦的过程,可以参考《设计模式》、《设计范式》

在这里插入图片描述
测试效果
按下WSADQE键,显示正常,测试通过
在这里插入图片描述

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

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

相关文章

Linux驱动开发——(一)设备树的基本属性及其应用

目录 一、常见基本属性 1.1 compatible属性 1.2 status属性 1.3 reg属性 1.4 #address-cells属性和#size-cells属性 二、基本属性在设备树的表现 三、基本属性在驱动代码的表现 3.1 驱动代码 3.2 驱动代码中的OF函数 3.2.1 of_find_node_by_path 3.2.2 of_find_prope…

Unity类银河恶魔城学习记录13-5,6 p146 Delete save file,p147 Encryption of saved data源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili FileDataHandler.cs using System; using System.IO; using UnityEngine; p…

Spring Boot + Thymeleaf 实现的任务发布网站

角色&#xff1a; 管理员雇主雇员 功能 雇主&#xff1a;登录、注册、发布任务、选择中标雇员、评价雇员雇员&#xff1a;登录、注册、查看任务列表、投标任务、收藏任务、完成任务管理员、登录、任务管理、雇主管理、雇员管理 部分功能截图 部署 导入数据库…

.NET 邮件发送 SMTP邮件发送

SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;是用于电子邮件传输的规则集&#xff0c;可以从邮件客户端向接收电子邮件服务器发送、中继或转发邮件。发件人可使用SMTP 服务器来执行发送电子邮件的过程。SMTP服务器则是按照这些规则中转电子邮件的服务器。 IMAP…

视频质量评价 PSNR 算法详细介绍

PSNR PSNR(Peak Signal-to-Noise Ratio,峰值信噪比)是一种常用的评价图像质量的指标,尤其在图像压缩和图像处理领域。它基于最大可能的图像信号功率和图像的噪声功率之间的比率,通常用于衡量图像恢复或图像压缩算法的效果。 原理 PSNR是基于MSE(Mean Squared Error,均…

node-sass报错

node-sass报错 解决方案 有几种解决方案&#xff0c;但感觉都是为了下载vsta_sdk这个工具的。 有的电脑下载C开发程序时可以顺带下载这个插件。 可以直接下载VS之后点击下载C桌面开发&#xff0c;但是有的不行&#xff0c;所以网上也就有另外一种方式&#xff0c;就是下载V…

C# danbooru Stable Diffusion 提示词反推 OpenVINO Demo

C# danbooru Stable Diffusion 提示词反推 OpenVINO Demo 目录 说明 效果 模型信息 项目 代码 下载 说明 模型下载地址&#xff1a;https://huggingface.co/deepghs/ml-danbooru-onnx 效果 模型信息 OVVersion { BuildNumber 2023.1.0-12185-9e6b00e51cd-releases/20…

桌面软件使用到的开源库

想了解一下桌面软件开发中可能使用到的dll库 联想锁屏 libcef-常用概念-框架特点-CSDN博客 libcurl库使用详情、libcurl库的制作-CSDN博客 使用Cef和Qt做一个跨平台的多标签多窗口浏览器_cef3 多个标签-CSDN博客 cef 依赖的文件 libcef - Bigben - 博客园 (cnblogs.com) Q…

Hikyuu 2.0.2 发布,高性能量化交易研究框架

新增特性 历史财务信息入库&#xff0c;对于使用 MySQL 存储&#xff0c;可以直接使用服务端的财务数据&#xff08;之前只能在执行数据下载的机器上获取&#xff09;增加指标 FINANCE 获取相应历史财务数据&#xff0c;具体财务字段信息可通过StockManager.get_history_finan…

Android AIDL接口

一.AlDI接口简介 AIDL&#xff08;Android Interface Definition Language&#xff09;是一种 IDL 语言&#xff0c;用于生成可以在 Android 设备上两个进程之间进行进程间通信&#xff08;IPC&#xff09;的代码。 通过 AIDL&#xff0c;可以在一个进程中获取另一个进程的数据…

开源博客项目Blog .NET Core源码学习(16:App.Hosting项目结构分析-4)

本文学习并分析App.Hosting项目中前台页面的文章专栏页面和文章详情页面。< 文章专栏页面 文章专栏页面总体上为左右布局&#xff0c;左侧显示文章列表&#xff0c;右侧从上向下为关键词搜索、分类导航、热门文章等内容。整个页面使用了layui中的面包屑导航、表单、模版、流…

MySQL数据库外键约束打开与关闭 ️

MySQL数据库外键约束打开与关闭 &#x1f6e0;️ MySQL数据库外键约束打开与关闭 &#x1f6e0;️摘要 &#x1f4dd;引言 &#x1f680;正文内容&#xff08;详细介绍&#xff09; &#x1f4a1;关闭外键约束检查外键约束检查关闭的作用风险与最佳实践建议 &#x1f914; QA环…

使用Spring进行文件的上传和下载

概览 使用Spring进行文件的上传和下载Spring上传文件接口设计dubbo接口设计上传文件流的RPC的接口设计 Spring文件下载接口设计dubbo接口设计下载文件流的RPC的接口设计 spring上传文件大小控制 使用Spring进行文件的上传和下载 本文主要介绍在Spring框架下面调用微服务的dubb…

LeetCode36: 有效的数独(Java)

题目&#xff1a; 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例…

一次Ambari安装记录

引言 Ambari是一个开源的Apache项目,它提供了一个直观易用的Web界面,用于管理、监控和配置Apache Hadoop集群。它是一个集群管理工具,可以帮助管理员轻松地部署、管理和监控Hadoop集群的各种组件,如HDFS、YARN、MapReduce、Hive、HBase等。通过Ambari,用户可以在集群中添…

OerOerlikonTCO1200欧瑞康LPCVD system操作使用说明

OerOerlikonTCO1200欧瑞康LPCVD system操作使用说明

DQ-DETR: DETR WITH DYNAMIC QUERY FOR TINY OBJECTDETECTION 学习笔记

论文地址&#xff1a;https://arxiv.org/pdf/2404.03507.pdf 此DQ-DETR与IDEA提出的同名&#xff0c;该文主要集中于小目标的检测 尽管之前的类似DETR的方法在通用目标检测中取得了成功&#xff0c;但在小目标检测方面仍然具有挑战性&#xff0c;因为目标 Query 的位置信息并未…

LWIP开启ARP之后进入硬件错误中断

遇到个很奇怪的问题&#xff0c;如下图只要开启ARP之后&#xff0c;就会进入硬件错误中断&#xff0c;关掉就好了。 而无法开启ARP&#xff0c;就不能ping 通&#xff0c;所以必须要解决这个问题。 最终debug发现死在memcpy函数位置 这样原因就很好分析了&#xff0c; 共4个拷…

通过linux工具iftop命令查看视频监控平台是否收到监控摄像头的视频流(视频监控平台接收和转发的视频流)

目录 一、需求描述 二、解决思路 &#xff08;一&#xff09;问题分析 &#xff08;二&#xff09;解决思路 1、通过抓包的方式 2、通过一些linux的网络监视工具 三、需求实现 &#xff08;一&#xff09;抓包工具 1、tcpdump 2、Wireshark 3、tcptrace &#xff0…

【刷题】 二分查找进阶

送给大家一句话&#xff1a; 你向神求助是因为相信神&#xff0c;神没有回应你是因为神相信你 ε≡٩(๑>₃<)۶ &#xfeff;ε≡٩(๑>₃<)۶ &#xfeff;ε≡٩(๑>₃<)۶ 一心向学 二分查找进阶 1 前言Leetcode 852. 山脉数组的峰顶索引题目描述算法思…