输入

输入对象负责将玩家的输入转换为以Actor能够理解和使用之形式表现的数据。

Windows
MacOS
Linux

PlayerInput 对象负责将玩家的输入转换为Actor(如PlayerController或Pawn)能够 理解并使用的数据。它是输入处理流程的一部分,该流程使用PlayerInput映射和InputComponent将来自玩家的硬件输入转换为游戏事件和移动。

有关设置输入的示例,请参阅设置输入文档。

硬件输入

来自玩家的硬件输入非常简单。它通常包括按键、点击鼠标或移动鼠标、按控制器按钮或移动操纵杆。对于不符合标准轴或按钮索引的专用输入设备,或具有非常见输入范围的专用输入设备,可以使用RawInput插件进行手动配置。

PlayerInput

PlayerInput是用于管理玩家输入的PlayerController类中的UObject。它仅在客户端上生成。PlayerInput中定义了 两种结构体。第一种是 FInputActionKeyMapping,它定义了操作映射(ActionMapping)。另一种是 FInputAxisKeyMapping,它定义了轴映射(AxisMapping)。 在操作映射(ActionMapping)和轴映射(AxisMapping)中使用的硬件输入定义都是在InputCoreType中建立的。

ActionMappings

将离散按钮或按键映射到一个“友好的名称”,该名称稍后将与事件驱动型行为绑定。最终的效果是,按下(和/或释放)单个键、鼠标按钮或键盘按钮

AxisMappings

将键盘、控制器或鼠标输入映射到一个“友好的名称”,该名称稍后将绑定到连续的游戏行为,例如移动。在轴映射(AxisMapping)中映射的输入会被持续轮询,即使当它们刚刚报告它们的输入值

设置输入映射

输入映射存储在配置文件中,可以在项目设置(Project Settings)的输入部分进行编辑。

  1. 在关卡编辑器(Level Editor)中,选择 编辑>项目设置(Edit > Project Settings)

    ProjectSettingsMenu.png

  2. 在显示的 项目设置(Project Settings) 选项卡中,单击 输入(Input)

在此窗口中,您可以:

更改(硬件)轴输入的属性(Change the properties of (hardware) axis inputs): AxisConfig.png

添加或编辑操作映射(Add or edit ActionMappings): ActionMappings.png

添加或编辑轴映射(Add or edit AxisMappings): AxisMappings.png

InputComponent

InputComponents 最常出现在Pawn和控制器中,但如果需要,也可以在其他Actor和关卡脚本中设置它们。InputComponent 将项目中的轴映射(AxisMapping)和操作映射(ActionMapping)链接到 以C++代码或蓝图图表建立的游戏操作(通常为函数)。

InputComponent用于执行输入处理的优先级堆栈如下(最高优先级优先):

  1. 其“接受输入(Accepts input)”已启用的Actor,从最晚启用者到最早启用者。

    如果您希望某个特定的Actor总是第一个被考虑进行输入处理的Actor,那么您可以重新启用它的“接受输入(Accepts input)”,该Actor将被移动到堆栈的顶部。

  2. 控制器。

  3. 关卡脚本。

  4. Pawn。

如果一个InputComponent获得了输入,那么它在堆栈的后继部分将不再可用。

输入处理程序

InputFlow.png

示例 - 向前移动

此示例取自虚幻引擎4随附提供的第一人称模板。

  1. 玩家的硬件输入(Hardware Input from Player):玩家按下W键。

  2. 玩家输入映射(PlayerInput Mapping):轴映射(AxisMapping)将W转换为比例为1的“向前移动(MoveForward)”。

    AxisMappingW.png

  3. 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键时将执行的对象。

    InputMappingMoveForward.png

  4. 游戏逻辑(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);
            }
        }

    蓝图实施:

    MoveForward_Blueprint.png

触摸界面

默认情况下,在触控设备上运行的游戏将拥有两个虚拟操纵杆(就像一个主机控制器)。您可以在 项目设置(Project Settings) 中的 输入(Input) 部分使用 默认触摸界面(Default Touch Interface) 属性 更改操纵杆。这将指向一个触摸界面设置(Touch Interface Setup)资源。默认的 DefaultVirtualJoysticks 位于共享引擎内容中(/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks)。 还有一个仅有左操纵杆的版本 LeftVirtualJoystickOnly,适用于不需要转动摄像机的游戏。

VirtualJoysticksSettings.png

请注意,您需要选中对象选取器 视图选项(View Options) 设置中的 显示引擎内容(Show Engine Content) 复选框才能看到这些内容。

showenginecontent.png

如果您不想要任何虚拟操纵杆,只需清除默认触摸界面(Default Touch Interface)属性。此外,您可以通过选中始终显示触摸界面(Always Show Touch Interface)(或者通过使用-faketouches运行PC游戏)来强制让您的游戏的触摸界面 独立于它所运行的平台。

标签
Select Skin
Light
Dark

欢迎来到全新虚幻引擎4文档站!

我们正在努力开发新功能,包括反馈系统,以便您能对我们的工作作出评价。但它目前还未正式上线。如果您对此页面有任何意见与在使用中遭遇任何问题,请前往文档反馈论坛告知我们。

新系统上线运行后,我们会及时通知您的。

发表反馈意见