3.プログラムとゲーム アクションのバインド

入力を C++ コードにバインドします。

Windows
MacOS
Linux
On this page
  1. Visual Studio で「MyPawn.h」を開いて MyPawn のクラス定義の下部に以下のコードを追加します。

    //Input functions (入力関数)
    void Move_XAxis(float AxisValue);
    void Move_YAxis(float AxisValue);
    void StartGrowing();
    void StopGrowing();
    
    //Input variables (入力変数)
    FVector CurrentVelocity;
    bool bGrowing;

    4 つの入力関数は入力イベントとバインドされます。実行時に、新規の入力変数に格納した値を更新します。この値は MyPawn がインゲームの動作を判断するために使用します。

  2. "MyPawn.cpp" に切り替えて、宣言したばかりの 4 つの関数をプログラミングします。以下のコードを追加します。

    void AMyPawn::Move_XAxis(float AxisValue)
    {
        // Move at 100 units per second forward or backward (1 秒間に前後へ 100 単位移動)
        CurrentVelocity.X = FMath::Clamp(AxisValue, -1.0f, 1.0f) * 100.0f;
    }
    
    void AMyPawn::Move_YAxis(float AxisValue)
    {
        // Move at 100 units per second right or left (1 秒間に左右へ 100 単位移動)
        CurrentVelocity.Y = FMath::Clamp(AxisValue, -1.0f, 1.0f) * 100.0f;
    }
    
    void AMyPawn::StartGrowing()
    {
        bGrowing = true;
    }
    
    void AMyPawn::StopGrowing()
    {
        bGrowing = false;
    }

    入力から受け取る値を「-1」から「+1」の範囲に制限するために FMath::Clamp を使用します。この例では問題になりませんが、ひとつの軸に同じように影響を与える複数のキーがあれば、プレイヤーがこうした入力を同時に押すと複数の値がまとめて追加されます。例えば「W」と上向き矢印が両方ともスケール値 1.0 で MoveX にマッピングされている場合は、両方のキーを同時に押すと AxisValue は値 2.0 になります。値の範囲を制限しなければ、結果的にプレイヤーが倍速で移動することになります。

    2 つの "Move" 関数は軸値を浮動小数値で受け取る一方で、"Grow" 関数はそうでないことにお気づきかもしれません。これらは軸マッピングである MoveX と MoveY にマッピングされるため、浮動小数点のパラメータを持ちます。アクション マッピングにこのパラメータはありません。

  3. 入力関数を定義したので、バインドして適切な入力に反応できるようにする必要があります。AMyPawn::SetupPlayerInputComponent に以下のコードを追加します。

    // Respond when our "Grow" key is pressed or released. (Grow キーが押された時またはリリースされた時に反応)
    InputComponent->BindAction("Grow", IE_Pressed, this, &AMyPawn::StartGrowing);
    InputComponent->BindAction("Grow", IE_Released, this, &AMyPawn::StopGrowing);
    
    // 2 つの移動軸の値、 "MoveX" と "MoveY" の値にフレーム毎に反応
    InputComponent->BindAxis("MoveX", this, &AMyPawn::Move_XAxis);
    InputComponent->BindAxis("MoveY", this, &AMyPawn::Move_YAxis);
  4. これで設定した入力によって更新される変数が用意できました。あとは変数を使って何を行うかのコードを記述するだけです。次のコードを AMyPawn::Tick に追加しましょう。

    // Handle growing and shrinking based on our "Grow" action (Grow アクションに基づいて拡大と縮小を処理)
    {
        float CurrentScale = OurVisibleComponent->GetComponentScale().X;
        if (bGrowing)
        {
            // Grow to double size over the course of one second (1 秒間に倍のサイズに成長)
            CurrentScale += DeltaTime;
        }
        else
        {
            // Shrink half as fast as we grow (拡大と同じ速さで半分に縮小)
            CurrentScale -= (DeltaTime * 0.5f);
        }
        // Make sure we never drop below our starting size, or increase past double size.(開始サイズ以下またはダブルサイズ以上にしない)
        CurrentScale = FMath::Clamp(CurrentScale, 1.0f, 2.0f);
        OurVisibleComponent->SetWorldScale3D(FVector(CurrentScale));
    }
    
    // Handle movement based on our "MoveX" and "MoveY" axes (MoveX 軸や MoveY 軸に基づいて移動を処理)
    {
        if (!CurrentVelocity.IsZero())
        {
            FVector NewLocation = GetActorLocation() + (CurrentVelocity * DeltaTime);
            SetActorLocation(NewLocation);
        }
    }
  5. コードをコンパイルした後に Unreal Editor へ戻って Play (再生) を押します。WASD キーで操作可能な Pawn があります。このポーンは スペース バー を押すと拡大、バーをリリースすると縮小します。

PlayingGame1.png PlayingGame2.png

完成コード

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:
    // Sets default values (デフォルト値を設定) 
    AMyPawn();

protected:
    // Called when the game starts or when spawned (ゲーム開始時またはスポーン時に呼び出されます)
    virtual void BeginPlay() override;

public:
    // 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;

    //Input functions (入力関数)
    void Move_XAxis(float AxisValue);
    void Move_YAxis(float AxisValue);
    void StartGrowing();
    void StopGrowing();

    //Input variables (入力変数)
    FVector CurrentVelocity;
    bool bGrowing;
};

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. (フレーム毎に Tick() を呼び出すようにこのポーンを設定します。) 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->SetupAttachment(RootComponent);
    OurCamera->SetRelativeLocation(FVector(-250.0f, 0.0f, 250.0f));
    OurCamera->SetRelativeRotation(FRotator(-45.0f, 0.0f, 0.0f));
    OurVisibleComponent->SetupAttachment(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);

    // Handle growing and shrinking based on our "Grow" action (Grow アクションに基づいて拡大と縮小を処理)
    {
        float CurrentScale = OurVisibleComponent->GetComponentScale().X;
        if (bGrowing)
        {
            // Grow to double size over the course of one second (1 秒間に倍のサイズに成長)
            CurrentScale += DeltaTime;
        }
        else
        {
            // Shrink half as fast as we grow (拡大と同じ速さで半分に縮小)
            CurrentScale -= (DeltaTime * 0.5f);
        }
        // Make sure we never drop below our starting size, or increase past double size.(開始サイズ以下またはダブルサイズ以上にしない)
        CurrentScale = FMath::Clamp(CurrentScale, 1.0f, 2.0f);
        OurVisibleComponent->SetWorldScale3D(FVector(CurrentScale));
    }

    // Handle movement based on our "MoveX" and "MoveY" axes (MoveX 軸や MoveY 軸に基づいて移動を処理)
    {
        if (!CurrentVelocity.IsZero())
        {
            FVector NewLocation = GetActorLocation() + (CurrentVelocity * DeltaTime);
            SetActorLocation(NewLocation);
        }
    }
}

// Called to bind functionality to input (機能を入力にバインドするために呼び出されます)
void AMyPawn::SetupPlayerInputComponent(class UInputComponent* InputComponent)
{
    Super::SetupPlayerInputComponent(InputComponent);

    // Respond when our "Grow" key is pressed or released. (Grow キーが押された時またはリリースされた時に反応)
    InputComponent->BindAction("Grow", IE_Pressed, this, &AMyPawn::StartGrowing);
    InputComponent->BindAction("Grow", IE_Released, this, &AMyPawn::StopGrowing);

    // 2 つの移動軸の値、 "MoveX" と "MoveY" の値にフレーム毎に反応
    InputComponent->BindAxis("MoveX", this, &AMyPawn::Move_XAxis);
    InputComponent->BindAxis("MoveY", this, &AMyPawn::Move_YAxis);
}

void AMyPawn::Move_XAxis(float AxisValue)
{
    // Move at 100 units per second forward or backward (1 秒間に前後へ 100 単位移動)
    CurrentVelocity.X = FMath::Clamp(AxisValue, -1.0f, 1.0f) * 100.0f;
}

void AMyPawn::Move_YAxis(float AxisValue)
{
    // Move at 100 units per second right or left (1 秒間に左右へ 100 単位移動)
    CurrentVelocity.Y = FMath::Clamp(AxisValue, -1.0f, 1.0f) * 100.0f;
}

void AMyPawn::StartGrowing()
{
    bGrowing = true;
}

void AMyPawn::StopGrowing()
{
    bGrowing = false;
}
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