0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【UE5】BP_ThirdPersonCharacterのFollowCameraがゲーム中のカメラに使われるまでの流れ

Last updated at Posted at 2023-07-30

最初に

UnrealEngine公式に付属のテンプレートが色々あり、その中の1つにThirdPersonTemplateがあります。
image.png

ThirdPersonTemplateにはBP_ThirdPersonCharacterというThirdPersonのキャラクターが存在しています。
BP_ThirdPersonCharacterにはFollowCameraというUCameraComponentがくっ付いており、それがゲームプレイ時のカメラとして使われています。

image.png

どのようにしてFollowCameraがゲームプレイ時のカメラとして使われているかがわからなかったので、調査してまとめました。

調査した環境

  • Unreal Engine 5.2.1
  • ThirdPersonTemplateのC++版

※フローを全部書くと量が膨大になってしまうため、本筋以外は省略しております。

初期化:BP_ThirdPersonCharacterをAPlayerCameraManagerのカメラのターゲットに設定する

AThirdPersonGameModeのDefaultPawnClassとして指定されているBP_ThirdPersonCharacterが生成される

BP_ThirdPersonCharacterを引数にAPlayerController::Possess()が呼ばれる

BP_ThirdPersonCharacterを引数にAPlayerController::SetViewTarget()が呼ばれる

APlayerCmaeraManagerのカメラのターゲットにBP_ThirdPersonCharacterが設定される

APlayerCameraManagerとは下記のような働きをするクラスとのことです。

PlayerCameraManager は特定のプレイヤーのカメラの管理を担います。また、レンダラなどの他のシステムで使用される最終的なビューのプロパティを定義します。PlayerCameraManager は、ワールドを視認するための「バーチャルの眼」として機能します。 最終的なカメラ プロパティを直接計算したり、カメラに影響するその他のオブジェクトやアクタとの間でブレンドすることもできます (CameraActor 間でのブレンド)。

Unreal Engine のカメラ | Unreal Engine 5.2 ドキュメント より引用

更新処理:FollowCameraの位置と回転を毎フレーム反映させる

UWorld::Tick()が呼ばれる

APlayerController::UpdateCameraManager()が呼ばれる

APlayerControllerが保持しているAPlayerCameraManagerのUpdateCamera()が呼ばれる

APlayerCameraManager::UpdateViewTarget()が呼ばれる

APlayerCameraManagerのターゲットになっているBP_ThirdPersonCharacterの親クラスであるAActorのCalcCamera()が呼ばれる

AActor::CalcCamera()でアクターに付いているUCameraComponentを全検索し、IsActive()がtrueである最初に見つかったUCameraComponent(FollowCamera)のGetCameraView()を呼ぶ。それにより、FollowCameraの位置と回転の値をカメラ側の情報として設定する

UE_5.2\Engine\Source\Runtime\Engine\Private\Actor.cpp よりソースコードを引用

TInlineComponentArray<UCameraComponent*> Cameras;
GetComponents(/*out*/ Cameras);

for (UCameraComponent* CameraComponent : Cameras)
{
	if (CameraComponent->IsActive())
	{
		CameraComponent->GetCameraView(DeltaTime, OutResult);
		return;
	}
}

補足

APlayerCameraManagerのターゲットとなっているアクターにUCameraComponentが付いていない場合はAActor::GetActorEyesViewPoint()という処理が呼ばれ、アクターの位置と回転がカメラの情報として設定されるようです。
PlayerControllerのBPノードのSetViewTargetwithBlendにおいてViewTargetにUCameraComponentが付いていないアクターを渡しても上手く動くのはそのためのようです。
image.png

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?