增强输入系统
增强输入系统与旧的虚幻输入系统相比,对触发传入的参数进行了升级,可以实现组合,长按等功能,用于处理复杂的输入逻辑。
要启用增强输入系统,则首先在Pulgins中启用EnhancedInputPlugin插件,随后重新打开项目,在Project Settings-Input中找到Default Class,其中可以找到两个类设置,两者均选择Enhanced类。完成使用增强输入系统的初步设置。
要在C++中使用,还需要一些额外的工作,在项目的Build.cs文件中的AddRange中添加*”EnhancedInput”*。
完成所有的前置工作后,就可以在C++中使用增强输入系统了。
基础使用
首先在内容浏览器中新建一个名为Input的文件夹用于保存所有输入,右键可以看到Input选项,在里面有Input Action和Input Mapping Context两个资产,这两个资产用于保存输入动作和输入映射上下文。
完成跳跃逻辑
新建一个Input Action,命名为IA_Jump,并打开,我们主要关心面板中的Value Type和Triggers两个选项。
在Value Type中可以选择值类型,分别为bool、float、Vector2D、Vector四个,分别代表瞬间动作,一维轴向输入,二维轴向输入以及三维轴向输入。
在Triggers中选择触发方式,分别为Chorded Action(组合)、Combo、Down等等,意如其名。
对于跳跃逻辑,选择bool作为值类型,Pressed和Released作为触发类型。
进入VS中,在角色类(需要Input的类)中做如下声明:
1 | //添加所需头文件 |
在绑定之前仍需要一些准备工作,进入到BeginPlay中:
1 | void AMainCharacter::BeginPlay() |
正式进入绑定,在SetPlayerInputComponent中进行绑定:
1 | void AMainCharacter::SetPlayerInputComponent(UInputComponent* PlayerInputComponent) |
OnJump的实现:
1 | void AMainCharacter::OnJump(const FInputActionValue& InputValue) |
都完成后回到编辑器,打开创建的Context,对按键进行绑定,选择JumpAction并设置相应的按键。
完成后编译,在蓝图中对暴露的Action和Context进行赋值,编译,运行后按下绑定的跳跃键角色就可以跳跃了。
绑定角色的移动和视角旋转
过程与上述大致相同,不同在于对两个方法的实现上有差异。
同样在类中添加新的成员:
1 | class AMainCharacter |
在BeginPlay中添加新的绑定:
1 | if(AxisContext){ |
在AxisContext中添加新的绑定:
1 | void AMainCharacter::SetPlayerInputComponent(UInputComponent* PlayerInputComponent) |
Move和Look的实现,不同之处在于对输入值得获取:
1 | void AMainCharacter::CharacterMove(const FInputActionValue& InputValue) |
同样回到编辑器中对Action和Context进行绑定。
将Action的Value Type设置为FVector2D。
在Context中,设置两个Action,以Move举例:
分别设置四个按键(键盘)WASD,我们希望W前进,S后退,A向左,D向右,当实际按下的时候值为1,未按下时为0,为此我们需要做一些修改。
在四个键的Modifiers中,对于WD添加一个元素并选择SWizzle Input Axis Values表示这是个轴向输入;对于AS两个键,选择Negate,用来反转输入,这样WASD就可以实现前后左右的输入。
对于Look来说,我们选择鼠标,这与旧的虚幻输入事件类似,如果使用的是手柄,因为本身就是轴向的,所以考虑是否将值反转即可。
至此就完成了基本的输入事件绑定。
增强输入的一些参数解释
在Action中已经对Value Type和Triggers做出了一些解释,就不在说明。
在Action和Context中,都有一个Modifiers选择,Modifiers是对输入数据进行处理,就像上面的一样,我们需要对一些按键进行反转操作,就可以用Modifiers来处理。
此外Modifiers来包含一些其他的处理方法:Dead Zone用来过滤无效的输入数据,对于手柄一些来说,摇杆可能会自己触发导致角色运动,为了解决这一问题可以选择一个Dead Zone来限制输入值。还有Negate用来反转输入,Scaler用于放大输入值等等。
对于触发方式,在绑定时看到是ETriggerEvent的枚举类型,直接查看它的定义:
1 | enum class ETriggerEvent : uint8 |
Triggered表示事件触发,是一个连续事件;Started表示只触发一次,在按下时执行;Ongoing表示持续的动作;Canceled表示取消操作;Completed表示完成操作。
对于FInputActionValue,是用于储存输入的值,在使用是可以通过Get
参考
关于增强输入的官方参考文档:https://docs.unrealengine.com/5.3/zh-CN/enhanced-input-in-unreal-engine/
其中实现是使用蓝图实现,这里使用C++实现,使用蓝图实现直接参照官方文档即可。
- 本文作者: KongXinQing
- 本文链接: https://13114987559.github.io/2023/11/17/essay/虚幻增强输入系统/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!