Language:
Page Info
Skill Level:
Engine Version:

2.8 - ファーストパーソン メッシュをキャラクターに追加する

ファーストパーソン シューティングゲーム (FPS) ゲームを構築する一般的な手法は、2 つの別個のキャラクター メッシュを使用するやり方です。ひとつは、ボディ全体のメッシュでもうひとつは「武器と手」のメッシュです。 ボディ全体のメッシュは三人称視点でキャラクターを見るために使用されますが、これはプレイヤーが一人称視点でゲームを見ると非表示になります。 「武器と手」のメッシュは通常カメラにアタッチされ、プレイヤーが一人称視点でマップを見ているときにのみ可視になります。 このステップでは、ファーストパーソン メッシュをキャラクターに追加します。

ファーストパーソン キャラクターのメッシュを追加する

  1. Visual Studio に切り替えて、FPSCharacter.h を開き、以下のコードを追加します。

    // First-person mesh (arms), visible only to the owning player. (一人称メッシュ (腕)、所有しているプレイヤーにのみ見えます) 
    UPROPERTY(VisibleDefaultsOnly, Category = Mesh)
    USkeletalMeshComponent* FPSMesh;
  2. FPSCharacter.cpp を開いて、コンストラクタに進んで、次のコードを追加して、一人称メッシュを作成し設定します。

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

    SetOnlyOwnerSee は、このメッシュがこの Character を所有した PlayerController からのみ可視であることを示しています。 また、このコードはメッシュをカメラにアタッチし、一部の背景シャドウイングを無効にします。 カメラがアタッチされたアームがシャドウをキャストするようにすると、ファースト パーソン キャラクターに対して単一のメッシュという錯覚が台無しになります。

  3. 最後に以下のコードを FPSCharacter.cpp のコンストラクタに追加して既存の三人称メッシュを所有しているキャラクターから見えないようにします。

    // The owning player doesn't see the regular (third-person) body mesh. (所有しているプレイヤーは、通常の (三人称視点の) ボディ メッシュは見えません) 
    GetMesh()->SetOwnerNoSee(true);
  4. FPSCharacter ヘッダー (*.h) と実装 (*.cpp) ファイルを Visual Studio に保存します。

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

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

    BuildProject.png

  7. ビルドが終了したら PIE モードで、 FPSProject を開いて実行します。

    HiddenMeshInGame.png

    この時点で、キャラクターのメッシュがエディタ内で可視状態になります。

メッシュのブループリントを構築する

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

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

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

    RightClickImport.png

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

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

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

    スムージング グループに関する以下のエラーは無視してください。 FBXWarning.png
    このメッシュはファーストパーソン メッシュの設定を表していますが、この後のセクションで設定するアニメーションでも機能します。

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

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

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

  9. [Components] タブで新しい FPSMesh コンポーネントを探します。

    LocateFPSMeshComponent.png

    FirstPersonMesh コンポーネントは FirstPersonCameraComponent の子です。つまり、常にカメラにアタッチされます。

  10. [Components] メニューで [FirstPersonMesh] をクリックしてください。

  11. [Details (詳細)] タブの [Mesh] セクションまで下にスクロールして、"None" と表示されているドロップダウン メニュー上でクリックします。 HeroFPP スケルタルメッシュを選択し、ビューポート に腕を追加します。

    SelectHeroFPPSkeletalMesh.png

  12. 新たに追加した HeroFPP スケルタルメッシュは、ビューポート 内で以下のように表示されます。

    HeroFPPMesh_Viewport.png

  13. 次のように設定して、この新たに追加したメッシュの変形がカメラの前にくるように調整します。その Location を {240, 0, 35} に、Rotation を {-180, 50, -180} に設定します。

    ズームインするには画像をクリックします。

  14. BP_FPSCharacter ブループリントを Compile (コンパイル) および Save (保存) してから、ブループリント エディタ を閉じてください。

新しいメッシュをインゲームで見る

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

    NewMeshInGame.png

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

完成セクション コード

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

    // FPS camera (FPS カメラ)
    UPROPERTY(VisibleAnywhere)
    UCameraComponent* FPSCameraComponent;

    // First-person mesh (arms), visible only to the owning player. (一人称メッシュ (腕)、所有しているプレイヤーにのみ見えます) 
    UPROPERTY(VisibleDefaultsOnly, Category = Mesh)
    USkeletalMeshComponent* FPSMesh;
};

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

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

これで終わりです! 以下について学習しました。

✓ キャラクターの新規作成
✓ 軸マッピングの設定
✓ キャラクターの Movement 関数の実装
✓ マウスによるカメラ制御の実装
✓ キャラクターのジャンプの実装
✓ キャラクターにメッシュを追加
✓ カメラビューの変更
✓ ファーストパーソン メッシュをキャラクターに追加

これで次のセクションで発射物の実装について学ぶ準備が整いました。