PlayerInput 对象负责将玩家的输入转换为Actor(如PlayerController或Pawn)能够 理解并使用的数据。它是输入处理流程的一部分,该流程使用PlayerInput映射和InputComponent将来自玩家的硬件输入转换为游戏事件和移动。
有关设置输入的示例,请参阅设置输入 文档。
硬件输入
来自玩家的硬件输入非常简单。它通常包括按键、点击鼠标或移动鼠标、按控制器按钮或移动操纵杆。对于不符合标准轴或按钮索引的专用输入设备,或具有非常见输入范围的专用输入设备,可以使用RawInput插件 进行手动配置。
PlayerInput
PlayerInput是用于管理玩家输入的PlayerController类中的UObject。它仅在客户端上生成。PlayerInput中定义了 两种结构体。第一种是 FInputActionKeyMapping,它定义了操作映射(ActionMapping)。另一种是 FInputAxisKeyMapping,它定义了轴映射(AxisMapping)。 在操作映射(ActionMapping)和轴映射(AxisMapping)中使用的硬件输入定义都是在InputCoreType中建立的。
- ActionMappings
将离散按钮或按键映射到一个"友好的名称",该名称稍后将与事件驱动型行为绑定。最终的效果是,按下(和/或释放)单个键、鼠标按钮或键盘按钮将直接触发某个游戏行为。
- AxisMappings
将键盘、控制器或鼠标输入映射到一个"友好的名称",该名称稍后将绑定到连续的游戏行为,例如移动。在轴映射(AxisMapping)中映射的输入会被持续轮询,即使当它们刚刚报告它们的输入值当前为零时也是如此。这可实现移动或其他游戏行为的平稳过渡,而不是由操作映射(ActionMapping)中输入所触发的离散游戏事件。
硬件轴(例如控制器操纵杆)提供输入的程度,而不是离散的1(按下)或0(不按下)输入。也就是说,它们可以被小幅度或大幅度地移动,而你角色的移动也会相应地变化。虽然这些输入方法非常适合提供可扩展的移动输入量,但轴映射(AxisMapping)也可以将常见的移动键(如WASD键或上下左右方向键)映射到持续轮询的游戏行为。
设置输入映射
输入映射存储在配置文件中,可以在项目设置(Project Settings)的输入部分进行编辑。
在关卡编辑器(Level Editor)中,选择 编辑>项目设置(Edit > Project Settings)。
在显示的 项目设置(Project Settings) 选项卡中,单击 输入(Input)。
在此窗口中,你可以:
更改(硬件)轴输入的属性(Change the properties of (hardware) axis inputs):
添加或编辑操作映射(Add or edit ActionMappings):
添加或编辑轴映射(Add or edit AxisMappings):
InputComponent
InputComponents 最常出现在Pawn和控制器中,但如果需要,也可以在其他Actor和关卡脚本中设置它们。InputComponent 将项目中的轴映射(AxisMapping)和操作映射(ActionMapping)链接到
以C++代码或蓝图图表建立的游戏操作(通常为函数)。
InputComponent用于执行输入处理的优先级堆栈如下(最高优先级优先):
其"接受输入(Accepts input)"已启用的Actor,从最晚启用者到最早启用者。
如果你希望某个特定的Actor总是第一个被考虑进行输入处理的Actor,那么你可以重新启用它的"接受输入(Accepts input)",该Actor将被移动到堆栈的顶部。
控制器。
关卡脚本。
Pawn。
如果一个InputComponent获得了输入,那么它在堆栈的后继部分将不再可用。
输入处理程序
示例 - 向前移动
此示例取自虚幻引擎4随附提供的第一人称模板。
玩家的硬件输入(Hardware Input from Player):玩家按下W键。
玩家输入映射(PlayerInput Mapping):轴映射(AxisMapping)将W转换为比例为1的"向前移动(MoveForward)"。
InputComponent优先级堆栈(InputComponent Priority Stack):继续操作InputComponent优先级堆栈,"向前移动(MoveForward)"输入的第一个绑定位于AFirstPersonBaseCodeCharacter类中。此类是当前玩家的Pawn,所以它的InputComponent排在最后检查。
void AFirstPersonBaseCodeCharacter::SetupPlayerInputComponent(class UInputComponent* InputComponent) { // set up gameplay key bindings check(InputComponent); ... InputComponent->BindAxis("MoveForward", this, &AFirstPersonBaseCodeCharacter::MoveForward); ... }
这一步也可以在蓝图中通过在角色的事件图(EventGraph)中设置一个InputAxis MoveForward节点来完成。无论这个节点连接到什么对象,该对象都是按下W键时将执行的对象。
游戏逻辑(Game Logic):AFirstPersonBaseCodeCharacter的MoveForward函数执行。
void AFirstPersonBaseCodeCharacter::MoveForward(float Value) { if ( (Controller != NULL) && (Value != 0.0f) ) { // find out which way is forward FRotator Rotation = Controller->GetControlRotation(); // Limit pitch when walking or falling if ( CharacterMovement->IsMovingOnGround() || CharacterMovement->IsFalling() ) { Rotation.Pitch = 0.0f; } // add movement in that direction const FVector Direction = FRotationMatrix(Rotation).GetScaledAxis(EAxis::X); AddMovementInput(Direction, Value); } }
蓝图实现:
触摸界面
默认情况下,在触控设备上运行的游戏将拥有两个虚拟操纵杆(就像一个主机控制器)。你可以在 项目设置(Project Settings) 中的 输入(Input) 部分使用 默认触摸界面(Default Touch Interface) 属性
更改操纵杆。这将指向一个触摸界面设置(Touch Interface Setup)资源。默认的 DefaultVirtualJoysticks 位于共享引擎内容中(/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks
)。
还有一个仅有左操纵杆的版本 LeftVirtualJoystickOnly,适用于不需要转动摄像机的游戏。
请注意,你需要选中对象选取器 视图选项(View Options) 设置中的 显示引擎内容(Show Engine Content) 复选框才能看到这些内容。
如果你不想要任何虚拟操纵杆,只需清除默认触摸界面(Default Touch Interface)属性。此外,你可以通过选中始终显示触摸界面(Always Show Touch Interface)(或者通过使用-faketouches运行PC游戏)来强制让你的游戏的触摸界面 独立于它所运行的平台。