UE5增强输入系统 Enhanced Input

news2024/12/26 13:45:53

关键字:
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 在框架上用于数据层,为业务流程搭建做方法支撑
    “框架”与“架构”有区别。架构范围更大。单专业做模块或子系统叫框架,跨专业做总体叫架构。
  • 事件中可以包含函数、函数中不可以包含事件
  • 将事件与函数有效解耦的过程,可以参考《设计模式》、《设计范式》

举一个错误的例子,问题如下图
请添加图片描述
错误效果如下图,缺少抬起按键,输出0复位。
在这里插入图片描述
上图问题在于:Triggered只能发出按下的事件。抬起按键时刻 Action Value = 0 复位,但这个事件 E Go Forward 接收不到。
正确的如下图,一定要有Completed,否则失败。
请添加图片描述
测试效果
按下WSADQE键,有 0 ,功能正常,测试通过
请添加图片描述

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

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

相关文章

Stable diffusion中这些重要的参数你一定要会用

Stable diffusion中这些重要的参数你一定要会用 如果你已经使用Stable diffusion AI模型生成了一些图像&#xff0c;但发现它们并不完全符合你的期望&#xff0c;不用担心&#xff0c;你可以通过调整一些基本的生成参数来进行自定义&#xff0c;以达到更加满意的效果。 使用S…

2024年——区块链技术进入全新高度

随着区块链技术的不断发展&#xff0c;铭文系统作为其重要组成部分&#xff0c;逐渐引起了人们的关注。本文将从技术原理、应用场景、未来发展等方面&#xff0c;对区块链中的铭文系统进行深入探讨。 【技术原理】 铭文系统是一种利用区块链技术实现的数字身份认证系统。在区…

(Oracle)SQL优化案例:组合索引优化

项目场景 项目上的ETL模型里有如下SQL语句。执行速度非常慢&#xff0c;每次只查询200条数据&#xff0c;但却需要20多秒的时间。再加上该SQL查询出的数据同步频率很高&#xff0c;这个速度是完全不能忍受的。 因为项目隐私&#xff0c;所以对表及字段做了改写。 SELECT ID…

嵌入式Linux八股(三)——计算机基础

三、计算机基础 01.操作系统 01.进程几种状态 02.锁 互斥锁&#xff1a;互斥锁是一种用于线程同步的工具&#xff0c;能够保证同一时刻只有一个线程可以访问共享资源。如果一个线程已经取得了互斥锁&#xff0c;其他尝试获得该锁的线程将会被阻塞&#xff0c;直到第一个线程…

基于springboot+vue的游艇停泊系统

一、系统架构 前端&#xff1a;vue2 | element-ui |html 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. web端-登录 02. web端-系统首页1 03. web端-系统首页2 04. web端-泊位 05. web…

【南京工程学院×朗汀留学】部分录取案例合集

朗汀留学 X 南京工程学院 作为深耕留学的专业资深团队&#xff0c;朗汀留学成功帮助上千名学生出国留学。 在此我们将南京工程学院的部分留学案例作以总结&#xff0c;以供新生参考。再次恭喜所有 获得理想大学offer的学生们&#xff0c;你们的努力让梦想照进现实。 学校介绍…

linux下编译c++程序报错“undefined reference to `std::allocator<char>::allocator()‘”

问题 linux下编译c程序报错“undefined reference to std::allocator::allocator()”。 原因 找不到c标准库文件。 解决办法 开始尝试给gcc指令添加-L和-l选项指定库路径和库文件名&#xff0c;但是一直不成功&#xff0c;后来把gcc改为g就可以了。

关于路由过滤、路由策略的实验eNSP

具体接口IP地址如下图所示 第一步&#xff1a;配置IP R1: [R1]int g 0/0/0 [R1-GigabitEthernet0/0/0]ip ad [R1-GigabitEthernet0/0/0]ip address 100.1.1.1 24 Apr 23 2024 19:35:38-08:00 R1 %%01IFNET/4/LINK_STATE(l)[0]:The line protocol IP on the interface Giga…

智能AI伪原创,高效率一键生成优质文章

如今&#xff0c;内容创作已经成为许多企业和个人关注的焦点。然而&#xff0c;随着信息量的不断增加&#xff0c;想要在短时间内创作出优质的文章成为了一个挑战。但随着人工智能技术的飞速发展&#xff0c;智能AI伪原创的出现&#xff0c;为我们提供了一种全新的解决方案。这…

TensorRT plugins and ONNX parser编译

https://github.com/NVIDIA/TensorRT是TensorRT plugins and ONNX parser&#xff0c;并不包含TensorRT的nvinfer库&#xff08;libinfer.so、nvinfer.dll&#xff09;&#xff0c;此部分并未开源&#xff0c;只能使用官方支持的平台、环境https://developer.nvidia.com/tensor…

【打工日常】云原生之使用Docker部署开源云笔记工具Leanote

一、Leanote蚂蚁笔记介绍 1.Leanote简介 Leanote 蚂蚁笔记是一款国产开源的私有云笔记工具。它支持普通格式笔记、Markdown语法、专业数学公式编辑、和思维导图&#xff0c;并且支持vim&emacs等编辑模式。 2.Leanote功能 拥有Markdown 语法支持、无干扰写作模式、Vim和Ema…

值传递和地址传递

文章目录 目录值传递地址传递 目录 值传递 package com.zhang.parameter; //值传递 public class MethodDemo1 {public static void main(String[] args) {int a 10;System.out.println(a);System.out.println("~~~~~~~~~~~~~~~");change(a);//无论你传入的是什么 …

el-select下拉框远程搜索且多选时,编辑需要回显的一个简单案例

前端业务开发中不管使用vue2~3&#xff0c;还是react&#xff0c;angular各种前端技术栈&#xff0c;经常会遇到这种业务。一个下拉框Select中&#xff0c;不仅需要需要支持远程模糊搜索&#xff0c;还需要支持多选。并且在编辑时&#xff0c;还能正常把已经多选好的内容回显到…

租房管理|基于SprinBoot+vue的租房管理系统(源码+数据库+文档)

租房管理目录 基于SprinBootvue的租房管理系统 一、前言 二、系统设计 三、系统功能设计 前台 后台 管理员 订单信息管理 屋主申诉管理 屋主权限 房源信息管理 订单信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…

微信小程序开发工具的使用,各个配置文件详解,小程序开发快速入门

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

wfs 文件存储系统 v1.0.5

前言&#xff1a;wfs 是高性能海量小文件存储系统 &#xff0c;支持Linux&#xff0c;Windows&#xff0c;Macos&#xff0c;FreeBSD等系统&#xff0c; 可以高效地进行文件存储和读取。wfs 支持文件压缩归档&#xff0c;并提供简洁的数据读取方式和文件后台管理和 以及归档文件…

STM32学习和实践笔记(14):按键控制实验

消除抖动有软件和硬件两种方法 软件方法就是在首次检测到低电平时加延时&#xff0c;通常延时5-10ms&#xff0c;让抖动先过去&#xff0c;然后再来检测是否仍为低电平&#xff0c;如果仍然是&#xff0c;说明确实按下。 硬件方法就是加RC滤波电路&#xff0c;硬件方法会增加…

SystemUI GlobalActions plugin解析

com.android.systemui.action.PLUGIN_GLOBAL_ACTIONS 系统的默认实现为GlobalActionsImpl: 是谁发送了showShutdownUi指令&#xff1f; GlobalActionsImpl 是通过inject的方式创建的 GlobalActionsComponent是一个system UI services&#xff0c;配置在config.xml中&#xff…

架构师系列-Nginx、OpenResty(一)- 基本使用配置

Nginx 模块 高度模块化的设计是 Nginx 的架构基础&#xff0c;Nginx 服务器被分解为多个模块&#xff0c;每个模块就是一个功能模块&#xff0c;只负责自身的功能&#xff0c;模块之间严格遵循“高内聚&#xff0c;低耦合”的原则。 核心模块 核心模块是 Nginx 服务器正常运行…

vue2项目升级到vue3经历分享

依据vue官方文档&#xff0c;vue2在2023年12月31日终止维护。因此决定将原来的岁月云记账升级到vue3&#xff0c;预计工作量有点大&#xff0c;于是想着把过程记录下来。 原系统使用的技术栈 "dependencies": {"axios": "^0.21.1","babel-…