1. 自定义Pawn

如果您刚使用 虚幻引擎4 ,建议您先读一下编程快速入门 tutorial 。 对这篇教程来说,我们假设您已经了解了如何创建项目,如何添加C++代码到项目中,以及如何编译您的代码。

  1. 首先我们创建全新的、基础代码项目,附带初学者内容,其名称为"HowTo_PlayerInput"。 然后,我们会添加自定义 Pawn 类到项目中,我们将其称为"MyPawn"。

    PawnActor 的一种,旨在由人类玩家或AI(人工智能)来进行控制。

    AddPawn.png

    NameYourNewPawn.png

  2. 首先我们要设置MyPawn,使之在游戏开始时能自动响应玩家输入。 Pawn 类提供了一个变量,可供我们在初始化时进行设置,从而为我们处理该内容。 在MyPawn.cpp中,添加以下代码到 AMyPawn::AMyPawn

    // 将此pawn设置为由最低数量的玩家进行控制
    AutoPossessPlayer = EAutoReceiveInput::Player0;
  3. 接下来,我们会构建几个基础的 Components (组件)。 如果您想要学习更多关于在代码中添加和管理 组件 的内容,以及所要使用的 组件 的通用类型,请读一下组件和碰撞 tutorial 。 为了追溯我们将要创建的 组件 ,我们应添加以下代码到MyPawn.h中,将其放置在类定义的底部位置:

    UPROPERTY(EditAnywhere)
    USceneComponent* OurVisibleComponent;

    这个变量被标记为 UPROPERTY ,所以可以在 虚幻引擎 中看到它。 这个变量很重要,因为它可以防止游戏启动时或项目或关卡的关闭和重新载入时的变量重置。

    MyPawn.cpp中,我们添加以下代码到 AMyPawn::AMyPawn

    // 创建一个可供添加对象的空根组件。
    RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));
    // 创建相机和可见项目
    UCameraComponent* OurCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("OurCamera"));
    OurVisibleComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("OurVisibleComponent"));
    // 附加相机和可见对象到根组件。 偏移并旋转相机。
    OurCamera->AttachTo(RootComponent);
    OurCamera->SetRelativeLocation(FVector(-250.0f, 0.0f, 250.0f));
    OurCamera->SetRelativeRotation(FRotator(-45.0f, 0.0f, 0.0f));
    OurVisibleComponent->AttachTo(RootComponent);
  4. 我们现在可以使用 Visual StudioBuild (编译)命令,或者 Unreal Engine (虚幻引擎)编辑器的 Compile (编译)按钮来保存变更并进行编译了。


现在我们有一个自定义的 Pawn 来响应游戏输入,我们需要对该输入进行定义。 为了完成这个目标,我们会在 虚幻引擎 编辑器中配置项目的 Input Settings (输入设置)。

正在开发中的代码

MyPawn.h

// Copyright 1998-2016 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-2016 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);

}