mcpField
U
ue-gameplay-cameras

ue-gameplay-cameras

github.com/quodsoler開発419247 回インストール4 週間前に更新
リポジトリ

ue-gameplay-cameras について

ue-gameplay-cameras は、Unreal Engine 5.8 のカメラ開発を支援するリファレンススキルです。従来のカメラスタックと実験段階の Gameplay Camera System を扱い、実装やデバッグのための API 情報と例を提供します。

主な機能

  1. 012 種類のカメラシステムを比較
  2. 02一人称・三人称カメラの設定
  3. 03ビューターゲットの切り替えとブレンド
  4. 04Camera Manager と Modifier のカスタマイズ
  5. 05シェイク、シネマカメラ、デバッグの解説

活用シーン

  1. 01Unreal Engine 5.8 でキャラクターカメラを設定
  2. 02カメラターゲットの変更とブレンドを実装
  3. 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 のサブクラスなので、プラグインが評価を実行している間も、従来のビューターゲット、フェード、モディファイアを使用できます。

クラシックなパイプラインの実行方法

  1. APlayerController は PlayerCameraManager を保持します(TSubclassOf<APlayerCameraManager> PlayerCameraManagerClass から virtual void SpawnPlayerCameraManager() によって生成されます)。
  2. APlayerCameraManager::UpdateCamera(float DeltaTime) → DoUpdateCamera(float DeltaTime) → UpdateViewTarget(FTViewTarget& OutVT, float DeltaTime)。
  3. UpdateViewTarget は OutVT.POV(FMinimalViewInfo)に値を設定します。ターゲットが ACameraActor の場合はそのカメラコンポーネントを直接使用し、それ以外のターゲットでは Target->CalcCamera(PlayerCameraManager.cpp:354)を呼び出します。基底の AActor 実装は、bFindCameraComponentWhenViewTarget が true の場合は最初のアクティブなカメラコンポーネントを使用し、そうでない場合はアクターの目の視点を使用します(Actor.cpp:3688-3706)。
  4. ApplyCameraModifiers(float DeltaTime, FMinimalViewInfo& InOutPOV) は、ModifierList 内のすべての UCameraModifier を Priority の順に実行します(0 が最高)。
  5. 結果はキャッシュされます。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" / UMatineeCameraShakeULegacyCameraShakeEngineCameras/Public/Shakes/MatineeCameraShake.h:9 の UE_DEPRECATED_HEADER(5.5)
UCameraAnim、UCameraAnimInst、PlayCameraAnimUCameraAnimationSequence + UEngineCamerasSubsystem::PlayCameraAnimation5.8 のヘッダーには UCameraAnim クラスが存在しません
FCameraRigParameterOverrides と F*CameraRigParameterOverride 構造体FCameraRigAssetReference の FInstancedPropertyBag パラメーターオーバーライドGameplayCameras/Public/Core/CameraRigAssetReference.h:26-43 の UE_DEPRECATED(5.7)
UCameraRigProxyTableFCameraRigProxyRedirectTableGameplayCameras/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::SetBlendTimeSetDefaultBlendTimeGameplayCameras/Public/Nodes/Blends/SimpleBlendCameraNode.h:29 の UE_DEPRECATED(5.7)
UCineCameraComponent::FilmbackSettingsFilmbackCinematicCamera/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 — コンポーネントのアタッチ、ソケット、ティック順序、CreateDefaultSubobject
  • ue-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の背後にあるスキーマ

コメント