3.2 - シューティングを実装する

FPS キャラクターにシューティングを実装する方法を学びます。

Windows
MacOS
Linux

このステップでは、Fire 関数を実装し、キャラクターが発射物 (プロジェクタイル) の発射を開始できるようにします。

Fire 関数を実装する

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

  2. FPSCharacter.cpp の上に、以下の #include を追加します。

    #include "FPSProjectile.h"
  3. 次の Fire 関数定義を FPSCharacter.cpp に追加します。

    void AFPSCharacter::Fire()
    {
        // Attempt to fire a projectile. (発射物の発射をアクティベートしようとします)
        if (ProjectileClass)
        {
            // Get the camera transform. (カメラのトランスフォームを取得)
            FVector CameraLocation;
            FRotator CameraRotation;
            GetActorEyesViewPoint(CameraLocation, CameraRotation);
    
    // Transform MuzzleOffset from camera space to world space (カメラ空間からワールド空間に MuzzleOffset をトランスフォーム)
            FVector MuzzleLocation = CameraLocation + FTransform(CameraRotation).TransformVector(MuzzleOffset);
            FRotator MuzzleRotation = CameraRotation;
            // Skew the aim to be slightly upwards. (照準を若干上方向に傾斜させます) 
            MuzzleRotation.Pitch += 10.0f;
            UWorld* World = GetWorld();
            if (World)
            {
                FActorSpawnParameters SpawnParams;
                SpawnParams.Owner = this;
                SpawnParams.Instigator = Instigator;
                // Spawn the projectile at the muzzle. (銃口で発射物をスポーンします)
                AFPSProjectile* Projectile = World->SpawnActor<AFPSProjectile>(ProjectileClass, MuzzleLocation, MuzzleRotation, SpawnParams);
                if (Projectile)
                {
                    // Set the projectile's initial trajectory. (発射物の初期べロシティを設定) 
                    FVector LaunchDirection = MuzzleRotation.Vector();
                    Projectile->FireInDirection(LaunchDirection);
                }
            }
        }
    }
  4. FPSCharacter.cpp は以下のようになります。

    // Fill out your copyright notice in the Description page of Project Settings. (Project Settings の Description ページに著作権情報を入力してください) 
    
    #include "FPSProject.h"
    #include "FPSCharacter.h"
    #include "FPSProjectile.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()
    {
        // Attempt to fire a projectile. (発射物の発射をアクティベートしようとします)
        if (ProjectileClass)
        {
            // Get the camera transform. (カメラのトランスフォームを取得)
            FVector CameraLocation;
            FRotator CameraRotation;
            GetActorEyesViewPoint(CameraLocation, CameraRotation);
    
    // Transform MuzzleOffset from camera space to world space (カメラ空間からワールド空間に MuzzleOffset をトランスフォーム)
            FVector MuzzleLocation = CameraLocation + FTransform(CameraRotation).TransformVector(MuzzleOffset);
            FRotator MuzzleRotation = CameraRotation;
            // Skew the aim to be slightly upwards. (照準を若干上方向に傾斜させます) 
            MuzzleRotation.Pitch += 10.0f;
            UWorld* World = GetWorld();
            if (World)
            {
                FActorSpawnParameters SpawnParams;
                SpawnParams.Owner = this;
                SpawnParams.Instigator = Instigator;
                // Spawn the projectile at the muzzle. (銃口で発射物をスポーンします)
                AFPSProjectile* Projectile = World->SpawnActor<AFPSProjectile>(ProjectileClass, MuzzleLocation, MuzzleRotation, SpawnParams);
                if (Projectile)
                {
                    // Set the projectile's initial trajectory. (発射物の初期べロシティを設定) 
                    FVector LaunchDirection = MuzzleRotation.Vector();
                    Projectile->FireInDirection(LaunchDirection);
                }
            }
        }
    }
  5. FPSCharacter.cpp を Visual Studio に保存します。

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

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

    BuildFPSProject.png

Projectile ブループリントを構築する

先に進む前に、次のリンクからサンプル メッシュをダウンロードし、抽出してください。 "Projectile Mesh"

  1. コンテンツ ブラウザのファイル ボックス内で右クリックして [Import Asset (インポート アセット)] ダイアログボックスを開きます。

  2. 'Import to /Game...' をクリックして [Import] ダイアログボックスを開きます。

    RightClickImport.png

  3. Sphere.fbx メッシュ ファイルを探して選択します。

  4. プロジェクトへのメッシュのインポートを開始するには、[Open] をクリックします。

  5. コンテンツ ブラウザ に、[FBX Import Options] ダイアログ ボックスが表示されます。メッシュをプロジェクトに追加するには、[インポート] をクリックします。

    スムージング グループに関する以下のエラーは無視してください。

    FBXWarning.png

    このメッシュはファーストパーソン メッシュの設定を表していますが、この後のセクションで設定するアニメーションでも機能します。

  6. [Save] ボタンを クリック してインポートしたスタティックメッシュを保存します。

  7. コンテンツ ブラウザ「Blueprints」 フォルダに戻ります。

  8. [Add New] ボタンをクリックして、Blueprint クラス を選択します。

  9. [All Classes] ドロップダウン メニューを展開して、検索ボックスに "FPSProjectile" と入力します。

    AddNewBPClass.png

  10. FPSProjectile の上でクリックして、[Select] ボタンを クリックします。

  11. 新しいブループリントに、"BP_FPSProjectile" と名前を付けます。

    NameBP_FPSProjectile.png

  12. ブループリント エディタ 内で BP_FPSCharacter のアイコンを ダブルクリックして開きます。

  13. [Components] タブで CollisionComponent をクリックします。

  14. [Add Component (コンポーネント追加)] ドロップダウン リストをクリックして、[Static Mesh] を選択します。

    AddStaticMeshComponent.png

  15. 新しいコンポーネントに "ProjectileMeshComponent" と名前を付けます。

    NameProjectileMeshComponent.png

  16. [Details (詳細)] タブの [Static Mesh] セクションまで下にスクロールして、"None" と表示されているドロップダウン メニュー上でクリックします。

  17. Sphere スタティックメッシュを選択します。

    SelectSphereMesh.png

    マルチプレイヤー ゲームを制作している場合、発射物がサーバー上で正しくレプリケートするように、"MovementComp" コンポーネントの "Initial Velocity in Local Space" のチェックも外す必要があります。

  18. X、Y、および Z のスケール値を 0.09 に設定します。

    Set_XYZ_ScaleValues.png

    鍵のアイコンをクリックすると 3 つの軸が全てロックされて、相対スケールが保たれます。

  19. ProjectileMeshComponent Collision Presets の値を、NoCollision に設定します (コリジョンにこのスタティックメッシュではなく、SphereComponent を使用しているため)。

    SetCollisionPresets.png

  20. ブループリントを コンパイル し、保存 してから、ブループリント エディタ を閉じます。

  21. BP_FPSCharacter をダブルクリックして、編集のために Character ブループリントを開きます。

  22. [Class Defaults Mode (クラスのデフォルト モード)] を開きます。

  23. [Projectile Class] プロパティを探して、それを [BP_FPSProjectile] に設定します。

    SelectProjectileClass.png

  24. カメラの少し手前で発射物をスポーンするために、 [MuzzleOffset] プロパティを {100, 0, 0} に設定します。

    CharacterProjectileClass.png

  25. ブループリントを コンパイル し、保存 してから、ブループリント エディタ を閉じます。

インゲームで発射物を発射する

  1. レベル エディタのツールバー で、[Play In] ボタンをクリックし、インゲームで発射物を発射します。

  2. 左クリックして、発射物をワールドに発射します。

    FiringProjectiles.png

  3. [PIE (Play In Editor)] モードを終了するには、レベル エディタで Escape キーを押すか、[Stop] ボタンをクリックします。

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