2. 配置游戏输入

有两种输入映射类型: 动作映射和坐标轴映射。

您可以把 Action Mappings (动作映射)想象成"是或否"的输入,类似于鼠标按键或摇杆按键。 当在短时间内按键、松开、双击或按住不放时,它们会进行该项操作的汇报。 离散事件的动作,诸如跳跃、射击或与物体互动都可以使用这种类型的映射。

Axis Mappings (坐标轴映射)是持续不断的 - 您可以把它们想象成为"数量"输入,例如摇杆上的杆,或者鼠标指针的位置。 它们会在每一帧汇报其值,即使在不移动时也是如此。 一般涉及到量级或方向的内容,比如行走、到处看、开车等都可以用这种方式来处理。

您可以在代码中直接定义输入映射,但一般的方式是在 虚幻引擎 编辑器中定义它们,这也是我们在本篇教程中采用的方法。

  1. 虚幻引擎 编辑器中,在 编辑 下拉菜单中,我们点击 项目设置 选项。

    EditProjectSettings.png

  2. 在该处,我们选择左侧的 引擎 部分的 输入 选项。 我们可以随后展开位于右侧的 绑定 分类,然后添加一个 Action Mapping (动作映射)和两个 Axis Mappings (坐标轴映射)。

    点击 Action Mapping (动作映射)或 Axis Mappings (坐标轴映射)部分的标题旁的加号将可以添加新的映射。 左侧的展开箭头可以用来显示或隐藏映射。 如需添加额外的输入到映射中,请点击映射旁的加号。 接下来是我们需要的映射和输入。 您可以记一下"S" 和 "A"输入的负值。

    动作映射
    增加 空格键
    坐标轴映射
    MoveX W 1.0
    S -1.0
    MoveY A -1.0
    D 1.0

    ConfigureInput.png

  3. 现在我们的输入已经配置完成,让我们在关卡中设置MyPawn。 MyPawn类将会出现在 内容浏览器 中,而且可被拖曳到 关卡编辑器 中。

    ClassInContentBrowser.png

    PawnInSceneView.png

  4. 还需一步就可以完成 MyPawn 的设置。 我们把它命名为 Static Mesh (静态网格物体),这样就能在游戏中看到它。 我们可以选择刚创建的 MyPawn ,选择在 Details Panel (详细信息面板)中命名为"OurVisibleComponent (Inherited)"的组件,然后通过 Static Mesh (静态网格物体)分类的下拉框来分配资源。 对这个教程来说,"Shape_Cylinder"是一个很好的资源。

    StaticMesh.png

  5. 我们现在可以保存关卡并返回 Visual Studio 来书写代码,这样将会让我们放置的MyPawn对我们定义的输入进行响应。


我们现在可以完成在 Visual Studio 中的MyPawn类的编码。

正在开发中的代码

MyPawn.h

// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

#pragma once

#include "GameFramework/Pawn.h"
#include "MyPawn.generated.h"

UCLASS()
class HOWTO_PLAYERINPUT_API AMyPawn : public APawn
{
    GENERATED_BODY()

public:
    // Sets default values
    AMyPawn();

    // Called when the game starts or when spawned
    virtual void BeginPlay() override;

    // Called every frame
    virtual void Tick( float DeltaSeconds ) override;

    // Called to bind functionality to input
    virtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override;

    UPROPERTY(EditAnywhere)
    USceneComponent* OurVisibleComponent;
};

MyPawn.cpp

// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

#include "HowTo_PlayerInput.h"
#include "MyPawn.h"

// Sets default values
AMyPawn::AMyPawn()
{
    // Set this pawn to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;

    // Set this pawn to be controlled by the lowest-numbered player
    AutoPossessPlayer = EAutoReceiveInput::Player0;

    // Create a dummy root component we can attach things to.
    RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));
    // Create a camera and a visible object
    UCameraComponent* OurCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("OurCamera"));
    OurVisibleComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("OurVisibleComponent"));
    // Attach our camera and visible object to our root component. Offset and rotate the camera.
    OurCamera->AttachTo(RootComponent);
    OurCamera->SetRelativeLocation(FVector(-250.0f, 0.0f, 250.0f));
    OurCamera->SetRelativeRotation(FRotator(-45.0f, 0.0f, 0.0f));
    OurVisibleComponent->AttachTo(RootComponent);
}

// Called when the game starts or when spawned
void AMyPawn::BeginPlay()
{
    Super::BeginPlay();

}

// Called every frame
void AMyPawn::Tick( float DeltaTime )
{
    Super::Tick( DeltaTime );

}

// Called to bind functionality to input
void AMyPawn::SetupPlayerInputComponent(class UInputComponent* InputComponent)
{
    Super::SetupPlayerInputComponent(InputComponent);

}