UE5でFPSゲーム制作 Part8-しゃがみ

(2023/10/10追記)SpringArmComponentを利用した方法を追加しました。この方法は主にマルチプレイを視野に入れた実装方法になります。

 

UnrealEngineにはデフォルトでしゃがみの機能があり、CrouchとUnCrouchという関数で実装することができます。ただし、この関数をFPSで使用する場合、カメラが瞬間的に動いてしまい画面がガクッとなってしまいます。

これを解決するには

(1)タイムラインを使ってカメラを動かす方法

(2)Camera ComponentをSpring Arm Componentにアタッチする方法

といった方法があります。

しゃがみ(1の方法)

入力アクションでIA_CrouchをDigital(bool)で作成、IMC_FPSに実装します。TriggerはPressedとReleasedに設定します。

 

タイムライン

BP_PlayerCharacterを開き、タイムラインを追加するを選択します。T_Crouchingと名付けて、ノードを開きます。

 

+トラックのところから、フロートトラックを追加します。トラックの長さを0.3にします。グラフを右クリックからカーブフロートにキーを2つ追加します。

キーを選択し、(時間0.0、値0.0)と(時間0.3、値1.0)に設定します。

キーを右クリックし、自動をチェックします。リニアの場合はカメラが一定速度で動きます。

 

BP_PlayerCharacter

IA_Crouchからタイムラインノードにつなぎます。押したときにStartedからPlayに流れ、離した時にCompletedからReverseに流れます。タイムライン実行中、Updateから処理が流れ、完了時にFinishedから流れます。

FinishedをDIrectionでスイッチすることで、再生終了時と逆再生終了時で処理を分けることができます。

Set Relative Location関数でカメラ位置、Set Capsule Half Height関数で当たり判定の大きさを設定します。Lerpは2つの値を線形補間するので、通常時としゃがみ時の数値を入力します。

 

しゃがみ時の設定はクラスのデフォルトからCrouchで検索するとわかりやすいです。

 

Movement CapabilitiesのCan CrouchがTrueでないと、Crouch関数が呼ばれない点に注意してください。

 

 

Crouched Eye Height:しゃがみ時のカメラの高さ

Crouched Half Height:しゃがみ時の当たり判定の大きさ(半高なので実際の高さは2倍)

Max Walk Speed Crouched:しゃがみ時の歩行速度

Can Walk Off Ledges when Crouching:しゃがみ中、崖の淵から落下するかどうか

 

UE準拠のCrouch中はJump関数も呼ばれないので、しゃがみ中もジャンプがしたいなど柔軟なアクションを作る場合には自分でCrouch関数等を作る必要があります。

 

しゃがみ(2の方法)

シングルプレイなら(1)の方法で問題なかったのですが、タイムラインノードがマルチプレイにおいてクライアント側でしか行われないため、マルチプレイの場合カメラの位置ずれによる画面のカクツキが発生してしまいます。

タイムラインを利用した方法のままこれを解決するにはかなりのコストがかかるため、できるならUEが用意してくれているCrouch関数を使いたいです。

(同期処理や独自のしゃがみ機能実装で解決できると思いますが、レプリケーションなどマルチプレイに関する理解が必要になります)

そこで(2)の方法を利用します。

 

カメラコンポーネントをスプリングアームコンポーネントにアタッチします。

PlayerCharacter.h

UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
	class USpringArmComponent* SpringArm;
	
FORCEINLINE class USpringArmComponent* GetCameraBoom() const { return SpringArm; }
PlayerCharacter.cpp

#include "GameFramework/SpringArmComponent.h"
    
// Create a SpringArmComponent
SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
SpringArm->SetupAttachment(GetCapsuleComponent());
SpringArm->SetRelativeLocation(FVector(0.f, 0.f, 70.f));
SpringArm->TargetArmLength = 0.f;
SpringArm->bUsePawnControlRotation = true;
SpringArm->bInheritRoll = false;
SpringArm->bEnableCameraLag = true;

// Create a CameraComponent	
FirstPersonCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera"));
FirstPersonCameraComponent->SetupAttachment(SpringArm);
FirstPersonCameraComponent->SetRelativeLocation(FVector(0.f, 0.f, 0.f));
FirstPersonCameraComponent->bUsePawnControlRotation = false;
BP_PlayerCharacter

SpringArmComponentのEnable Camera LagをTrueにすることでカメラが滑らかに動きます。

Camera Lag Speed:カメラの移動速度が変わります。高いほど早くなります。

 

新規のGameplayAbilityを作成し、GA_Crouchと名付けます。Ability Tag、Activation Owned TagにAbility.Action.Crouchを作成して設定します。

BP_PlayerCharacter

BP_PlayerCharacterのAbility ListにGA_Crouchを登録します。

(1)の時にタイムライン以降の部分を消して、アビリティを実行するノードを置きます。

これでキャラクターがしゃがみ動作を行うことができるようになりました。