このチュートリアルでは、レベルに オーバーラップ ボリューム と カメラ アクタ を作成するために「静的カメラを使用する」ガイドで作成したロジックを拡張し、プレイヤー キャラクターを各ボリュームにナビゲートさせてカメラ ビューの切り替えを行います。
オーバーラップ ボリュームを変更する
新しいカメラ トランジション機能に対応するために、以前の オーバーラップ ボリューム ロジックを少し調整する必要があります。
-
コンテンツ ブラウザで BP_BlendTriggerVolume をダブルクリックして Class Defaults を開きます。
-
[My Blueprint] タブの Variables カテゴリで + 記号をクリックして新しい変数を作成します。新しく作成した変数に「CameraToFind」と名前を付けて CameraActor に指定して [Compile (コンパイル)] をクリックします。
-
CameraToFind 変数の横にある 目 のアイコンをクリックして、可視性をパブリックにします。こうすることでブループリントの各インスタンスに対してこの変数を編集できるようになります。
-
イベント グラフ に移動し、On Overlap Begin イベント ロジックから Get Actor Of Class ノードを削除します。
-
[My Blueprint] タブから CameraToFind 変数のコピーをクリックして イベント グラフ にドラッグします。
-
出力ピン を Set View Target with Blend ノードの新しいビュー ターゲットの入力ピンに接続します。If Branch ノードの True 実行ピンを引き出して Set View Target with Blend ノードに接続します。
-
コンパイルして保存します。
完成したブループリント
-
コンテンツ ブラウザで、「C++ Classes」フォルダに移動し、
BlendTriggerVolume.h
クラス デフォルトを開きます。 -
クラス デフォルトで、既存の TSubClassOfAActor 宣言を削除し以下で置き換えます。
protected: UPROPERTY(EditAnywhere, BlueprintReadWrite) ACameraActor* CameraToFind;
-
次に、「
BlendTriggerVolume.cpp
」ファイルに移動し、コンストラクタ「ABlendTriggerVolume::ABlendTriggerVolume」で以下を宣言します。// デフォルト値を設定します。 ABlendTriggerVolume::ABlendTriggerVolume() { // 各フレームでこのアクタが Tick() を呼び出すよう設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。 PrimaryActorTick.bCanEverTick = true; OverlapVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("CameraProximityVolume")); OverlapVolume->SetupAttachment(RootComponent); CameraToFind = CreateDefaultSubobject<ACameraActor>(TEXT("CameraToFind")); }
-
ABlendTriggerVolume::NotifyActorBeginOverlap メソッドで、コードの次の行を削除します。
//見つかったカメラ アクタを含む配列 TArray<AActor*> FoundActors; //レベル内のすべてのカメラ アクタを配列に含めるためのユーティリティ関数 UGameplayStatics::GetAllActorsOfClass(GetWorld(), CameraToFind, FoundActors); //見つかった最初の CameraActor にプレイヤー コントローラーのビューを設定します PlayerCharacterController->SetViewTargetWithBlend(FoundActors[0], CameraBlendTime, EViewTargetBlendFunction::VTBlend_Linear);
削除したコードを以下で置き換えます。
//プレイヤー コントローラーのビューを CameraActorToFind 変数に設定します。 PlayerCharacterController->SetViewTargetWithBlend(CameraToFind, CameraBlendTime, EViewTargetBlendFunction::VTBlend_Linear); } } }
上記の宣言では、プレイヤー キャラクターがボリュームと重なると、クラスのコンストラクタでインスタンス化された カメラアクタ 変数にトランジションするようにロジックを置き換えました。
完成コード
BlendTriggerVolume.h
//Copyright 1998-2021 Epic Games, Inc. All Rights Reserved.
pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "BlendTriggerVolume.generated.h"
UCLASS()
class STATICCAMERAS_API ABlendTriggerVolume : public AActor
{
GENERATED_BODY()
public:
// このアクタのプロパティのデフォルト値を設定します。
ABlendTriggerVolume();
protected:
// ゲームの開始時またはスポーン時に呼び出します。
virtual void BeginPlay() override;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
class UBoxComponent* OverlapVolume;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
ACameraActor* CameraToFind;
UPROPERTY(EditDefaultsOnly, meta =(ClampMin = 0.0f))
float CameraBlendTime;
virtual void NotifyActorBeginOverlap(AActor* OtherActor);
virtual void NotifyActorEndOverlap(AActor* OtherActor);
public:
// フレームごとに呼び出します。
virtual void Tick(float DeltaTime) override;
};
BlendTriggerVolume.cpp
//Copyright 1998-2021 Epic Games, Inc. All Rights Reserved.
#include "BlendTriggerVolume.h"
#include "Components/BoxComponent.h"
#include "StaticCamerasCharacter.h"
#include "Camera/CameraActor.h"
#include "Runtime/Engine/Classes/Kismet/GameplayStatics.h"
// デフォルト値を設定します。
ABlendTriggerVolume::ABlendTriggerVolume()
{
// 各フレームでこのアクタが Tick() を呼び出すよう設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。
PrimaryActorTick.bCanEverTick = true;
OverlapVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("CameraProximityVolume"));
OverlapVolume->SetupAttachment(RootComponent);
CameraToFind = CreateDefaultSubobject<ACameraActor>(TEXT("CameraToFind"));
}
// ゲームの開始時またはスポーン時に呼び出します。
void ABlendTriggerVolume::BeginPlay()
{
Super::BeginPlay();
}
void ABlendTriggerVolume::NotifyActorBeginOverlap(AActor* OtherActor)
{
if (AStaticCamerasCharacter* PlayerCharacterCheck = Cast<AStaticCamerasCharacter>(OtherActor))
{
if (APlayerController* PlayerCharacterController = Cast<APlayerController>(PlayerCharacterCheck->GetController()))
{
PlayerCharacterController->SetViewTargetWithBlend(CameraToFind, CameraBlendTime, EViewTargetBlendFunction::VTBlend_Linear);
}
}
}
void ABlendTriggerVolume::NotifyActorEndOverlap(AActor* OtherActor)
{
if (AStaticCamerasCharacter* PlayerCharacterCheck = Cast<AStaticCamerasCharacter>(OtherActor))
{
if (APlayerController* PlayerCharacterController = Cast<APlayerController>(PlayerCharacterCheck->GetController()))
{
PlayerCharacterController->SetViewTargetWithBlend(PlayerCharacterController->GetPawn(), CameraBlendTime, EViewTargetBlendFunction::VTBlend_Linear);
}
}
}
// フレームごとに呼び出します。
void ABlendTriggerVolume::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
レベル設定
新しく実装されたロジックを示すには、レベルに追加の部屋、カメラ、オーバーラップ ボリュームを設定する必要があります。
-
「静的カメラを使用する」操作ガイドで既に作成したマップを使って、追加の部屋を作成します。
-
ワールド アウトライナーで、BP_BlendTriggerVolume を選択し、 [Details (詳細)] パネルで、[Defaults] カテゴリに移動します。Camera To Find 変数の隣にある ドロップダウン メニュー を開きます。
BP_ExampleCameraActor を選択します。
-
コンテンツ ブラウザから BP_CameraActor (BP_CameraActor2) のインスタンスをワールドへドラッグして、トランスフォーム座標を新しく作成した部屋の中の好きな視点に合わせます。
-
コンテンツ ブラウザ から BP_BlendTriggerVolume アクタのもう 1 つのインスタンスをワールドへ (BP_BlendTriggerVolume2) ドラッグし、[Details] パネルへ移動して Box Extent の X、Y、Z の値を新しく追加した部屋のサイズに合うように変更します。
-
[Details] パネルの [Defaults] カテゴリで Camera To Find 変数の隣にあるドロップダウン メニューを開きます。
BP_ExampleCameraActor2 を選択します。
-
ツールバーに戻って [Play(PIE)] ボタンをクリックします。
最終結果
ゲームが開始すると、プレイヤーは WASD を使ってキャラクターの移動を制御します。レベルで複数の BP_BlendTriggerVolumes がオーバーラップすると、カメラ ビューは作成および配置した BP_CameraActors へトランジションします。