输入

输入对象负责将玩家的输入转换为以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游戏)来强制让您的游戏的触摸界面 独立于它所运行的平台。

Tags
Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback