目標
このセクションでは、ファースト パーソン シューター キャラクターを実装する方法を説明します。
目標
このチュートリアルのセクションを終了すると、次のことができるようになります。
新しいキャラクターを作成する
軸マッピングを設定する
キャラクター移動関数を実装する
マウス カメラ コントロールを実装する
キャラクター ジャンプを実装する
メッシュをキャラクターに追加する
カメラ ビューを変更する
ファース トパーソン メッシュをキャラクターに追加する
ステップ
2.1 - 新しいキャラクターを作成する
2.2 - 軸マッピングを設定する
2.3 - キャラクター移動関数を実装する
2.4 - マウス カメラ コントロールを実装する
2.5 - キャラクター ジャンプを実装する
2.6 - メッシュをキャラクターに追加する
2.7 - カメラ ビューを変更する
2.8 - ファースト パーソン メッシュをキャラクターに追加する
2.1 - 新しいキャラクターを作成する
このステップでは、Unreal Engine (UE) でエンジンの Character 基本クラスを使用して、新キャラクターを作成します。Character クラス (Pawn クラスから派生) には、歩行、走行、跳躍といった二足歩行移動向けのビルトイン機能があります。
Character クラスを追加する
.h
ファイルおよび .cpp
ファイルを手動で Visual Studio (VS) ソリューションに追加することができますが、C++ クラス ウィザード を使用して新クラスをプロジェクトに追加する方法をお勧めします。
C++ クラス ウィザードを使用することで、エンジンにより、UE 固有のマクロを設定するヘッダやソース テンプレートが作成されます。
FPSproject を UE で起動します (起動していない場合)。
[Tools (ツール)] を メイン メニュー パネルでクリックし、[New C++ Class... (新規 C++ クラス...)] を選択します。
[Choose Parent Class (親クラスを選択)] ウィンドウが表示されます。親クラスとして [Character] を選択し、[Next (次へ)] をクリックします。
新規クラスに「FPSCharacter」という名前を付けてから、[Create Class (クラスを作成)] をクリックします。
Character クラスを検証する
VS の [Solution Explorer (ソリューション エクスプローラー)] で、[FPSProject] > [Source (ソース)] > [FPSProject] の順に展開します。
FPSCharacter.cpp
をクリックして、FPSCharacter クラス用の実装ファイルを開きます。void AFPSCharacter::BeginPlay()
関数 (Super::BeginPlay();
の下) に次のコードを追加します。これにより、FPSCharacter
クラスが使用されていることを確認できます。check(GEngine != nullptr); // デバッグ メッセージを 5 秒間表示します。 // 「Key」値引数 -1 を指定すると、メッセージは更新またはリフレッシュされなくなります。 GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter."));
FPSCharacter.cpp
は次のようになります。// Copyright Epic Games, Inc. All Rights Reserved. #include "FPSCharacter.h" // デフォルト値を設定します。 AFPSCharacter::AFPSCharacter() { // このキャラクターがフレームごとに Tick() を呼び出すように設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。 PrimaryActorTick.bCanEverTick = true; } // ゲームの開始時またはスポーン時に呼び出します。 void AFPSCharacter::BeginPlay() { Super::BeginPlay(); check(GEngine != nullptr); // デバッグ メッセージを 5 秒間表示します。 // 「Key」値引数 -1 を指定すると、メッセージは更新またはリフレッシュされなくなります。 GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter.")); } // フレームごとに呼び出します。 void AFPSCharacter::Tick(float DeltaTime) { Super::Tick(DeltaTime); } // Input に機能をバインドする際に呼び出します。 void AFPSCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); }
Visual Studio で
FPSCharacter.cpp
ファイルを保存します。[Solution Explorer] に移動して [FPSProject] を選択します。
ここまでは、エディタの [Build (ビルド)] ボタンでプロジェクトをコンパイルしました。このステップでは、Visual Studio のビルド機能を使ってコードをコンパイルしてみましょう。コードを Visual Studio 内部でコンパイルするには、[FPSProject] を右クリックし、[Build] を選択して、プロジェクトをコンパイルします。
VS を使用してコードをコンパイルするには、[FPSProject] を [Solution Explorer] で右クリックし、[Build] を選択してプロジェクトをコンパイルします。
このステップを行う前に、必ず Unreal Engine の [Enable Live Coding (ライブ コーディングの有効化)] を無効にしてください。
デフォルト設定で VS を使用している場合は、プログラムの下の方にダイアログボックスがあります (コードを編集した場所の下)。[Build] をクリックすると、処理中にいくつかのメッセージがダイアログ ボックスに表示され、通常、最後にビルド完了メッセージが表示されます。 ビルドが失敗しても、心配はありません。ステップを最初から見直して、こちらと プロジェクトを設定する のコードが一致しているかどうか確認してください。
ビルドが完了したら、Unreal Editor を開き、新たにコンパイルした FPSCharacter クラスが コンテンツ ブラウザ に表示されていることを確認します。
C++ FPS Character クラスをブループリントに拡張する
ここで、C++ FPS Character クラスをブループリントに拡張します (前に プロジェクトを設定する の FPSProject ゲーム モードで実行したものと同様)。C++ クラスからブループリントへの拡張の詳細については、C++ とブループリント リファレンス ページを参照してください。
FPSCharacter クラスを コンテンツ ブラウザ で右クリックし、[Actions (アクション)] メニューを開きます。
[Create Blueprint class based on FPSCharacter (FPSCharacter に基づくブループリントクラスを作成します)] をクリックして、[Add Blueprint Class (ブループリントクラスを追加)] ダイアログ メニューを開きます。
新規ブループリント クラスに「BP_FPSCharacter」という名前を付け、「Blueprints」フォルダを選択してから、[Create Blueprint Class (ブループリントクラスを作成)] ボタンをクリックします。
新しく BP_FPSCharacter ブループリント クラスが「Blueprints」フォルダに作成されました。
必ず BP_FPSCharacter ブループリントを 保存 してから、ブループリント エディタ を閉じます。
デフォルト Pawn クラスを設定する
新しく変更したゲーム モードをブループリントに拡張したので、このステップで BP_FPSCharacter
をデフォルトの Pawn として使用するように、プロジェクトを設定する必要があります。
メイン メニュー パネルで [Edit (編集)] をクリックし、[Project Settings (プロジェクト設定)] を選択します。
[Project Settings] タブの左側にある [Project (プロジェクト)] セクションで、[Maps & Modes (マップ & モード)] を選択します。
[Selected GameMode (選択したゲームモード)] セクションを展開して、[BP_FPSCharacter] を [Default Pawn Class] ドロップダウン メニューで選択します。
[Project Settings] メニューを閉じます。
レベル エディタのツールバー で [Play (プレイ)] ボタンをクリックします。ビューポートの左上に 5 秒間、「Hello World, this is FPSGameMode!」が表示され、その下に赤色のテキストで、「We are using FPSCharacter.」が表示されます。
移動はできませんが、FPSCharacter は Pawn として正しく使用されています。新しい Character にはまだ移動コントロールが何もないため、レベル内を動き回ることができません。
次のステップに進む前に、Shift キーと Escape キー を押すか レベル エディタのツールバー にある [Stop (停止)] をクリックし、PIE モードを終了します。
2.2 - 軸マッピングを設定する
一般に軸マッピングでは、キーボード、マウス、コントローラーの入力を「フレンドリーネーム」にマッピングでき、その名前をゲームの動作 (移動など) にバインドできます。軸マッピングは継続的にポーリングされ、シームレスな動きのトランジションとスムーズなゲームの動作を実現します。ハードウェア軸 (コントローラー ジョイスティックなど) では、オンオフの入力 (押された場合は 1 で、押されていない場合は 0 など) ではなく、入力の度合いが得られます。コントローラー ジョイスティック入力メソッドは、動きの入力の大きさを取得するのに効果的ですが、軸マッピングでも、一般的な移動キー (W、A、S、D の各キーや矢印キー) を継続的にポーリングされるゲームの動作にマッピングすることもできます。
このステップをさらに進める前にプレイヤー入力を確認するには、プレイヤー入力と Pawn クラス チュートリアルを参照してください。このステップでは、新しいキャラクターをマップで動き回らせるために、W、A、S、D、 の各キーに対する入力軸マッピングを設定します。
MoveForward 軸マッピング
メイン メニュー パネルで [Edit] をクリックし、[Project Settings] を選択します。
[Project Settings] タブの左側にある [Engine] セクションで、[Input] をクリックします。
[Bindings (バインディング)] セクションで、[Axis Mappings (軸マッピング)] の隣にある [+ (プラス)] 記号をクリックします。
[Axis Mappings] の左にある矢印をクリックします。
表示されるテキスト フィールドに「MoveForward」と入力します。
ドロップダウン メニューで、[W] を [Keyboard] ドロップダウン リストから選択します。
ここでの入力設定は次のようになります。
MoveForward の隣にある [+] 記号をクリックします。
2 番目のドロップダウン メニューで、[S] を [Keyboard] ドロップダウン リストから選択します。
[S] の隣にある [Scale (スケール)] フィールドに「-1.0」を入力します。
ここでの入力設定は次のようになります。
MoveRight 軸マッピング
[Bindings] セクションで、[Axis Mappings] の隣にある [+] 記号をクリックします。
表示されるテキスト フィールドに「MoveRight」と入力します。
ドロップダウン メニューで、[D] を [Keyboard] ドロップダウン リストから選択します。
ここでの入力設定は次のようになります。
MoveRight の隣にある [+] 記号をクリックします。
2 番目のドロップダウン メニューで、[A] を [Keyboard] ドロップダウン リストから選択します。
[A] の隣にある [Scale] フィールドに「-1.0」を入力します。
ここでの入力設定は次のようになります。
これで、移動軸マッピングの設定が完了しました。[Project Settings] メニューを閉じます。
2.3 - キャラクター移動関数を実装する
このステップでは、プレイヤー入力コンポーネントを設定して、FPSCharacter クラスで次の関数を実装します。
MoveForward
MoveRight
移動関数インターフェース
FPSCharacter の軸マッピングを設定したので、VS のプロジェクトに切り替えます。
FPSCharacter.h
で、次の関数宣言をSetupPlayerInputComponent
の下のpublic
アクセス指定子の下に追加します。// 前方および後方への移動のための入力を処理します。 UFUNCTION() void MoveForward(float Value); // 右および左への移動のための入力を処理します。 UFUNCTION() void MoveRight(float Value);
UFUNCTION
マクロ (各関数の上にある) により、エンジンがこれらの関数を認識して、シリアル化と他のエンジン機能に含められるようになります。FPSCharacter.h
は次のようになります。// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GameFramework/Character.h" #include "FPSCharacter.generated.h" UCLASS() class FPSPROJECT_API AFPSCharacter : public ACharacter { GENERATED_BODY() public: // このキャラクターのプロパティのデフォルト値を設定します。 AFPSCharacter(); protected: // ゲームの開始時またはスポーン時に呼び出します。 virtual void BeginPlay() override; public: // フレームごとに呼び出します。 virtual void Tick( float DeltaTime ) override; // Input に機能をバインドする際に呼び出します。 virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; // 前方および後方への移動のための入力を処理します。 UFUNCTION() void MoveForward(float Value); // 右および左への移動のための入力を処理します。 UFUNCTION() void MoveRight(float Value); };
移動関数の実装
一般的な FPS コントロール スキームでは、キャラクターの移動軸はカメラを基準にしたものになります。
「前進」の動きは「カメラが向いている方向」への動きで、「右」は「カメラの向きに対して右方向」への動きです。
キャラクターのコントロール回転を取得するには、PlayerController
を使用します。
さらに、MoveForward
関数はコントロール回転のピッチ コンポーネントを無視し、入力を XY 平面内に制限します。これは上や下を向いたときに、キャラクターが床から離れずに移動するようにするためです。
FPSCharacter.cpp
で、次のコード行をSetupPlayerInputComponent
関数のSuper::SetupPlayerInputComponent(PlayerInputComponent);
の下に追加します。// 「移動」バインディングをセットアップします。 PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward); PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight);
InputComponent
は入力データを処理する方法を定義するコンポーネントです。InputComponent
は入力を受け付けるアクタにアタッチできます。SetupPlayerInputComponent
関数定義の下に、次のMoveForward
関数定義をFPSCharacter.cpp
に追加します。void AFPSCharacter::MoveForward(float Value) { // どちらが「前方」なのかを調べ、プレイヤーがその方向に移動したがっていることを記録します。 FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::X); AddMovementInput(Direction, Value); }
MoveForward
関数定義の下に、次のMoveRight
関数定義をFPSCharacter.cpp
に追加します。void AFPSCharacter::MoveRight(float Value) { // どちらが「右」なのかを調べ、プレイヤーがその方向に移動したがっていることを記録します。 FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y); AddMovementInput(Direction, Value); }
FPSCharacter.cpp
は次のようになります。// Copyright Epic Games, Inc. All Rights Reserved. #include "FPSCharacter.h" // デフォルト値を設定します。 AFPSCharacter::AFPSCharacter() { // このキャラクターがフレームごとに Tick() を呼び出すように設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。 PrimaryActorTick.bCanEverTick = true; } // ゲームの開始時またはスポーン時に呼び出します。 void AFPSCharacter::BeginPlay() { Super::BeginPlay(); check(GEngine != nullptr); // デバッグ メッセージを 5 秒間表示します。 // 「Key」値引数 -1 を指定すると、メッセージは更新またはリフレッシュされなくなります。 GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter.")); } // フレームごとに呼び出します。 void AFPSCharacter::Tick( float DeltaTime ) { Super::Tick( DeltaTime ); } // Input に機能をバインドする際に呼び出します。 void AFPSCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); // 「移動」バインディングをセットアップします。 PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward); PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight); } void AFPSCharacter::MoveForward(float Value) { // どちらが「前方」なのかを調べ、プレイヤーがその方向に移動したがっていることを記録します。 FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::X); AddMovementInput(Direction, Value); } void AFPSCharacter::MoveRight(float Value) { // どちらが「右」なのかを調べ、プレイヤーがその方向に移動したがっていることを記録します。 FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y); AddMovementInput(Direction, Value); }
キャラクター移動をテストする
ここでは、新しく実装したキャラクター移動関数をコンパイルしてテストします。
FPSCharacter ヘッダ (
.h
) と実装.cpp
ファイルを VS で保存します。[Solution Explorer] に移動して [FPSProject] を選択します。
[FPSProject] を右クリックして [Build] を選択し、プロジェクトをコンパイルします。
ビルドが終了したら、FPSProject を Unreal Editor で開きます。
レベル エディタのツールバー で [Play] ボタンをクリックします。W、A、S、D の各キーを使用して前後左右に移動できるようになりました。
次のステップに進む前に、Shift キーと Escape キー を押すか レベル エディタのツールバー にある [Stop] をクリックし、PIE モードを終了します。
2.4 - マウス カメラ コントロールを実装する
このステップでは、マウスで操作して、キャラクターが周囲を見回す機能を追加します。
Turn 軸マッピング
メイン メニュー パネルで [Edit] をクリックし、[Project Settings] を選択します。
[Project Settings] タブの左側にある [Engine] セクションで、[Input] をクリックします。
[Bindings] セクションで、[Axis Mappings] の隣にある [+] 記号をクリックします。
[Axis Mappings] の左にある矢印をクリックします。
表示されるテキスト フィールドに「Turn」と入力します。
ドロップダウン メニューで、[Mouse X (マウスの X 軸)] を [Mouse (マウス)] ドロップダウン リストから選択します。
ここでの入力設定は次のようになります。
Lookup 軸マッピング
[Bindings] セクションで、[Axis Mappings] の隣にある [+] 記号をクリックします。
表示されるテキスト フィールドに「LookUp」と入力します。
ドロップダウン メニューで、[Mouse Y (マウスの Y 軸)] を [Mouse] ドロップダウン リストから選択します。
[Mouse Y] の隣にある [Scale] フィールドに「-1.0」を入力します。
ここでの入力設定は次のようになります。
[Project Settings] メニューを閉じます。
入力処理を実装する
このタイミングで回転操作や見上げる操作のマウス入力を処理するためのコードを追加します。
Character
基本クラスでは、次の 2 つの必須関数を定義します。
AddControllerYawInput
AddControllerPitchInput
感度や軸の反転に対する追加サポートなど、追加処理が必要な場合、独自の関数を準備して、入力値を関数に渡す前に調整することもできます。ただしこの場合は、入力を直接
AddControllerYawInput
とAddControllerPitchInput
関数にバインドします。
次のコード行を
SetupPlayerInputComponent
関数 (FPSCharacter.cpp
内) に追加します。// 「ルック」バインディングをセットアップします。 PlayerInputComponent->BindAxis("Turn", this, &AFPSCharacter::AddControllerYawInput); PlayerInputComponent->BindAxis("LookUp", this, &AFPSCharacter::AddControllerPitchInput);
SetupPlayerInputComponent
関数は次のようになります。// Input に機能をバインドする際に呼び出します。 void AFPSCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); // 「移動」バインディングをセットアップします。 PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward); PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight); // 「ルック」バインディングをセットアップします。 PlayerInputComponent->BindAxis("Turn", this, &AFPSCharacter::AddControllerYawInput); PlayerInputComponent->BindAxis("LookUp", this, &AFPSCharacter::AddControllerPitchInput); }
マウス カメラ コントロールをテストする
FPSCharacter 実装ファイルを VS で保存します。
[Solution Explorer] に移動して [FPSProject] を選択します。
[FPSProject] を右クリックして [Build] を選択し、プロジェクトをコンパイルします。
ビルドが終了したら、FPSProject を Unreal Editor で開きます。
レベル エディタのツールバー で [Play] ボタンをクリックします。カメラをマウスでコントロールできるようになりました。
次のステップに進む前に、Shift キーと Escape キー を押すか レベル エディタのツールバー にある [Stop] をクリックし、PIE モードを終了します。
2.5 - キャラクター ジャンプを実装する
一般に、アクション マッピングは個別のイベントに対して入力を処理します。これにより入力を「フレンドリーネーム」にマップして、イベント駆動型の動作にバインドできるようにします。 その結果、キー、マウス ボタン、キーパッド ボタンを押して放す、あるいはいずれかの操作によって、直接ゲームの動作をトリガーできるようになります。 このステップでは、キャラクターがジャンプする機能を追加するために、スペース キーの入力アクション マッピングを設定します。
ジャンプ アクション マッピング
メイン メニュー パネルで [Edit] をクリックし、[Project Settings] を選択します。
[Project Settings] タブの左側にある [Engine] セクションで、[Input] をクリックします。
[Bindings] セクションで、[Action Mappings (アクション マッピング)] の隣にある [+] 記号をクリックします。
[Action Mappings] の左にある矢印をクリックします。
表示されるテキスト フィールドに「Jump」と入力します。
ドロップダウン メニューで、[Space Bar (スペースバー)] を [Keyboard] ドロップダウン リストから選択します。
ここでの入力設定は次のようになります。
[Project Settings] メニューを閉じます。
入力処理を実装する
ヘッダ ファイル (.h
) の内部で ACharacter
基本クラスを確認すると、キャラクターのジャンプに対するビルトイン サポートがあることがわかると思います。キャラクター ジャンプは bPressedJump
変数に結び付けられているため、ジャンプ アクションが押されたときに、boolean を true
に、ジャンプ アクションが解除されたときに false
にする必要があります。これを実行するには次の 2 つの関数を追加する必要があります。
StartJump
StopJump
Visual Studio に戻り、コードを FPSCharacter
クラスに追加します。
FPSCharacter.h
で、次の関数宣言をpublic
アクセス指定子の下に追加します。// キーが押された際にジャンプ フラグを設定します。 UFUNCTION() void StartJump(); // キーが放された際にジャンプ フラグをクリアします。 UFUNCTION() void StopJump();
FPSCharacter.h
は次のようになります。// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GameFramework/Character.h" #include "FPSCharacter.generated.h" UCLASS() class FPSPROJECT_API AFPSCharacter : public ACharacter { GENERATED_BODY() public: // このキャラクターのプロパティのデフォルト値を設定します。 AFPSCharacter(); protected: // ゲームの開始時またはスポーン時に呼び出します。 virtual void BeginPlay() override; public: // フレームごとに呼び出します。 virtual void Tick( float DeltaTime ) override; // Input に機能をバインドする際に呼び出します。 virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; // 前方および後方への移動のための入力を処理します。 UFUNCTION() void MoveForward(float Value); // 右および左への移動のための入力を処理します。 UFUNCTION() void MoveRight(float Value); // キーが押された際にジャンプ フラグを設定します。 UFUNCTION() void StartJump(); // キーが放された際にジャンプ フラグをクリアします。 UFUNCTION() void StopJump(); };
FPSCharacter.cpp
で、次の関数定義をページの一番下に追加します。void AFPSCharacter::StartJump() { bPressedJump = true; } void AFPSCharacter::StopJump() { bPressedJump = false; }
次のコード行を
SetupPlayerInputComponent
関数に追加し、ジャンプ アクションを新しく記述した関数にバインドします。// 「アクション」バインディングをセットアップします。 PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AFPSCharacter::StartJump); PlayerInputComponent->BindAction("Jump", IE_Released, this, &AFPSCharacter::StopJump);
FPSCharacter.cpp
は次のようになります。// Copyright Epic Games, Inc. All Rights Reserved. #include "FPSCharacter.h" // デフォルト値を設定します。 AFPSCharacter::AFPSCharacter() { // このキャラクターがフレームごとに Tick() を呼び出すように設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。 PrimaryActorTick.bCanEverTick = true; } // ゲームの開始時またはスポーン時に呼び出します。 void AFPSCharacter::BeginPlay() { Super::BeginPlay(); check(GEngine != nullptr); // デバッグ メッセージを 5 秒間表示します。 // 「Key」値引数 -1 を指定すると、メッセージは更新またはリフレッシュされなくなります。 GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter.")); } // フレームごとに呼び出します。 void AFPSCharacter::Tick( float DeltaTime ) { Super::Tick( DeltaTime ); } // Input に機能をバインドする際に呼び出します。 void AFPSCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); // 「移動」バインディングをセットアップします。 PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward); PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight); // 「ルック」バインディングをセットアップします。 PlayerInputComponent->BindAxis("Turn", this, &AFPSCharacter::AddControllerYawInput); PlayerInputComponent->BindAxis("LookUp", this, &AFPSCharacter::AddControllerPitchInput); // 「アクション」バインディングをセットアップします。 PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AFPSCharacter::StartJump); PlayerInputComponent->BindAction("Jump", IE_Released, this, &AFPSCharacter::StopJump); } void AFPSCharacter::MoveForward(float Value) { // どちらが「前方」なのかを調べ、プレイヤーがその方向に移動したがっていることを記録します。 FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::X); AddMovementInput(Direction, Value); } void AFPSCharacter::MoveRight(float Value) { // どちらが「右」なのかを調べ、プレイヤーがその方向に移動したがっていることを記録します。 FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y); AddMovementInput(Direction, Value); } void AFPSCharacter::StartJump() { bPressedJump = true; } void AFPSCharacter::StopJump() { bPressedJump = false; }
キャラクター ジャンプをテストする
ここでは、新しく実装したキャラクター移動関数をコンパイルしてテストします。
FPSCharacter ヘッダ (
.h
) と実装.cpp
ファイルを VS で保存します。[Solution Explorer] に移動して [FPSProject] を選択します。
[FPSProject] を右クリックして [Build] を選択し、プロジェクトをコンパイルします。
ビルドが終了したら、FPSProject を Unreal Editor で開きます。
レベル エディタのツールバー で [Play] ボタンをクリックします。W、A、S、D の各キーを使用して前後左右に移動できるようになりました。
次のステップに進む前に、Shift キーと Escape キー を押すか レベル エディタのツールバー にある [Stop] をクリックし、PIE モードを終了します。
2.6 - メッシュをキャラクターに追加する
次のリンクからサンプル メッシュをダウンロードして展開してください。
このステップでは、キャラクターにスケルタルメッシュを加えます。Character クラスはデフォルトで SkeletalMeshComponent オブジェクトを作成します。つまり必要なのは、どの SkeletalMesh アセットを使用するのかということです。
スケルタルメッシュをインポートする
コンテンツ ブラウザ に移動して「Content」フォルダを開きます。
コンテンツ ブラウザ のファイル ウィンドウ内を右クリックして、[Import Asset (アセットのインポート)] ダイアログ ウィンドウを開きます。
[Import to /Game... (/Game にインポート...)] をクリックして、[Import (インポート)] ダイアログ ウィンドウを開きます。
「
GenericMale.fbx
」メッシュ ファイルをダウンロードしたフォルダで見つけて選択します。[Open (開く)] をクリックして、メッシュのプロジェクトへのインポートを開始します。
コンテンツ ブラウザ に [FBX Import Options (FBX インポート オプション)] ダイアログ ウィンドウが表示されます。[Import All (すべてインポート)] をクリックすると、メッシュがプロジェクトに追加されます。
メイン メニュー パネルの [File (ファイル)] をクリックして、インポートされたメッシュを保存します。
サードパーソン メッシュを設定する
BP_FPSCharacter ブループリント クラス アイコンを [Content (コンテンツ)] > [Blueprints (ブループリント)] でダブルクリックし、ブループリント エディタ で開きます。
このブループリントがデータ専用ブループリントであると表示されている場合は、[Open Full Blueprint Editor (フルブループリントエディタを開く)] をクリックします。
[Mesh] コンポーネントを [Components (コンポーネント)] タブでクリックします。
[Details (詳細)] パネルに移動し、[Mesh (メッシュ)] までスクロールします (画面の右側にない場合は、[Window (ウィンドウ)] > [Details] を選択します)。
[Skeletal Mesh (スケルタルメッシュ)] の下にあるドロップダウン ウィンドウを開き、[GenericMale] スケルタルメッシュを選択します。
[Details] パネルの [Transform (トランスフォーム)] セクションまでスクロールし、
SkeletalMeshComponent
をCapsuleComponent
に合わせるために、[Location (位置)] オプションを「X = -5.0; Y = 0.0; Z = -88.0」に設定します。ブループリント エディタ の ビューポート をクリックしてスケルタルメッシュをプレビューします。次のようになります。
スケルタルメッシュが
CapsuleComponent
内部にあり、メッシュがArrowComponent
と同じ方向を向いていることを確認します。スケルタルメッシュ コンポーネントの向きを正しく設定することで、キャラクターがワールド内を正しく移動するようになります。必ず BP_FPSCharacter ブループリントを コンパイル して 保存 してから、ブループリント エディタ を閉じます。
新しいメッシュを PIE モードで検証する
ここで、新しく追加されたメッシュをエディタ内で表示します。
レベル エディタのツールバーで [Play] ボタンをクリックします。動き回るとキャラクターのシャドウが見えます。
エディタのビューポート内でキャラクターのメッシュを確認する場合は、F8 キーを押してポーンから自身を切り離します。F8 キーを押した後に、レベルでカメラを自由に動かすことができます。カメラを動かすには、マウスの左ボタンを押したまま、マウスを動かします。
Shift キーと Escape キー を押すか レベル エディタのツールバー にある [Stop] をクリックし、PIE モードを終了します。
2.7 - カメラ ビューを変更する
前のステップの最後で、デフォルトのカメラはメッシュの首に配置されていました。
このステップでは、カメラのプロパティ (位置や視野角など) を調整するために使用する FPS カメラを設定します。
開始する前に、FPSCharacter.h
にインクルードされたファイルのリストを展開する必要があります。
これにより、コードでさらに多くのカメラ関連関数にアクセスできるようになり、最終的にカメラの配置を操作できます。
Visual Studio プロジェクトを開き、
FPSCharacter.h
に移動します。次のヘッダ ファイルを
FPSCharacter.h
にインクルードします。#include "Camera/CameraComponent.h" #include "Components/CapsuleComponent.h"
カメラ コンポーネントをアタッチする
FPSCharacter.h
を開いて、次のコードをpublic
アクセス指定子の下に追加します。// FPS カメラ。 UPROPERTY(VisibleAnywhere) UCameraComponent* FPSCameraComponent;
FPSCharacter.h
は次のようになります。// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GameFramework/Character.h" #include "Camera/CameraComponent.h" #include "Components/CapsuleComponent.h" #include "FPSCharacter.generated.h" UCLASS() class FPSPROJECT_API AFPSCharacter : public ACharacter { GENERATED_BODY() public: // このキャラクターのプロパティのデフォルト値を設定します。 AFPSCharacter(); protected: // ゲームの開始時またはスポーン時に呼び出します。 virtual void BeginPlay() override; public: // フレームごとに呼び出します。 virtual void Tick( float DeltaTime ) override; // Input に機能をバインドする際に呼び出します。 virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; // 前方および後方への移動のための入力を処理します。 UFUNCTION() void MoveForward(float Value); // 右および左への移動のための入力を処理します。 UFUNCTION() void MoveRight(float Value); // キーが押された際にジャンプ フラグを設定します。 UFUNCTION() void StartJump(); // キーが放された際にジャンプ フラグをクリアします。 UFUNCTION() void StopJump(); // FPS カメラ UPROPERTY(VisibleAnywhere) UCameraComponent* FPSCameraComponent; };
FPSCharacter.cpp
を開き、次のコードをコンストラクタのPrimaryActorTick.bCanEverTick = true:
の下に追加します。// 一人称視点カメラ コンポーネントを作成します。 FPSCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera")); check(FPSCameraComponent != nullptr); // カメラ コンポーネントをカプセル コンポーネントにアタッチします。 FPSCameraComponent->SetupAttachment(CastChecked<USceneComponent, UCapsuleComponent>(GetCapsuleComponent()));
このコードは
UCameraComponent
を作成し、キャラクターのCapsuleComponent
にアタッチします。コンストラクタで記述したブロックの下に次のコードを追加します。
// カメラを目の少し上に位置づけます。 FPSCameraComponent->SetRelativeLocation(FVector(0.0f, 0.0f, 50.0f + BaseEyeHeight)); // ポーンがカメラの回転をコントロールできます。 FPSCameraComponent->bUsePawnControlRotation = true;
このコードは、ポーンでカメラの回転をコントロールできるようにしながら、キャラクターの目の少し上にカメラの位置を調整します。
SetRelativeLocation
は、コンポーネントのデフォルトを設定します。ただし、前の値はまだエディタで設定されています。これを修正するには、ブループリント エディタ を開きます。FPSCameraComponent
をクリックし、[Details] パネルで [Transform] > [Location] の値を見つけます。その値の隣にある [Reset to Default (デフォルトにリセット)] アイコンをクリックします。FPSCharacter.cpp
は次のようになります。// Copyright Epic Games, Inc. All Rights Reserved. #include "FPSCharacter.h" // デフォルト値を設定します。 AFPSCharacter::AFPSCharacter() { // このキャラクターがフレームごとに Tick() を呼び出すように設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。 PrimaryActorTick.bCanEverTick = true; // 一人称視点カメラ コンポーネントを作成します。 FPSCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera")); check(FPSCameraComponent != nullptr); // カメラ コンポーネントをカプセル コンポーネントにアタッチします。 FPSCameraComponent->SetupAttachment(CastChecked<USceneComponent, UCapsuleComponent>(GetCapsuleComponent())); // カメラを目の少し上に位置づけます。 FPSCameraComponent->SetRelativeLocation(FVector(0.0f, 0.0f, 50.0f + BaseEyeHeight)); // ポーンがカメラの回転をコントロールできます。 FPSCameraComponent->bUsePawnControlRotation = true; } // ゲームの開始時またはスポーン時に呼び出します。 void AFPSCharacter::BeginPlay() { Super::BeginPlay(); check(GEngine != nullptr) // デバッグ メッセージを 5 秒間表示します。 // 「Key」値 (最初の引数) が -1 である場合、このメッセージを更新またはリフレッシュする必要はありません。 GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter.")); } // フレームごとに呼び出します。 void AFPSCharacter::Tick( float DeltaTime ) { Super::Tick( DeltaTime ); } // Input に機能をバインドする際に呼び出します。 void AFPSCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); // 「移動」バインディングをセットアップします。 PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward); PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight); // 「ルック」バインディングをセットアップします。 PlayerInputComponent->BindAxis("Turn", this, &AFPSCharacter::AddControllerYawInput); PlayerInputComponent->BindAxis("LookUp", this, &AFPSCharacter::AddControllerPitchInput); // 「アクション」バインディングをセットアップします。 PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AFPSCharacter::StartJump); PlayerInputComponent->BindAction("Jump", IE_Released, this, &AFPSCharacter::StopJump); } void AFPSCharacter::MoveForward(float Value) { // どちらが「前方」なのかを調べ、プレイヤーがその方向に移動したがっていることを記録します。 FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::X); AddMovementInput(Direction, Value); } void AFPSCharacter::MoveRight(float Value) { // どちらが「右」なのかを調べ、プレイヤーがその方向に移動したがっていることを記録します。 FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y); AddMovementInput(Direction, Value); } void AFPSCharacter::StartJump() { bPressedJump = true; } void AFPSCharacter::StopJump() { bPressedJump = false; }
新規カメラをテストする
ここでは、新しく実装されたカメラ コードをコンパイルしてテストします。
FPSCharacter ヘッダ (
.h
) と実装.cpp
ファイルを VS で保存します。[Solution Explorer] に移動して [FPSProject] を選択します。
[FPSProject] を右クリックして [Build] を選択し、プロジェクトをコンパイルします。
ビルドが終了したら、FPSProject を Unreal Editor で開きます。
レベル エディタのツールバー で [Play] ボタンをクリックします。
カメラはキャラクターの頭部の少し上にあります。
BP_FPSCharacter を ビューポート で開き、新しく追加されたカメラ コンポーネントを確認することもできます。
BP_FPSCharacter を コンテンツ ブラウザ で開いて ビューポート に移動すると、キャラクターは次のように表示されます。
2.8 - ファースト パーソン メッシュをキャラクターに追加する
FPS ゲーム作成での一般的なアプローチとして、フルボディ メッシュと「武器と腕」メッシュの 2 つの別々のキャラクター メッシュを使用します。フルボディ メッシュは第三者の視点からキャラクターを見るために使用しますが、プレイヤー自身の視点で見ているときは表示されません。「武器と腕」メッシュは一般にカメラにアタッチされ、プレイヤー自身の視点でマップを見ているときに、プレイヤーにだけ見えるものです。このステップでは、ファースト パーソン メッシュをキャラクターに追加します。
ファースト パーソン キャラクター メッシュを追加する
Visual Studio に戻って
FPSCharacter.h
を開き、次のコードをpublic
の下に追加します。// ファースト パーソン メッシュ (腕) で、所有しているプレイヤーにのみ表示されます。 UPROPERTY(VisibleDefaultsOnly, Category = Mesh) USkeletalMeshComponent* FPSMesh;
FPSCharacter.cpp
を開き、コンストラクタに移動して次のコードを追加し、ファースト パーソン メッシュを作成して設定します。// 所有するプレイヤー向けのファースト パーソン メッシュ コンポーネントを作成します。 FPSMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("FirstPersonMesh")); check(FPSMesh != nullptr); // このメッシュは所有するプレイヤーにのみ表示されます。 FPSMesh->SetOnlyOwnerSee(true); // FPS メッシュを FPS カメラにアタッチします。 FPSMesh->SetupAttachment(FPSCameraComponent); // 単一のメッシュがあるかのような錯覚を維持するには、一部の環境シャドウを無効にします。 FPSMesh->bCastDynamicShadow = false; FPSMesh->CastShadow = false;
SetOnlyOwnerSee
で示しているのは、このメッシュが、このキャラクターを所有しているPlayerController
のみから見えるということです。このコードはこのメッシュをカメラにアタッチし、一部の環境シャドウイングも無効にしています。腕がシャドウをキャストできるようにしてしまうと、ファースト パーソン キャラクターが単一メッシュであるという錯覚が損なわれます。最後に、次のコードを
PSCharacter.cpp
のコンストラクタに追加し、既存のサードパーソン メッシュを所有するキャラクターから非表示にします。// 所有するプレイヤーには通常の (サードパーソン) ボディ メッシュは表示されません。 GetMesh()->SetOwnerNoSee(true);
FPSCharacter ヘッダ (
.h
) と実装.cpp
ファイルを Visual Studio で保存します。[Solution Explorer] に移動して [FPSProject] を選択します。
[FPSProject] を右クリックして [Build] を選択し、プロジェクトをコンパイルします。
ビルドが終了したら、FPSProject を Unreal Editor で開きます。
レベル エディタのツールバー で [Play] ボタンをクリックします。これで、PIE モードでキャラクターのシャドウが見えなくなりました。次のようになります。
この時点で、キャラクター メッシュはエディタ内で見えなくなります。
メッシュとそのシャドウのキャストがまだ見える場合は、エディタを閉じて再起動します。
メッシュ ブループリントをビルドする
先に進む前に、次のリンクからサンプル メッシュをダウンロードして展開してください。
コンテンツ ブラウザ に移動して「Content」フォルダを開きます。
コンテンツ ブラウザ のファイル ウィンドウ内を右クリックして、[Import Asset] ダイアログ ウィンドウを開きます。
[Import to /Game...] をクリックして、[Import] ダイアログ ウィンドウを開きます。
「HeroFPP.fbx」メッシュ ファイルをダウンロードしたフォルダで見つけて選択します。
[Open] をクリックして、メッシュのプロジェクトへのインポートを開始します。
コンテンツ ブラウザ に [FBX Import Options] ダイアログ ウィンドウが表示されます。
[FBX Import Options] ダイアログ ウィンドウで、[Skeleton (スケルトン)] セクションの下のドロップダウン メニューで [Clear (クリア)] を選択し、次に [Import All] をクリックします。
次の [Message Log (メッセージ ログ)] ウィンドウを閉じます。
このメッシュではファースト パーソン メッシュ セットアップがまだ表示されます。後のセクションでセットアップするアニメーションと連動します。
メイン メニュー パネルの [File] をクリックして、インポートされたメッシュを保存します。
コンテンツ ブラウザ の「Blueprints」 フォルダに戻ります。
[BP_FPSCharacter] アイコンをダブルクリックして、ブループリント エディタ で開きます。
ブループリント エディタ で [Components] タブに移動し、新しい FPSMesh コンポーネントを選択します。場合により フルブループリント エディタ を先に開きます。
FPSMesh コンポーネントは FPSCameraComponent の子であるため、常にカメラにアタッチされます。
[Details] パネルに移動して [Mesh] セクションまでスクロールし、[Skeletal Mesh] にあるドロップダウン メニューをクリックします。ドロップダウン メニューで [HeroFPP] スケルタルメッシュを選択肢、腕を ビューポート に追加します。
追加された HeroFPP スケルタルメッシュは、ビューポート 内で次のようになります。
追加されたメッシュの [Transform] オプションを調整します。[Location] を「{220, 0, 35}」に、[Rotation (回転)] を「{180, 50, 180}」に設定します。
この設定により、HeroFPP スケルタルメッシュがカメラの前にトランスフォームします。
必ず BP_FPSCharacter ブループリントを コンパイル して 保存 してから、ブループリント エディタ を閉じます。
新規メッシュをゲーム内で確認する
レベル エディタのツールバー で [Play] ボタンをクリックして、ゲーム内で新規メッシュを表示します。
Shift キーと Escape キー を押すか レベル エディタのツールバー にある [Stop (停止)] をクリックし、PIE モードを終了します。
このセクションで完了したコード
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "GameFramework/Character.h"
#include "Camera/CameraComponent.h"
#include "Components/CapsuleComponent.h"
#include "FPSCharacter.generated.h"
UCLASS()
class FPSPROJECT_API AFPSCharacter : public ACharacter
{
GENERATED_BODY()
public:
// このキャラクターのプロパティのデフォルト値を設定します。
AFPSCharacter();
protected:
// ゲームの開始時またはスポーン時に呼び出します。
virtual void BeginPlay() override;
public:
// フレームごとに呼び出します。
virtual void Tick( float DeltaTime ) override;
// Input に機能をバインドする際に呼び出します。
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
// 前方および後方への移動のための入力を処理します。
UFUNCTION()
void MoveForward(float Value);
// 右および左への移動のための入力を処理します。
UFUNCTION()
void MoveRight(float Value);
// キーが押された際にジャンプ フラグを設定します。
UFUNCTION()
void StartJump();
// キーが放された際にジャンプ フラグをクリアします。
UFUNCTION()
void StopJump();
// FPS カメラ
UPROPERTY(VisibleAnywhere)
UCameraComponent* FPSCameraComponent;
// ファースト パーソン メッシュ (腕) で、所有しているプレイヤーにのみ表示されます。
UPROPERTY(VisibleDefaultsOnly, Category = Mesh)
USkeletalMeshComponent* FPSMesh;
};
// Copyright Epic Games, Inc. All Rights Reserved.
#include "FPSCharacter.h"
// デフォルト値を設定します。
AFPSCharacter::AFPSCharacter()
{
// このキャラクターがフレームごとに Tick() を呼び出すように設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。
PrimaryActorTick.bCanEverTick = true;
// 一人称視点カメラ コンポーネントを作成します。
FPSCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera"));
check(FPSCameraComponent != nullptr);
// カメラ コンポーネントをカプセル コンポーネントにアタッチします。
FPSCameraComponent->SetupAttachment(CastChecked<USceneComponent>(GetCapsuleComponent()));
// カメラを目の少し上に位置づけます。
FPSCameraComponent->SetRelativeLocation(FVector(0.0f, 0.0f, 50.0f + BaseEyeHeight));
// ポーンがカメラの回転をコントロールできます。
FPSCameraComponent->bUsePawnControlRotation = true;
// 所有するプレイヤー向けのファースト パーソン メッシュ コンポーネントを作成します。
FPSMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("FirstPersonMesh"));
check(FPSMesh != nullptr);
// このメッシュは所有するプレイヤーにのみ表示されます。
FPSMesh->SetOnlyOwnerSee(true);
// FPS メッシュを FPS カメラにアタッチします。
FPSMesh->SetupAttachment(FPSCameraComponent);
// 単一のメッシュがあるかのような錯覚を維持するには、一部の環境シャドウイングを無効にします。
FPSMesh->bCastDynamicShadow = false;
FPSMesh->CastShadow = false;
// 所有するプレイヤーには通常の (サードパーソン) ボディ メッシュは表示されません。
GetMesh()->SetOwnerNoSee(true);
}
// ゲームの開始時またはスポーン時に呼び出します。
void AFPSCharacter::BeginPlay()
{
Super::BeginPlay();
check(GEngine != nullptr);
// デバッグ メッセージを 5 秒間表示します。
// 「Key」値引数 -1 を指定すると、メッセージは更新またはリフレッシュされなくなります。
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter."));
}
// フレームごとに呼び出します。
void AFPSCharacter::Tick( float DeltaTime )
{
Super::Tick( DeltaTime );
}
// Input に機能をバインドする際に呼び出します。
void AFPSCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
// 「移動」バインディングをセットアップします。
PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward);
PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight);
// 「ルック」バインディングをセットアップします。
PlayerInputComponent->BindAxis("Turn", this, &AFPSCharacter::AddControllerYawInput);
PlayerInputComponent->BindAxis("LookUp", this, &AFPSCharacter::AddControllerPitchInput);
// 「アクション」バインディングをセットアップします。
PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AFPSCharacter::StartJump);
PlayerInputComponent->BindAction("Jump", IE_Released, this, &AFPSCharacter::StopJump);
}
void AFPSCharacter::MoveForward(float Value)
{
// どちらが「前方」なのかを調べ、プレイヤーがその方向に移動したがっていることを記録します。
FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::X);
AddMovementInput(Direction, Value);
}
void AFPSCharacter::MoveRight(float Value)
{
// どちらが「右」なのかを調べ、プレイヤーがその方向に移動したがっていることを記録します。
FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y);
AddMovementInput(Direction, Value);
}
void AFPSCharacter::StartJump()
{
bPressedJump = true;
}
void AFPSCharacter::StopJump()
{
bPressedJump = false;
}
おつかれさまでした!ここでは、以下の方法について学習しました。
✓ 新しいキャラクターを作成する ✓ 軸マッピングを設定する ✓ キャラクター移動関数を実装する ✓ マウス カメラ コントロールを実装する ✓ キャラクター ジャンプを実装する ✓ メッシュをキャラクターに追加する ✓ カメラ ビューを変更する ✓ ファースト パーソン メッシュをキャラクターに追加する
次のセクションで発射物の実装方法を学習する準備ができました。