Language:
Page Info
Engine Version:
Share

1. 自定义Pawn

刚开始了解 虚幻引擎4 时,建议先阅读编程快速入门 教程 。阅读此教程之前应先熟悉创建项目、添加C++代码和编译代码的操作。

  1. 首先我们将新建一个含初学者内容包的基础代码项目,命名为HowTo_PlayerInput。然后再将一个自定义 Pawn 类添加到项目(我们称之为MyPawn)。

    Pawn是一种由真人玩家或AI所控制的 Actor

    AddPawn.png

    NameYourNewPawn.png

  2. 首先需要设置MyPawn在游戏开始时自动响应玩家输入。Pawn类提供一个可在初始化中设置的变量,其将进行处理。在MyPawn.cpp中将以下代码添加到 AMyPawn::AMyPawn

    // 将此pawn设为受最低数字的玩家控制
    AutoPossessPlayer = EAutoReceiveInput::Player0;
  3. 接下来我们将构建几个基础 组件。如需了解在代码中添加和管理组件的更多内容,以及会遇到的部分常见组件类型,请阅读组件和碰撞 教程 。为对将要创建的组件进行追踪,应将以下代码添加到类定义底部的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->SetupAttachment(RootComponent);
    OurCamera->SetRelativeLocation(FVector(-250.0f, 0.0f, 250.0f));
    OurCamera->SetRelativeRotation(FRotator(-45.0f, 0.0f, 0.0f));
    OurVisibleComponent->SetupAttachment(RootComponent);
  4. 现在即可保存修改,用 Visual Studio 中的 编译(Build) 命令或 虚幻编辑器 中的 编译(Compile) 按钮进行编译。


设置好相应游戏输入的自定义Pawn后,则需要对输入进行定义。执行方法是在 虚幻编辑器 中配置项目的 输入设置

编写中代码

MyPawn.h

// Copyright 1998-2018 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:
    // 设置默认值
    AMyPawn();

protected:
    // 游戏开始时或生成时调用
    virtual void BeginPlay() override;

public:
    // 每帧调用
    virtual void Tick( float DeltaSeconds ) override;

    // 调用后将功能绑定到输入
    virtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override;

    UPROPERTY(EditAnywhere)
    USceneComponent* OurVisibleComponent;
};

MyPawn.cpp

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

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

// 设置默认值
AMyPawn::AMyPawn()
{
    // 设置此pawn在每帧调用Tick()。如果不需要,则可将其关闭来改善性能。
    PrimaryActorTick.bCanEverTick = true;

    // 将此pawn设为受最低数字的玩家控制
    AutoPossessPlayer = EAutoReceiveInput::Player0;

    // 创建一个可附加内容的虚拟根组件。
    RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));
    // 创建一个相机和一个可见物
    UCameraComponent* OurCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("OurCamera"));
    OurVisibleComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("OurVisibleComponent"));
    // 将相机和可见物附加到根组件。偏移并旋转相机。
    OurCamera->SetupAttachment(RootComponent);
    OurCamera->SetRelativeLocation(FVector(-250.0f, 0.0f, 250.0f));
    OurCamera->SetRelativeRotation(FRotator(-45.0f, 0.0f, 0.0f));
    OurVisibleComponent->SetupAttachment(RootComponent);
}

// 游戏开始时或生成时调用
void AMyPawn::BeginPlay()
{
    Super::BeginPlay();

}

// 每帧调用
void AMyPawn::Tick( float DeltaTime )
{
    Super::Tick( DeltaTime );

}

// 调用后将功能绑定到输入
void AMyPawn::SetupPlayerInputComponent(class UInputComponent* InputComponent)
{
    Super::SetupPlayerInputComponent(InputComponent);

}