最初に
UnrealEngine公式に付属のテンプレートが色々あり、その中の1つにThirdPersonTemplateがあります。
ThirdPersonTemplateにはBP_ThirdPersonCharacterというThirdPersonのキャラクターが存在しています。
BP_ThirdPersonCharacterにはFollowCameraというUCameraComponentがくっ付いており、それがゲームプレイ時のカメラとして使われています。
どのようにして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が付いていないアクターを渡しても上手く動くのはそのためのようです。