ue-gameplay-cameras について
ue-gameplay-cameras は、Unreal Engine 5.8 のカメラ開発を支援するリファレンススキルです。従来のカメラスタックと実験段階の Gameplay Camera System を扱い、実装やデバッグのための API 情報と例を提供します。
主な機能
- 012 種類のカメラシステムを比較
- 02一人称・三人称カメラの設定
- 03ビューターゲットの切り替えとブレンド
- 04Camera Manager と Modifier のカスタマイズ
- 05シェイク、シネマカメラ、デバッグの解説
活用シーン
- 01Unreal Engine 5.8 でキャラクターカメラを設定
- 02カメラターゲットの変更とブレンドを実装
- 03画面表示の欠落、誤ったカメラ、ジッターを調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ quodsoler/ unreal-engine-skills --skill ue-gameplay-camerasインストール後、Claude Code で/ue-gameplay-camerasを入力して読み込まれたか確認します。
同梱ファイルreferences/classic-camera-stack.mdreferences/gameplay-camera-system.md
詳細
UE Gameplay Cameras
対象エンジン:UE 5.8。以下の API は 5.8 のヘッダーで検証済みです。古い形式は「Deprecated — do not use」に記載されています。
5.8 には 2 つのカメラスタックが含まれています。従来のスタックは Engine モジュール(Classes/Camera、Classes/GameFramework/SpringArmComponent.h)にあり、シェイクパターンは EngineCameras プラグイン、フィルムスタイルのカメラは CinematicCamera にあります。データ駆動型の Gameplay Camera System は GameplayCameras プラグインにあります(5.8 では Experimental ですが、デフォルトで有効です)。Build.cs には "Core"、"CoreUObject"、"Engine" に加えて、シネカメラには "CinematicCamera"、シェイクパターンには "EngineCameras"、プラグインには "GameplayCameras" が必要です。
コンテキスト
.agents/ue-project-context.md が存在する場合は読み込んでください(モジュール名、規約、有効なプラグイン、GAS/ネットワーキングの設定)。ファイルがなくても作業を止めないでください。
リクエストとコードベースから該当領域を特定してください。解釈が 2 通り考えられ、その違いによってコードが変わる場合に限り、質問してください。
| リクエストの内容… | 参照先 |
|---|---|
| 2 つのスタックのどちらを選ぶか | 従来のスタックと Gameplay Camera System |
| 各フレームで最終ビューを計算するのは何か | 従来のパイプラインの実行方法 |
| 三人称のブーム、カメララグ、衝突プローブ | 三人称スプリングアームカメラ |
| 一人称カメラ、目の高さ、ビュー回転 | 一人称カメラ |
| カメラの切り替え、アクター間のブレンド | ビューターゲットとブレンド |
| ピッチ制限、FOV、フェード、カスタムカメラロジック | カスタム APlayerCameraManager |
| カメラの持続的なポストエフェクト(傾き、リコイル、ロックオン) | カメラモディファイア |
| 爆発、被弾、ワールド空間の揺れ | カメラシェイク |
| 焦点距離、絞り、フォーカス、レール、クレーン | シネマティックカメラ |
| カメラアセット、リグ、ディレクター、ブレンド、コントロール回転 | Gameplay Camera System |
| 新しいカメラノードとエバリュエーターの作成 | C++ でのカスタムカメラノード |
| 何も描画されない、カメラが違う、ジッターが発生する | カメラのデバッグ |
従来のスタックの API 全般(カメラのポストプロセス、FMinimalViewInfo のフィールド、シェイクパターン一覧、シネカメラの設定):references/classic-camera-stack.md。ノード/ディレクター/サービスの一覧、カメラ変数、評価コンテキスト、CVar:references/gameplay-camera-system.md。
従来のスタックと Gameplay Camera System
| 必要なもの | 従来のスタック | Gameplay Camera System |
|---|---|---|
| 今すぐ使える安定性 | はい — 本番用 API | プラグインは 5.8 で Experimental(GameplayCameras.uplugin の IsExperimentalVersion)。API は引き続き変更される可能性があります |
| 初期状態で有効 | 常に有効(Engine モジュール) | はい — "EnabledByDefault": true |
| 1 つのポーンにつき 1 台のカメラ、少数のモード | 最適 | 過剰 |
| 多数のカメラモードと、作成済みのブレンドおよびトランジション | UpdateViewTarget で独自のステートマシンを作成 | 組み込み:カメラリグ + トランジション + ブレンドスタック |
| C++ なしでデザイナーがカメラを作成 | Blueprint サブクラスのみ | カメラアセット、リググラフ、State Tree ディレクター |
| モードごとのポストプロセス、フレーミング、衝突時の押し戻し | 独自に実装 | カメラノードを同梱 |
| カメラシェイク | UCameraShakeBase + パターン | UCameraShakeAsset + シェイクカメラノード |
併用も可能です。AGameplayCamerasPlayerCameraManager は APlayerCameraManager のサブクラスなので、プラグインが評価を実行している間も、従来のビューターゲット、フェード、モディファイアを使用できます。
クラシックなパイプラインの実行方法
APlayerControllerはPlayerCameraManagerを保持します(TSubclassOf<APlayerCameraManager> PlayerCameraManagerClassからvirtual void SpawnPlayerCameraManager()によって生成されます)。APlayerCameraManager::UpdateCamera(float DeltaTime)→DoUpdateCamera(float DeltaTime)→UpdateViewTarget(FTViewTarget& OutVT, float DeltaTime)。UpdateViewTargetはOutVT.POV(FMinimalViewInfo)に値を設定します。ターゲットがACameraActorの場合はそのカメラコンポーネントを直接使用し、それ以外のターゲットではTarget->CalcCamera(PlayerCameraManager.cpp:354)を呼び出します。基底のAActor実装は、bFindCameraComponentWhenViewTargetが true の場合は最初のアクティブなカメラコンポーネントを使用し、そうでない場合はアクターの目の視点を使用します(Actor.cpp:3688-3706)。ApplyCameraModifiers(float DeltaTime, FMinimalViewInfo& InOutPOV)は、ModifierList内のすべてのUCameraModifierをPriorityの順に実行します(0 が最高)。- 結果はキャッシュされます。
GetCameraLocation()、GetCameraRotation()、GetCameraCacheView()はその値を読み取り、APlayerController::GetPlayerViewPoint(FVector& out_Location, FRotator& out_Rotation)はその値を返します。
APlayerController の bAutoManageActiveCameraTarget(デフォルトは true)を有効にすると、ポーンの所持時に virtual void AutoManageActiveCameraTarget(AActor* SuggestedTarget) が呼び出されます。そのため、新たに所持したポーンが、コードを書かなくてもビューターゲットになります。
三人称スプリングアームカメラ
// MyCharacter.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MyCharacter.generated.h"
class UCameraComponent;
class USpringArmComponent;
UCLASS()
class MYGAME_API AMyCharacter : public ACharacter
{
GENERATED_BODY()
public:
AMyCharacter();
private:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera", meta = (AllowPrivateAccess = "true"))
TObjectPtr<USpringArmComponent> CameraBoom;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera", meta = (AllowPrivateAccess = "true"))
TObjectPtr<UCameraComponent> FollowCamera;
};
// MyCharacter.cpp - also include Camera/CameraComponent.h,
// GameFramework/SpringArmComponent.h and GameFramework/CharacterMovementComponent.h
#include "MyCharacter.h"
AMyCharacter::AMyCharacter()
{
bUseControllerRotationPitch = false;
bUseControllerRotationYaw = false;
bUseControllerRotationRoll = false;
GetCharacterMovement()->bOrientRotationToMovement = true;
GetCharacterMovement()->RotationRate = FRotator(0.f, 500.f, 0.f);
CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
CameraBoom->SetupAttachment(RootComponent);
CameraBoom->TargetArmLength = 400.f;
CameraBoom->bUsePawnControlRotation = true;
CameraBoom->bInheritPitch = true;
CameraBoom->bInheritYaw = true;
CameraBoom->bInheritRoll = false;
CameraBoom->SocketOffset = FVector(0.f, 60.f, 0.f);
CameraBoom->TargetOffset = FVector(0.f, 0.f, 50.f);
CameraBoom->bDoCollisionTest = true;
CameraBoom->ProbeChannel = ECC_Camera;
CameraBoom->ProbeSize = 12.f;
CameraBoom->bEnableCameraLag = true;
CameraBoom->CameraLagSpeed = 10.f;
CameraBoom->CameraLagMaxDistance = 100.f;
FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName);
FollowCamera->bUsePawnControlRotation = false;
FollowCamera->FieldOfView = 90.f;
}
SocketOffset はブームの回転空間で適用されます(横方向のオフセットはカメラに追従します)。TargetOffset はワールド空間で適用されます(高さのオフセットは垂直のままです)。bUsePawnControlRotation はブームかカメラのどちらか一方だけに設定してください。両方に設定すると、コントロール回転が二重に適用されます。ブームが継承する回転(親の回転またはコントロール回転)は FRotator GetTargetRotation() const で取得でき、衝突プローブによってアームが引き寄せられたかどうかは bool IsCollisionFixApplied() const で確認できます。
一人称カメラ
UCameraComponent をメッシュまたはカプセルに直接アタッチし、カメラで bUsePawnControlRotation = true に設定します。また、ビューに合わせてボディを回転させるため、ポーンでは bUseControllerRotationYaw = true のままにします。
// MyFirstPersonCharacter.h - inside the class body
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera")
TObjectPtr<UCameraComponent> FirstPersonCamera;
// MyFirstPersonCharacter.cpp - also include Camera/CameraComponent.h and Components/CapsuleComponent.h
AMyFirstPersonCharacter::AMyFirstPersonCharacter()
{
bUseControllerRotationYaw = true;
FirstPersonCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera"));
FirstPersonCamera->SetupAttachment(GetCapsuleComponent());
FirstPersonCamera->SetRelativeLocation(FVector(0.f, 0.f, BaseEyeHeight));
FirstPersonCamera->bUsePawnControlRotation = true;
FirstPersonCamera->bEnableFirstPersonFieldOfView = true;
FirstPersonCamera->bEnableFirstPersonScale = true;
FirstPersonCamera->FirstPersonFieldOfView = 70.f;
FirstPersonCamera->FirstPersonScale = 0.6f;
}
FirstPersonFieldOfView と FirstPersonScale は、一人称としてタグ付けされたプリミティブにのみ影響します。また、どちらも対応する bEnable* フラグを設定する必要があります。APawn::BaseEyeHeight は virtual FVector GetPawnViewLocation() const に渡されます。しゃがみ動作に対応するには virtual void RecalculateBaseEyeHeight() をオーバーライドしてください。virtual FRotator GetViewRotation() const は、スプリングアームと AI の知覚が使用する照準回転です。視点を自分で計算するには AActor::CalcCamera をオーバーライドし、Super を呼び出さないでください。ACameraActor 以外のビューターゲットでは、常にこのオーバーライドが実行されます。カメラコンポーネントの検索処理は基底実装にあります(Actor.cpp:3690)。Super を呼び出したうえでコンポーネントの検索をスキップさせたい場合に限り、bFindCameraComponentWhenViewTarget = false に設定してください。
// MyViewTargetActor.cpp - declare the override in the class body, include Camera/CameraTypes.h
void AMyViewTargetActor::CalcCamera(float DeltaTime, struct FMinimalViewInfo& OutResult)
{
OutResult.Location = GetActorLocation() + FVector(0.f, 0.f, 150.f);
OutResult.Rotation = GetActorRotation();
OutResult.FOV = 75.f;
}
ビューターゲットとブレンド
// Inside a method of a MyGame class that has a PlayerController - include GameFramework/PlayerController.h
void AMyPlayerController::FocusOnActor(AActor* NewTarget)
{
SetViewTargetWithBlend(NewTarget, 0.75f, VTBlend_EaseInOut, 2.f, false);
}
virtual void SetViewTargetWithBlend(class AActor* NewViewTarget, float BlendTime = 0, enum EViewTargetBlendFunction BlendFunc = VTBlend_Linear, float BlendExp = 0, bool bLockOutgoing = false)を使用します。EViewTargetBlendFunctionの値は、VTBlend_Linear、VTBlend_Cubic、VTBlend_EaseIn、VTBlend_EaseOut、VTBlend_EaseInOut、VTBlend_PreBlendedです。BlendExpが関係するのは、3つのイーズ関数のみです。bLockOutgoingを有効にすると、ブレンドが終わるまで古いターゲットのPOVが固定されます。古いターゲットをテレポートさせる、または破棄する場合に使用してください。
マネージャーレベルでは、virtual void SetViewTarget(class AActor* NewViewTarget, FViewTargetTransitionParams TransitionParams = FViewTargetTransitionParams())を使用します。FViewTargetTransitionParamsには、BlendTime、BlendFunction、BlendExp、bLockOutgoingが含まれます。ブレンド中、マネージャーはViewTargetとPendingViewTarget(どちらもFTViewTargetで、それぞれTargetとPOVを持ちます)を保持し、BlendTimeToGoをカウントダウンします。保留中のターゲットが昇格すると、OnBlendComplete()が呼び出されます。
SetViewTargetとSetViewTargetWithBlendが作用するのは、呼び出し元マシンのカメラマネージャーのみです。レプリケーションは行われません。サーバーからクライアントのビューを変更するには、クライアントRPCのUFUNCTION(Reliable, Client) void ClientSetViewTarget(class AActor* A, struct FViewTargetTransitionParams TransitionParams = FViewTargetTransitionParams())を呼び出します。
カスタムAPlayerCameraManager
// MyCameraManager.h
#pragma once
#include "CoreMinimal.h"
#include "Camera/PlayerCameraManager.h"
#include "MyCameraManager.generated.h"
UCLASS()
class MYGAME_API AMyCameraManager : public APlayerCameraManager
{
GENERATED_BODY()
public:
AMyCameraManager(const FObjectInitializer& ObjectInitializer);
protected:
virtual void UpdateViewTarget(FTViewTarget& OutVT, float DeltaTime) override;
UPROPERTY(EditDefaultsOnly, Category = "Aim")
float AimFieldOfView = 55.f;
UPROPERTY(BlueprintReadWrite, Category = "Aim")
bool bIsAiming = false;
};
// MyCameraManager.cpp
#include "MyCameraManager.h"
AMyCameraManager::AMyCameraManager(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
ViewPitchMin = -70.f;
ViewPitchMax = 55.f;
DefaultFOV = 90.f;
}
void AMyCameraManager::UpdateViewTarget(FTViewTarget& OutVT, float DeltaTime)
{
Super::UpdateViewTarget(OutVT, DeltaTime);
if (bIsAiming)
{
OutVT.POV.FOV = AimFieldOfView;
}
}
APlayerControllerのコンストラクターでPlayerCameraManagerClass = AMyCameraManager::StaticClass();を設定して登録します。知っておくと便利なその他のフックには、virtual void InitializeFor(class APlayerController* PC)、virtual void ProcessViewRotation(float DeltaTime, FRotator& OutViewRotation, FRotator& OutDeltaRot)、およびクランプ用ヘルパーのLimitViewPitch、LimitViewYaw、LimitViewRollがあります。
フェードはマネージャー経由で実行します。アルファ値を自分で制御する場合は、virtual void StartCameraFade(float FromAlpha, float ToAlpha, float Duration, FLinearColor Color, bool bShouldFadeAudio = false, bool bHoldWhenFinished = false)、virtual void StopCameraFade()、およびvirtual void SetManualCameraFade(float InFadeAmount, FLinearColor Color, bool bInFadeAudio)を使用します。APlayerController::ClientSetCameraFadeはレプリケーション対応のラッパーです。
カメラモディファイア
モディファイアは、毎フレーム計算済みのPOVに後処理を行う状態を持つオブジェクトです。傾き、反動、呼吸、ロックオンの微調整などに使います。
// MyCameraModifier.h
#pragma once
#include "CoreMinimal.h"
#include "Camera/CameraModifier.h"
#include "MyCameraModifier.generated.h"
UCLASS()
class MYGAME_API UMyCameraModifier : public UCameraModifier
{
GENERATED_BODY()
public:
UMyCameraModifier(const FObjectInitializer& ObjectInitializer);
virtual bool ModifyCamera(float DeltaTime, struct FMinimalViewInfo& InOutPOV) override;
UPROPERTY(EditDefaultsOnly, Category = "Lean")
float LeanRollDegrees = 8.f;
};
// MyCameraModifier.cpp
#include "MyCameraModifier.h"
#include "Camera/CameraTypes.h" // FMinimalViewInfo is only forward-declared by CameraModifier.h
UMyCameraModifier::UMyCameraModifier(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
Priority = 10;
AlphaInTime = 0.2f;
AlphaOutTime = 0.3f;
}
bool UMyCameraModifier::ModifyCamera(float DeltaTime, struct FMinimalViewInfo& InOutPOV)
{
Super::ModifyCamera(DeltaTime, InOutPOV);
InOutPOV.Rotation.Roll += LeanRollDegrees * Alpha;
return false;
}
優先度の低いモディファイアの実行を止める場合にのみ、trueを返します。Alphaは、AlphaInTime/AlphaOutTimeに基づいてvirtual void UpdateAlpha(float DeltaTime)が更新します。遷移先はvirtual float GetTargetAlpha()で決まります。virtual void EnableModifier()、virtual void DisableModifier(bool bImmediate = false)、virtual void ToggleModifier()で切り替えます。virtual bool IsDisabled() constは状態を返します。
マネージャーのTArray<TSubclassOf<UCameraModifier>> DefaultModifiersで宣言的にモディファイアを追加するか、実行時にvirtual UCameraModifier* AddNewCameraModifier(TSubclassOf<UCameraModifier> ModifierClass)で追加できます。この関数はインスタンスを生成して登録し、返します。virtual UCameraModifier* FindCameraModifierByClass(TSubclassOf<UCameraModifier> ModifierClass)で後から取得し、virtual bool RemoveCameraModifier(UCameraModifier* ModifierToRemove)で削除できます。virtual bool ProcessViewRotation(class AActor* ViewTarget, float DeltaTime, FRotator& OutViewRotation, FRotator& OutDeltaRot)を使うと、POVの構築前にモディファイアがプレイヤーの照準を変更できます。
カメラシェイク
UCameraShakeBaseは薄いコンテナーで、モーションはそのRootShakePattern(UCameraShakePattern)にあります。C++ではパターンをサブクラス化します。通常は、Duration、BlendInTime、BlendOutTimeがすでに用意されているUSimpleCameraShakePatternを使い、virtual void UpdateShakePatternImpl(const FCameraShakePatternUpdateParams& Params, FCameraShakePatternUpdateResult& OutResult)をオーバーライドして、OutResult.Location、OutResult.Rotation、OutResult.FOVに値を書き込みます。継承したStateをState.Update(Params.DeltaTime)で進め、返されるウェイトでスケーリングしてください。そうしないとシェイクが終了しません。詳しい実装例はreferences/classic-camera-stack.mdを参照してください。その他のパターンフックはすべてUCameraShakePatternにあり、GetShakePatternInfoImpl(FCameraShakeInfo& OutInfo) const、StartShakePatternImpl(const FCameraShakePatternStartParams& Params)、ScrubShakePatternImpl(const FCameraShakePatternScrubParams& Params, FCameraShakePatternUpdateResult& OutResult)、IsFinishedImpl() const、StopShakePatternImpl(const FCameraShakePatternStopParams& Params)、TeardownShakePatternImpl()です。
標準で用意されているパターン(モジュール"EngineCameras"):UPerlinNoiseCameraShakePattern、UWaveOscillatorCameraShakePattern、UCompositeCameraShakePattern、およびULegacyCameraShakeを介して利用するULegacyCameraShakePatternです。USequenceCameraShakePatternはUCameraAnimationSequenceからシェイクを再生し、TemplateSequenceプラグインにあります。UDefaultCameraShakeBaseは、ルートパターンのデフォルトがパーリンノイズのUCameraShakeBaseで、通常はこれをBlueprintの起点にします。シェイクを再生する方法:
| 呼び出し | 場所 | 用途 |
|---|---|---|
APlayerCameraManager::StartCameraShake(TSubclassOf<UCameraShakeBase> ShakeClass, float Scale=1.f, ECameraShakePlaySpace PlaySpace = ECameraShakePlaySpace::CameraLocal, FRotator UserPlaySpaceRot = FRotator::ZeroRotator) | ローカル | 直接再生。ローカルプレイヤーのみ |
APlayerController::ClientStartCameraShake(TSubclassOf<class UCameraShakeBase> Shake, float Scale = 1.f, ECameraShakePlaySpace PlaySpace = ECameraShakePlaySpace::CameraLocal, FRotator UserPlaySpaceRot = FRotator::ZeroRotator) | サーバー → 1人のクライアント | サーバー駆動のフィードバック |
UGameplayStatics::PlayWorldCameraShake(const UObject* WorldContextObject, TSubclassOf<class UCameraShakeBase> Shake, FVector Epicenter, float InnerRadius, float OuterRadius, float Falloff = 1.f, bool bOrientShakeTowardsEpicenter = false) | ローカル、放射状 | 爆発 |
UCameraShakeSourceComponent::StartCameraShake(TSubclassOf<UCameraShakeBase> InCameraShake, float Scale=1.f, ECameraShakePlaySpace PlaySpace = ECameraShakePlaySpace::CameraLocal, FRotator UserPlaySpaceRot = FRotator::ZeroRotator) | ローカル、減衰あり | 揺れ続ける機械 |
停止するには、APlayerController::ClientStopCameraShake(TSubclassOf<class UCameraShakeBase> Shake, bool bImmediately = true)、APlayerCameraManager::StopAllCameraShakes(bool bImmediately = true)、またはStopAllCameraShakesFromSource(UCameraShakeSourceComponent* SourceComponent, bool bImmediately = true)を使います。ECameraShakePlaySpaceはCameraLocal、World、UserDefinedのいずれかです。UCameraShakeSourceComponentにはAttenuation(ECameraShakeAttenuation)、InnerAttenuationRadius、OuterAttenuationRadius、CameraShake、bAutoStartがあります。ACameraShakeSourceActorは、レベルに配置できるラッパーです。
シェイクはUCameraModifier_CameraShakeによって適用されます。このモディファイアはマネージャーによってデフォルトで作成されます。FAddCameraShakeParams::DurationOverrideやカスタム初期化子が必要な場合は、低レベルのエントリポイントであるvirtual UCameraShakeBase* AddCameraShake(TSubclassOf<UCameraShakeBase> NewShake, const FAddCameraShakeParams& Params)を使います。
シネマティックカメラ
UCineCameraComponent は UCameraComponent を拡張し、物理カメラの設定として、Filmback(FCameraFilmbackSettings)、LensSettings(FCameraLensSettings)、FocusSettings(FCameraFocusSettings)、CurrentFocalLength、CurrentAperture、CurrentFocusDistance、CurrentHorizontalFOV を備えています。派生値が再計算されるよう、セッター(SetFilmback、SetLensSettings、SetFocusSettings、void SetCurrentFocalLength(float InFocalLength)、void SetCurrentAperture(const float NewCurrentAperture))を使って値を設定します。ACineCameraActor は LookatTrackingSettings(FCameraLookatTrackingSettings)を追加します。ACameraRig_Rail は CurrentPositionOnRail(スプライン上の位置を 0~1 で指定)と bLockOrientationToRail を公開し、ACameraRig_Crane は CranePitch、CraneYaw、CraneArmLength、bLockMountPitch、bLockMountYaw を公開します。カメラアクターをどちらかにアタッチし、公開されている浮動小数点値をアニメーションさせます。シーケンサーの管理対象であるカメラカット、スポーン可能オブジェクト、ULevelSequencePlayer、テイク録画は ue-sequencer-cinematics が担当します。このスキルでは、カメラオブジェクト自体を扱います。
ゲームプレイカメラシステム
GameplayCameras プラグイン(5.8 では実験的機能)はデフォルトで有効です。UCameraAsset は UCameraDirector と開始/終了トランジションを保持します。ディレクターは各フレームで実行する UCameraRigAsset を選択します。リグは RootNode をルートとする UCameraNode オブジェクトのツリーです。実行中のシステムはブレンドスタック上でリグをブレンドし、FMinimalViewInfo を出力します。ポーンに UGameplayCameraComponent を追加し、カメラアセットを指定してください。
// MyGameplayCameraCharacter.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MyGameplayCameraCharacter.generated.h"
class UGameplayCameraComponent;
UCLASS()
class MYGAME_API AMyGameplayCameraCharacter : public ACharacter
{
GENERATED_BODY()
public:
AMyGameplayCameraCharacter();
virtual void BeginPlay() override;
private:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera", meta = (AllowPrivateAccess = "true"))
TObjectPtr<UGameplayCameraComponent> GameplayCamera;
};
// MyGameplayCameraCharacter.cpp - also include GameFramework/GameplayCameraComponent.h
#include "MyGameplayCameraCharacter.h"
AMyGameplayCameraCharacter::AMyGameplayCameraCharacter()
{
GameplayCamera = CreateDefaultSubobject<UGameplayCameraComponent>(TEXT("GameplayCamera"));
GameplayCamera->SetupAttachment(RootComponent);
}
void AMyGameplayCameraCharacter::BeginPlay()
{
Super::BeginPlay();
if (APlayerController* PC = Cast<APlayerController>(GetController()))
{
if (PC->IsLocalController())
{
GameplayCamera->ActivateCameraForPlayerController(PC, true);
}
}
}
アセットは FCameraAssetReference CameraReference(従来の UCameraAsset 直接ポインターに代わるプロパティ)に設定します。有効化 API は UGameplayCameraComponentBase にあります。void ActivateCameraForPlayerIndex(int32 PlayerIndex, bool bSetAsViewTarget = true)、void ActivateCameraForPlayerController(APlayerController* PlayerController, bool bSetAsViewTarget = true)、および UActorComponent から継承した Deactivate() です。便利な状態プロパティや関数には、bRunStandaloneCameraSystem、bSetControlRotationWhenViewTarget、DefaultPlayer、FRotator GetEvaluatedCameraRotation() const、UCineCameraComponent* GetOutputCameraComponent() const があります。出力はシネカメラなので、レンズとフォーカスの設定をそのまま利用できます。
| クラス | 役割 |
|---|---|
UGameplayCameraComponent / AGameplayCameraActor | 独自の評価コンテキストで UCameraAsset を実行します |
UGameplayCameraRigComponent / AGameplayCameraRigActor | カメラアセットを作成せずに単一の UCameraRigAsset を実行します |
UGameplayCameraSystemComponent / AGameplayCameraSystemActor | カメラシステム自体をホストします。ActivateCameraSystemForPlayerController(APlayerController*)、DeactivateCameraSystem(AActor* NextViewTarget = nullptr)、bSetPlayerControllerRotation |
AGameplayCamerasPlayerCameraManager | システムを実行する APlayerCameraManager のサブクラスです。ActivateGameplayCamera に加えて、Blueprint 専用(エクスポートされていないため、C++ から呼び出すとリンクエラーになる)の StealPlayerController / ReleasePlayerController があります |
UGameplayControlRotationComponent | プレイヤーのコントロール回転をカメラと同期します。AxisActions、AutoActivateForPlayer を備えています。ActivateControlRotationManagementFor* 関数はエクスポートされていないため、Blueprint 専用です(GameplayControlRotationComponent.h:40-53) |
5.8 に同梱されているカメラディレクターは、USingleCameraDirector(単一の CameraRig)、UBlueprintCameraDirector(UBlueprintCameraDirectorEvaluator サブクラスを実行します。RunCameraDirector を実装し、ActivateCameraRig を呼び出してください)、UStateTreeCameraDirector(UCameraDirectorStateTreeSchema で構築された FStateTreeReference)、UPriorityQueueCameraDirector です。
ディレクターに触れずに行うランタイムのリグ制御は、コンポーネントとカメラマネージャーから利用できます。FCameraRigInstanceID ActivatePersistentBaseCameraRig(UCameraRigAsset* CameraRig)(Global および Visual のバリアントもあります)、void DeactivateCameraRig(FCameraRigInstanceID InstanceID, bool bImmediately = false)、FCameraRigInstanceID StartGlobalCameraModifierRig(const UCameraRigAsset* CameraRig, int32 OrderKey = 0) / StartVisualCameraModifierRig / void StopCameraModifierRig(FCameraRigInstanceID InstanceID, bool bImmediately = false) です。シェイクには、FCameraShakeInstanceID StartCameraShakeAsset(const UCameraShakeAsset* CameraShake, float ShakeScale = 1.f, ECameraShakePlaySpace PlaySpace = ECameraShakePlaySpace::CameraLocal, FRotator UserPlaySpaceRotation = FRotator::ZeroRotator) と bool StopCameraShakeAsset(FCameraShakeInstanceID InInstanceID, bool bImmediately = false) を使用します。ノード、変数、トランジション、サービスの一覧については、references/gameplay-camera-system.md を参照してください。
C++ のカスタムカメラノード
ノードは UCameraNode(データ。リググラフで編集可能)と、FCameraNodeEvaluator(ランタイム。エバリュエーターストレージに割り当て)を組み合わせたものです。ノードで OnBuildEvaluator をオーバーライドし、Builder.BuildEvaluator<FMyEvaluator>() を返します。エバリュエーターのクラスでは UE_DECLARE_CAMERA_NODE_EVALUATOR を、.cpp では UE_DEFINE_CAMERA_NODE_EVALUATOR を使用する必要があります。これらは RTTI 型 ID を登録します。登録しないと、エバリュエーターのキャスト(CastThis、CastThisChecked)と型検索が失敗します(GetCameraNodeAs はノードに対する通常の UObject の Cast であり、これらには依存しません)。調整可能な値はカメラパラメーター(FVector3dCameraParameter など)として公開し、デザイナーがカメラ変数にバインドできるようにします。OnInitialize で初期化した TCameraParameterReader<T> を通じて読み取り、OnRun で FCameraPose のセッターを使って結果を書き込みます。ECameraNodeEvaluatorFlags は最小限に保ちます。エバリュエーターは Default(パラメーターの更新、シリアル化、オペレーション)から開始するため、使用しないフラグは SetNodeEvaluatorFlags でクリアします。
ショルダーオフセットノードの実装例と、両クラスのフック一覧については、references/gameplay-camera-system.md を参照してください。
カメラのデバッグ
| 症状 | 確認項目 |
|---|---|
| 画面に表示されるアクターが違う | ShowDebug Camera — ビューターゲットを含むカメラマネージャーの状態を出力します |
| Possession 後に何も表示されない | bAutoManageActiveCameraTarget、または実行されなかった SetViewTarget 呼び出し |
CalcCamera のオーバーライドが無視される | ターゲットが ACameraActor、Blueprint の BlueprintUpdateCamera が true を返した、またはオーバーライドが Super::CalcCamera(カメラコンポーネントを選択します)を呼び出している |
| カメラがジオメトリにめり込む | ブームの bDoCollisionTest、ProbeChannel、ProbeSize |
| ブレンドがイージングせずに切り替わる | BlendTime が 0、または BlendFunc が VTBlend_PreBlended |
| ピッチが垂直を超えて動く | カメラマネージャーの ViewPitchMin / ViewPitchMax |
| Gameplay Cameras に何も表示されない | GameplayCameras.Debug.Enable 1 を実行してから、GameplayCameras.Debug.Categories nodetree を実行します |
知っておくと便利な Gameplay Cameras の CVar:GameplayCameras.Debug.Enable、GameplayCameras.Debug.Categories(nodetree、directortree、blendstacks、services、posestats、viewfinder)、GameplayCameras.Debug.SystemID、GameplayCameras.Debug.Trace、GameplayCameras.Debug.NodeTree.Filter、GameplayCameras.Debug.BlendStacks.Filter。プロジェクト設定は UGameplayCamerasSettings(bAutoBuildInPIE、DefaultViewRotationMode)にあります。Dedicated Server は何も描画しないため、シェイク、フェード、ポストプロセスをそこで処理しても無駄になります。クライアント RPC から実行するか、if (GetNetMode() != NM_DedicatedServer) でガードしてください。
非推奨 — 使用しないでください
| 出力しないでください | 5.8 で使用 | 出典 |
|---|---|---|
#include "Camera/CameraShake.h" | #include "Shakes/LegacyCameraShake.h" | EngineCameras/Legacy/Camera/CameraShake.h:9 の UE_DEPRECATED_HEADER(5.5) |
#include "Shakes/MatineeCameraShake.h" / UMatineeCameraShake | ULegacyCameraShake | EngineCameras/Public/Shakes/MatineeCameraShake.h:9 の UE_DEPRECATED_HEADER(5.5) |
UCameraAnim、UCameraAnimInst、PlayCameraAnim | UCameraAnimationSequence + UEngineCamerasSubsystem::PlayCameraAnimation | 5.8 のヘッダーには UCameraAnim クラスが存在しません |
FCameraRigParameterOverrides と F*CameraRigParameterOverride 構造体 | FCameraRigAssetReference の FInstancedPropertyBag パラメーターオーバーライド | GameplayCameras/Public/Core/CameraRigAssetReference.h:26-43 の UE_DEPRECATED(5.7) |
UCameraRigProxyTable | FCameraRigProxyRedirectTable | GameplayCameras/Public/Core/CameraRigProxyRedirectTable.h:69 の UE_DEPRECATED(5.6) |
FBlueprintCameraDirectorEvaluationParams / ActivateParams / DeactivateParams を受け渡し用に使用すること | RunCameraDirector / ActivateCameraDirector / DeactivateCameraDirector にパラメーターを直接渡すこと | GameplayCameras/Public/Directors/BlueprintCameraDirector.h:18,32,42 の UE_DEPRECATED(5.6) |
UActivateCameraRigFunctions::ActivatePersistentBaseCameraRig(WorldContext, PC, Rig) | ゲームプレイカメラコンポーネントまたはカメラマネージャーの同名メソッド | GameplayCameras/Public/GameFramework/ActivateCameraRigFunctions.h:32 の DeprecatedFunction |
UGameplayCameraComponent::DeactivateCamera(bImmediately) | Deactivate() | GameplayCameras/Public/GameFramework/GameplayCameraComponentBase.h:212 の DeprecatedFunction |
UGameplayCameraComponent::Camera(生の UCameraAsset ポインター) | CameraReference(FCameraAssetReference) | GameplayCameras/Public/GameFramework/GameplayCameraComponent.h:71 の Camera_DEPRECATED |
「現在」を意味する USimpleBlendCameraNode::SetBlendTime | SetDefaultBlendTime | GameplayCameras/Public/Nodes/Blends/SimpleBlendCameraNode.h:29 の UE_DEPRECATED(5.7) |
UCineCameraComponent::FilmbackSettings | Filmback | CinematicCamera/Public/CineCameraComponent.h:34 の FilmbackSettings_DEPRECATED |
ポーンに独自のバージョンがあるかのように APawn::CalcCamera を呼び出すこと | 継承した AActor::CalcCamera 仮想関数(ポーンサブクラスでは通常どおりオーバーライドします)、またはカメラコンポーネント | 5.8 の APawn には CalcCamera が宣言されていません |
よくある間違い
ブームとカメラの両方でbUsePawnControlRotationを設定する: 制御回転が二重に適用されるため、マウスで視点を動かすとカメラが逆方向に回転します。三人称ではスプリングアームに、一人称ではカメラに設定し、両方には設定しないでください。
カスタムオーバーライドでSuper::CalcCameraを呼び出す: bFindCameraComponentWhenViewTargetがtrueの場合、基底クラスのAActor::CalcCameraは最初に有効なカメラコンポーネントのビューを返すため(Actor.cpp:3690-3702)、独自のPOVが上書きされます。Superを呼び出さないか、このフラグをクリアしてください。
Super::を呼び出さずにUpdateViewTargetをオーバーライドする: 基底クラスは、ターゲットのカメラコンポーネントまたはCalcCameraからOutVT.POVを設定します。これを省略すると、ワールド原点のゼロ初期化されたPOVになります。
ModifyCameraを誤って実装する: BlueprintにつなぐFVector/FRotatorオーバーロードではなく、virtual bool ModifyCamera(float DeltaTime, struct FMinimalViewInfo& InOutPOV)をオーバーライドし、falseを返してください。trueは「自分が最後のモディファイアである」という意味になり、シェイクモディファイアを含む、優先度が低いすべてのモディファイアを暗黙に無効化します。
サーバーでStartCameraShakeを呼び出す: サーバーは独自のカメラマネージャーを持つため、誰も見ていない場所でシェイクが再生されます。サーバーからクライアントRPCのClientStartCameraShakeを使うか、レンダリングを行うマシンでUGameplayStatics::PlayWorldCameraShakeを使ってください。
Build.csのモジュールを忘れる: UPerlinNoiseCameraShakePatternとULegacyCameraShakeには"EngineCameras"、UCineCameraComponentには"CinematicCamera"、UE::Cameras以下のすべてには"GameplayCameras"が必要です。モジュールが不足すると、コンパイルエラーではなくリンクエラーが発生します。
RTTIマクロを使わずにカメラノードエバリュエーターを作成する: クラス本体内のUE_DECLARE_CAMERA_NODE_EVALUATORと、ファイルスコープのUE_DEFINE_CAMERA_NODE_EVALUATORの両方が必要です。これらがないと、エバリュエーターは基底クラスの型IDを報告するため、エバリュエーターのキャストと型の検索が実行時に失敗します。
何もオーバーライドせずにUCameraShakeBaseをサブクラス化する: 基底クラスには独自の動きがありません。RootShakePatternを設定するか(コンストラクター内のChangeRootShakePattern<T>()経由、またはアセット内で設定)、UDefaultCameraShakeBaseをサブクラス化してください。
Gameplay Camera Systemを確定済みAPIとして扱う: このプラグインは5.8ではExperimentalです。エンジンのアップグレードに対応する必要がある場合は、独自のラッパーコンポーネントの背後に隔離してください。
関連スキル
ue-gameplay-framework—APlayerController、APawn、ポゼッション、ビューポートのターゲットオーナーue-actor-component-architecture— コンポーネントのアタッチ、ソケット、ティック順序、CreateDefaultSubobjectue-input-system— 制御回転とカメラ入力ノードに値を渡すEnhanced Inputのアクションと軸ue-sequencer-cinematics— Level Sequence、カメラカット、スポーン可能なカメラ、テイクの記録ue-character-movement—bOrientRotationToMovement、RotationRate、しゃがみ、目の高さの変化ue-ui-umg-slate— カメラの前面に配置されるビューポート座標系のUI、照準器、レターボックスue-state-trees— State Treeと、UStateTreeCameraDirectorの背後にあるスキーマ