Language:
Page Info
Engine Version:
The translation of this page is out of date. Please see the English version for the latest version of the page.

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

  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. コードをコンパイルした後に アンリアル エディタ へ戻って Play (再生) を押します。WASD キーで操作可能な Pawn があります。このポーンは スペースバー を押すと拡大、バーをリリースすると縮小します。

PlayingGame1.png PlayingGame2.png

完成コード

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();

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;
}