3.1 - ゲームに発射物を追加する

First Person Shooter プロジェクトに発射物を追加する方法を学びます。

Windows
MacOS
Linux

キャラクターの設定が完了したので、簡易な射出武器を実装してみましょう。武器の発射時に手榴弾のような発射物をスクリーン中央から投射し、ワールドに衝突するまでこれを飛ばしてみましょう。このステップでは、入力を追加し、発射物に新規コード クラスを追加します。

Fire Action Mapping を追加する

  1. [Edit (編集)] メニューで、 [Project Settings (プロジェクト設定)] をクリックします。

  2. [Project Settings] タブの左側にある [Engine] の見出しで、 [Input] をクリックします。

  3. [Bindings][Action Mappings] の隣にあるプラス記号をクリックします。

  4. [Axis Mappings] の左側にある矢印をクリックします。

  5. 表示されるテキスト欄に "Fire" と入力し、テキスト ボックスの左側の矢印をクリックしてアクション結合オプションを展開します。

  6. ドロップダウン メニューで [Mouse] ドロップダウン リストから [Left Mouse Button] を選択します。

  7. 入力設定は以下のようになります。

    ActionMapping.png

  8. [Project Settings] メニューを閉じます。

Projectile クラスを追加する

  1. ファイル メニューで [New C++ Class... (新規 C++ クラス)] を選択して、新しい Parent (親) クラスを選択します。

  2. [Choose Parent Class (親クラスを選択)] メニューが開きます。下方にスクロールして、親クラスとして [Actor] を選択して、[Next] をクリックします。

    AddProjectileClass.png

  3. 新しいクラスに 「FPSProjectile」 と名前を付けて、 [Create] をクリックします。

    CreateProjectileClass.png

USphere コンポーネントを追加する

  1. Solution Explorer で、FPSProjectile クラス ヘッダーを探して、 FPSProjectile.h を開きます。

  2. FPSProjectile インターフェースで、.USphereComponent への参照を追加します。

    // Sphere collision component (Sphere collision コンポーネント)
    UPROPERTY(VisibleDefaultsOnly, Category = Projectile)
    USphereComponent* CollisionComponent;
  3. FPSProjectile.h は以下のようになります。

    // Fill out your copyright notice in the Description page of Project Settings. (Project Settings の Description ページに著作権情報を入力してください) 
    
    #pragma once
    
    #include "GameFramework/Actor.h"
    #include "FPSProjectile.generated.h"
    
    UCLASS()
    class FPSPROJECT_API AFPSProjectile : public AActor
    {
        GENERATED_BODY()
    
    public:
        // Sets default values for this actor's properties (このアクタのプロパティのデフォルト値を設定)
        AFPSProjectile();
    
    protected:
        // Called when the game starts or when spawned (ゲーム開始時またはスポーン時に呼び出される)
        virtual void BeginPlay() override;
    
    public:
        // Called every frame (フレームごとに呼び出される)
        virtual void Tick( float DeltaSeconds ) override;
        // Sphere collision component (Sphere collision コンポーネント)
        UPROPERTY(VisibleDefaultsOnly, Category = Projectile)
        USphereComponent* CollisionComponent;
    };
  4. Solution Explorer (ソリューション エクスプローラー) で、FPSProjectile class CPP ファイルを探して、FPSProjectile.cpp を開きます。

  5. 以下のコードを、FPSProjectile.cpp 内の AFPSProjectile コンストラクタに追加します。

    // Use a sphere as a simple collision representation (簡易なコリジョン表現に球体を使用)
    CollisionComponent = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComponent"));
    // Set the sphere's collision radius. (球体のコリジョン半径を設定します)
    CollisionComponent->InitSphereRadius(15.0f);
    // Set the root component to be the collision component. (ルート コンポーネントを collision コンポーネントに設定します)
    RootComponent = CollisionComponent;

    シミュレーションで動かすため、CollisionComponentRootComponent にします。

  6. FPSProjectile.cpp は以下のようになります。

    // Fill out your copyright notice in the Description page of Project Settings. (Project Settings の Description ページに著作権情報を入力してください) 
    
    #include "FPSProject.h"
    #include "FPSProjectile.h"
    
    // Sets default values (デフォルト値を設定) 
    AFPSProjectile::AFPSProjectile()
    {
        // Set this actor to call Tick() every frame. (フレーム毎に Tick() を呼び出すようにこのアクタを設定) You can turn this off to improve performance if you don't need it. (必要がなければパフォーマンスを向上させるためにオフにすることができます) 
        PrimaryActorTick.bCanEverTick = true;
        // Use a sphere as a simple collision representation (簡易なコリジョン表現に球体を使用)
        CollisionComponent = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComponent"));
        // Set the sphere's collision radius. (球体のコリジョン半径を設定します)
        CollisionComponent->InitSphereRadius(15.0f);
        // Set the root component to be the collision component. (ルート コンポーネントを collision コンポーネントに設定します)
        RootComponent = CollisionComponent;
    }
    // Called when the game starts or when spawned (ゲーム開始時またはスポーン時に呼び出される)
    void AFPSProjectile::BeginPlay()
    {
        Super::BeginPlay();
    
        }
    
    // Called every frame (フレームごとに呼び出される)
    void AFPSProjectile::Tick( float DeltaTime )
    {
        Super::Tick( DeltaTime );
    
    }

Projectile Movement コンポーネントを追加する

  1. Solution Explorer (ソリューション エクスプローラー) で、FPSProjectile クラス ヘッダ ファイルを探して、 FPSProjectile.h を開きます。

  2. 次のコードを FPSProjectile.cpp に追加します。

    //Projectile movement component. (Projectile Movement コンポーネント)
    UPROPERTY(VisibleAnywhere, Category = Movement)
    UProjectileMovementComponent* ProjectileMovementComponent;
  3. FPSProjectile.h は以下のようになります。

    // Fill out your copyright notice in the Description page of Project Settings. (Project Settings の Description ページに著作権情報を入力してください) 
    
    #pragma once
    
    #include "GameFramework/Actor.h"
    #include "FPSProjectile.generated.h"
    
    UCLASS()
    class FPSPROJECT_API AFPSProjectile : public AActor
    {
        GENERATED_BODY()
    
    public:
        // Sets default values for this actor's properties (このアクタのプロパティのデフォルト値を設定)
        AFPSProjectile();
    
    protected:
        // Called when the game starts or when spawned (ゲーム開始時またはスポーン時に呼び出される)
        virtual void BeginPlay() override;
    
    public:
        // Called every frame (フレームごとに呼び出される)
        virtual void Tick( float DeltaSeconds ) override;
    
        // Sphere collision component (Sphere collision コンポーネント)
        UPROPERTY(VisibleDefaultsOnly, Category = Projectile)
        USphereComponent* CollisionComponent;
    
        //Projectile movement component. (Projectile Movement コンポーネント)
        UPROPERTY(VisibleAnywhere, Category = Movement)
        UProjectileMovementComponent* ProjectileMovementComponent;
    };
  4. Solution Explorer で、FPSProjectile CPP ファイルを探して、FPSProjectile.cpp を開きます。

  5. 以下のコードの行を、FPSProjectile.cpp 内の FPSProjectile コンストラクタに追加します。

    // Use this component to drive this projectile's movement. (このコンポーネントを使って発射物の動きを操作します)
    ProjectileMovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileMovementComponent"));
    ProjectileMovementComponent->SetUpdatedComponent(CollisionComponent);
    ProjectileMovementComponent->InitialSpeed = 3000.0f;
    ProjectileMovementComponent->MaxSpeed = 3000.0f;
    ProjectileMovementComponent->bRotationFollowsVelocity = true;
    ProjectileMovementComponent->bShouldBounce = true;
    ProjectileMovementComponent->Bounciness = 0.3f;
  6. FPSProjectile.cpp は以下のようになります。

    // Fill out your copyright notice in the Description page of Project Settings. (Project Settings の Description ページに著作権情報を入力してください) 
    
    #include "FPSProject.h"
    #include "FPSProjectile.h"
    
    // Sets default values (デフォルト値を設定) 
    AFPSProjectile::AFPSProjectile()
    {
        // Set this actor to call Tick() every frame. (フレーム毎に Tick() を呼び出すようにこのアクタを設定) You can turn this off to improve performance if you don't need it. (必要がなければパフォーマンスを向上させるためにオフにすることができます) 
        PrimaryActorTick.bCanEverTick = true;
        // Use a sphere as a simple collision representation (簡易なコリジョン表現に球体を使用)
        CollisionComponent = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComponent"));
        // Set the sphere's collision radius. (球体のコリジョン半径を設定します)
        CollisionComponent->InitSphereRadius(15.0f);
        // Set the root component to be the collision component. (ルート コンポーネントを collision コンポーネントに設定します)
    
        RootComponent = CollisionComponent;
        // Use this component to drive this projectile's movement. (このコンポーネントを使って発射物の動きを操作します)
        ProjectileMovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileMovementComponent"));
        ProjectileMovementComponent->SetUpdatedComponent(CollisionComponent);
        ProjectileMovementComponent->InitialSpeed = 3000.0f;
        ProjectileMovementComponent->MaxSpeed = 3000.0f;
        ProjectileMovementComponent->bRotationFollowsVelocity = true;
        ProjectileMovementComponent->bShouldBounce = true;
        ProjectileMovementComponent->Bounciness = 0.3f;
    }
    
    // Called when the game starts or when spawned (ゲーム開始時またはスポーン時に呼び出される)
    void AFPSProjectile::BeginPlay()
    {
        Super::BeginPlay();
    
    }
    
    // Called every frame (フレームごとに呼び出される)
    
    void AFPSProjectile::Tick( float DeltaTime )
    {
        Super::Tick( DeltaTime );
    
    }

発射物の初期べロシティ(方向付き速度)を設定する

  1. Solution Explorer (ソリューション エクスプローラー) で、FPSProjectile クラス ヘッダ ファイルを探して、 FPSProjectile.h を開きます。

  2. FPSProjectile.h に以下の関数の宣言を追加します。

    // Function that initializes the projectile's velocity in the shoot direction. (発射方向に発射物のべロシティを初期化する関数)
    void FireInDirection(const FVector& ShootDirection);

    この関数は、発射物を発射します。

  3. FPSProjectile.h は以下のようになります。

    // Fill out your copyright notice in the Description page of Project Settings. (Project Settings の Description ページに著作権情報を入力してください) 
    
    #pragma once
    
    #include "GameFramework/Actor.h"
    #include "FPSProjectile.generated.h"
    
    UCLASS()
    class FPSPROJECT_API AFPSProjectile : public AActor
    {
        GENERATED_BODY()
    
    public: 
        // Sets default values for this actor's properties (このアクタのプロパティのデフォルト値を設定)
        AFPSProjectile();
    
    protected:
        // Called when the game starts or when spawned (ゲーム開始時またはスポーン時に呼び出される)
        virtual void BeginPlay() override;
    
    public:
        // Called every frame (フレームごとに呼び出される)
        virtual void Tick( float DeltaSeconds ) override;
    
        // Sphere collision component (Sphere collision コンポーネント)
        UPROPERTY(VisibleDefaultsOnly, Category = Projectile)
        USphereComponent* CollisionComponent;
    
        //Projectile movement component. (Projectile Movement コンポーネント)
        UPROPERTY(VisibleAnywhere, Category = Movement)
        UProjectileMovementComponent* ProjectileMovementComponent;
    
        // Function that initializes the projectile's velocity in the shoot direction.
        void FireInDirection(const FVector& ShootDirection);
    };
  4. Solution Explorer で、FPSProjectile CPP ファイルを探して、FPSProjectile.cpp を開きます。

  5. 次の関数定義を FPSProjectile.cpp に追加します。

    // Function that initializes the projectile's velocity in the shoot direction. (発射方向に発射物のべロシティを初期化する関数)
    void AFPSProjectile::FireInDirection(const FVector& ShootDirection)
    {
        ProjectileMovementComponent->Velocity = ShootDirection * ProjectileMovementComponent->InitialSpeed;
    }

    発射物の速度は ProjectileMovementComponent によって定義されているため、指定するのは発射方向だけです。

  6. FPSProjectile.cpp は以下のようになります。

    // Fill out your copyright notice in the Description page of Project Settings. (Project Settings の Description ページに著作権情報を入力してください) 
    
    #include "FPSProject.h"
    #include "FPSProjectile.h"
    
    // Sets default values (デフォルト値を設定) 
    AFPSProjectile::AFPSProjectile()
    {
        // Set this actor to call Tick() every frame. (フレーム毎に Tick() を呼び出すようにこのアクタを設定) You can turn this off to improve performance if you don't need it. (必要がなければパフォーマンスを向上させるためにオフにすることができます) 
        PrimaryActorTick.bCanEverTick = true;
    
        // Use a sphere as a simple collision representation (簡易なコリジョン表現に球体を使用)
        CollisionComponent = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComponent"));
        // Set the sphere's collision radius. (球体のコリジョン半径を設定します)
        CollisionComponent->InitSphereRadius(15.0f);
        // Set the root component to be the collision component. (ルート コンポーネントを collision コンポーネントに設定します)
        RootComponent = CollisionComponent;
    
    // Use this component to drive this projectile's movement. (このコンポーネントを使って発射物の動きを操作します)
        ProjectileMovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileMovementComponent"));
        ProjectileMovementComponent->SetUpdatedComponent(CollisionComponent);
        ProjectileMovementComponent->InitialSpeed = 3000.0f;
        ProjectileMovementComponent->MaxSpeed = 3000.0f;
        ProjectileMovementComponent->bRotationFollowsVelocity = true;
        ProjectileMovementComponent->bShouldBounce = true;
        ProjectileMovementComponent->Bounciness = 0.3f;
    }
    
    // Called when the game starts or when spawned (ゲーム開始時またはスポーン時に呼び出される)
    void AFPSProjectile::BeginPlay()
    {
        Super::BeginPlay();
    
    }
    
    // Called every frame (フレームごとに呼び出される)
    void AFPSProjectile::Tick( float DeltaTime )
    {
        Super::Tick( DeltaTime );
    
    }
    
    // Function that initializes the projectile's velocity in the shoot direction. (発射方向に発射物のべロシティを初期化する関数)
    
    void AFPSProjectile::FireInDirection(const FVector& ShootDirection)
    {
        ProjectileMovementComponent->Velocity = ShootDirection * ProjectileMovementComponent->InitialSpeed;
    }

Fire 入力アクションをバインドする

  1. Solution Explorer で、FPSCharacter クラスヘッダ ファイルを探して、FPSCharacter.cpp を開きます。

  2. FPSCharacter.h に以下の関数の宣言を追加します。

    // Function that handles firing projectiles. (発射物をアクティベートする関数)
    UFUNCTION()
    void Fire();
  3. FPSCharacter.h は以下のようになります。

    // Fill out your copyright notice in the Description page of Project Settings. (Project Settings の Description ページに著作権情報を入力してください) 
    
    #pragma once
    
    #include "GameFramework/Character.h"
    #include "FPSCharacter.generated.h"
    
    UCLASS()
    class FPSPROJECT_API AFPSCharacter : public ACharacter
    {
        GENERATED_BODY()
    
    public:
        // Sets default values for this character's properties. (このキャラクターのプロパティのデフォルト値を設定) 
        AFPSCharacter();
    
    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* PlayerInputComponent) override;
    
    // Handles input for moving forward and backward. (前後方向の移動の入力を処理) 
        UFUNCTION()
        void MoveForward(float Value);
    // Handles input for moving right and left. (左右の移動の入力を処理)           UFUNCTION()
        void MoveRight(float Value);
    
    // Sets jump flag when key is pressed 
        UFUNCTION()
        void StartJump();
    // Clears jump flag when key is released (キー解放時のジャンプフラグをクリア)
        UFUNCTION()
        void StopJump();
    
    // Function that handles firing projectiles. (発射物をアクティベートする関数)
        UFUNCTION()
        void Fire();
    
    // FPS camera (FPS カメラ)
        UPROPERTY(VisibleAnywhere)
        UCameraComponent* FPSCameraComponent;
    
    // First-person mesh (arms), visible only to the owning player. (一人称メッシュ (腕)、所有しているプレイヤーにのみ見えます) 
        UPROPERTY(VisibleDefaultsOnly, Category = Mesh)
        USkeletalMeshComponent* FPSMesh;
    };
  4. Solution Explorer で、FPSCharacter CPP ファイルを探して、FPSCharacter.cpp を開きます。

  5. FPSCharacter.cpp で以下のコードを SetupPlayerInputComponent に追加して OnFire 関数をバインドします。

    PlayerInputComponent->BindAction("Fire", IE_Pressed, this, &AFPSCharacter::Fire);
  6. 次の関数定義を FPSCharacter.cpp に追加します。

    void AFPSCharacter::Fire()
    {
    }
  7. FPSCharacter.cpp は以下のようになります。

    // Fill out your copyright notice in the Description page of Project Settings. (Project Settings の Description ページに著作権情報を入力してください) 
    
    #include "FPSProject.h"
    #include "FPSCharacter.h"
    
    // Sets default values (デフォルト値を設定) 
    AFPSCharacter::AFPSCharacter()
    {
        // Set this character to call Tick() every frame. (このキャラクターがフレーム毎に Tick() を呼び出すように設定します) You can turn this off to improve performance if you don't need it. (必要がなければパフォーマンスを向上させるためにオフにすることができます) 
        PrimaryActorTick.bCanEverTick = true;
    
    // Create a first person camera component. (first person camera コンポーネントを作成)
        FPSCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera"));
        // Attach the camera component to our capsule component. (camera コンポーネントを capsule コンポーネントにアタッチします)
        FPSCameraComponent->SetupAttachment(GetCapsuleComponent());
        // Position the camera slightly above the eyes. (目の高さより少し上にカメラを設定)
        FPSCameraComponent->SetRelativeLocation(FVector(0.0f, 0.0f, 50.0f + BaseEyeHeight));
        // Allow the pawn to control camera rotation. (ポーンがカメラの回転を制御できるようにします)
        FPSCameraComponent->bUsePawnControlRotation = true;
    
    // Create a first person mesh component for the owning player. (所有しているプレイヤーのために一人称メッシュを作成) 
    
        FPSMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("FirstPersonMesh"));
    
        // Only the owning player sees this mesh. (このメッシュは所有しているプレイヤーだけから見えます)
        FPSMesh->SetOnlyOwnerSee(true);
        // Attach the FPS mesh to the FPS camera. (FPS メッシュを FPS カメラにアタッチします)
        FPSMesh->SetupAttachment(FPSCameraComponent);
        // Disable some environmental shadowing to preserve the illusion of having a single mesh. (一部の背景のシャドウイングを無効にして、ひとつのメッシュを持っているという錯覚を維持します) 
        FPSMesh->bCastDynamicShadow = false;
        FPSMesh->CastShadow = false;
    
    // The owning player doesn't see the regular (third-person) body mesh. (所有しているプレイヤーは、通常の (三人称視点の) ボディ メッシュは見えません) 
        GetMesh()->SetOwnerNoSee(true);
    }
    // Called when the game starts or when spawned (ゲーム開始時またはスポーン時に呼び出される)
    void AFPSCharacter::BeginPlay()
    {
        Super::BeginPlay();
    
        if (GEngine)
        {
            // Put up a debug message for five seconds. (デバッグ メッセージを 5 秒間表示) The -1 "Key" value (first argument) indicates that we will never need to update or refresh this message. ( -1 のキー値 (最初の引数) は、このメッセージを更新、リフレッシュする必要がないことを示しています) 
            GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter."));
        }
    }
    
    // Called every frame (フレームごとに呼び出される)
    
    void AFPSCharacter::Tick( float DeltaTime )
    {
        Super::Tick( DeltaTime );
    }
    
    // Called to bind functionality to input (機能と入力をバインドするために呼ばれます)
    
    void AFPSCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
    {
        Super::SetupPlayerInputComponent(PlayerInputComponent);
    
        // Set up "movement" bindings. (移動のバインディングをセットアップ)
        PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward);
        PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight);
    
        // Set up "look" bindings. (look のバインディングをセットアップ) 
        PlayerInputComponent->BindAxis("Turn", this, &AFPSCharacter::AddControllerYawInput);
        PlayerInputComponent->BindAxis("LookUp", this, &AFPSCharacter::AddControllerPitchInput);
    
        // Set up "action" bindings. 
        PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AFPSCharacter::StartJump);
        PlayerInputComponent->BindAction("Jump", IE_Released, this, &AFPSCharacter::StopJump);
        PlayerInputComponent->BindAction("Fire", IE_Pressed, this, &AFPSCharacter::Fire);
    }
    
    void AFPSCharacter::MoveForward(float Value)
    {
        // Find out which way is "forward" and record that the player wants to move that way. (前進方向を確認し、プレイヤーがそちらの方向に移動するように記録) 
        FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::X);
        AddMovementInput(Direction, Value);
    }
    
    void AFPSCharacter::MoveRight(float Value)
    {
        // Find out which way is "forward" and record that the player wants to move that way. (右方向を確認し、プレイヤーがそちらの方向に移動するように記録) 
        FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y);
        AddMovementInput(Direction, Value);
    }
    
    void AFPSCharacter::StartJump()
    {
        bPressedJump = true;
    }
    
    void AFPSCharacter::StopJump()
    {
        bPressedJump = false;
    }
    
    void AFPSCharacter::Fire()
    {
    }

発射物のスポーン位置を定義する

  1. FPSProjectile アクタをスポーンする場合、OnFire 関数を実装する場合に考慮すべきポイントが以下のように 2 つあります。

  • 発射物をスポーンする位置

  • projectile クラス ( FPSCharacter とその派生ブループリントがどの発射物をスポーンするかをわかるようにするため)

カメラ空間のオフセット ベクターを使用して発射物のスポーン位置を決めます。 このパラメータを編集可能にして、BP_FPSCharacter ブループリントで設定および微調整ができるようにします。 最終的に、このデータに基づいて、発射物の初期位置を計算します。

  1. Solution Explorer で、FPSCharacter クラスヘッダ ファイルを探して、FPSCharacter.cpp を開きます。

  2. 次のコードを FPSCharacter.h に追加します。

    // Gun muzzle's offset from the camera location. (カメラ位置から銃口のオフセット)
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Gameplay)
    FVector MuzzleOffset;

    EditAnywhere 指定子は、ブループリントエディタの [Defaults] モード、またはキャラクターの任意のインスタンスの [Details] タブから銃口のオフセット値を変更することができます。 BlueprintReadWrite 指定子は、ブループリント内で銃口のオフセット値の取得および設定をできるようにします。

  3. 次のコードを FPSCharacter.h に追加します。

    // Projectile class to spawn. (スポーンする Projectile クラス)
    UPROPERTY(EditDefaultsOnly, Category = Projectile)
    TSubclassOf<class AFPSProjectile> ProjectileClass;

    EditDefaultsOnly 指定子では、ブループリントの各インスタンスではなく、ブループリントのデフォルトとして projectile クラスを設定できます。

  4. FPSCharacter.h は以下のようになります。

    // Fill out your copyright notice in the Description page of Project Settings. (Project Settings の Description ページに著作権情報を入力してください) 
    
    #pragma once
    
    #include "GameFramework/Character.h"
    #include "FPSCharacter.generated.h"
    
    UCLASS()
    class FPSPROJECT_API AFPSCharacter : public ACharacter
    {
        GENERATED_BODY()
    
    public:
        // Sets default values for this character's properties. (このキャラクターのプロパティのデフォルト値を設定) 
        AFPSCharacter();
    
    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* PlayerInputComponent) override;
    
        // Handles input for moving forward and backward. (前後方向の移動の入力を処理) 
    
        UFUNCTION()
        void MoveForward(float Value);
    
        // Handles input for moving right and left. (左右の移動の入力を処理) 
    
        UFUNCTION()
        void MoveRight(float Value);
    
        // Sets jump flag when key is pressed (キー押下時のジャンプフラグを設定) 
    
        UFUNCTION()
        void StartJump();
    
        // Clears jump flag when key is released (キー解放時のジャンプフラグをクリア)
        UFUNCTION()
        void StopJump();
    
        // Function that handles firing projectiles. (発射物をアクティベートする関数)
    
        UFUNCTION()
        void Fire();
    
        // FPS camera (FPS カメラ)
        UPROPERTY(VisibleAnywhere)
        UCameraComponent* FPSCameraComponent;
    
        // First-person mesh (arms), visible only to the owning player. (一人称メッシュ (腕)、所有しているプレイヤーにのみ見えます) 
    
        UPROPERTY(VisibleDefaultsOnly, Category = Mesh)
        USkeletalMeshComponent* FPSMesh;
    
        // Gun muzzle's offset from the camera location. (カメラ位置から銃口のオフセット)
        UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Gameplay)
        FVector MuzzleOffset;
        // Projectile class to spawn. (スポーンする Projectile クラス)           UPROPERTY(EditDefaultsOnly, Category = Projectile)
        TSubclassOf<class AFPSProjectile> ProjectileClass;
    };

コードのコンパイルとチェック

新規で実装した発射物のコードをコンパイルし、チェックします。

  1. Visual Studio にすべてのヘッダーと実装ファイルを保存します。

  2. [Solution Explorer (ソリューション エクスプローラ)][FPSProject] を探します。

  3. [FPSProject] 上で右クリックして [Build] を選択してプロジェクトをコンパイルします。

    BuildFPSProject.png

    このステップの目的は、次のステップに進む前にビルド エラーがあれば見つけることです。

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