이 하우투 튜토리얼에서는 스태틱 카메라 사용하기 가이드에서 생성한 로직을 확장하여 레벨에 오버랩 볼륨(Overlap Volumes) 과 카메라 액터(Camera Actors) 를 추가로 생성한 다음, 각 볼륨을 통한 카메라 뷰 간 플레이어 캐릭터 트랜지션을 보여줍니다.
오버랩 볼륨 로직 변경하기
새 카메라 트랜지션 함수 기능을 수용하려면 이전 오버랩 볼륨 로직을 약간 조정해야 합니다.
-
콘텐츠 브라우저에서 BP_BlendTriggerVolume 을 더블클릭하여 클래스 디폴트(Class Defaults) 를 엽니다.
이미지를 클릭하면 확대됩니다.
-
내 블루프린트(My Blueprint) 탭에서 변수(Variables) 카테고리로 이동한 다음 + 기호를 눌러 새 변수를 생성합니다. 변수의 이름을 CameraToFind 로 짓고 타입을 CameraActor 로 설정한 다음 컴파일(Compile) 을 클릭합니다.
-
CameraToFind 변수 옆의 눈 아이콘을 클릭하여 비저빌리티를 퍼블릭으로 변경합니다. 그러면 각 블루프린트 인스턴스에서 이 변수를 편집할 수 있습니다.
-
이벤트 그래프(Event Graph) 로 이동한 다음 On Overlap Begin 이벤트 로직에서 Get Actor Of Class 노드를 삭제합니다.
이미지를 클릭하면 확대됩니다.
-
내 블루프린트(My Blueprint) 탭에서 CameraToFind 변수를 클릭하여 이벤트 그래프(Event Graph) 위로 드래그합니다.
이미지를 클릭하면 확대됩니다.
-
출력 핀 을 Set View Target with Blend 노드의 New View Target 입력 핀에 연결합니다. 그런 다음 Branch 노드의 True 실행 핀에서 드래그하여 Set View Target with Blend 노드에 연결합니다.
이미지를 클릭하면 확대됩니다.
-
컴파일하고 저장합니다.
완성된 블루프린트
이미지를 클릭하면 확대됩니다.
-
콘텐츠 브라우저에서 C++ 클래스 폴더로 이동한 다음
BlendTriggerVolume.h클래스 디폴트를 엽니다.
-
클래스 디폴트에서 기존 TSubClassOfAActor 선언을 삭제하고 다음으로 대체합니다.
protected:
UPROPERTY(EditAnywhere, BlueprintReadWrite) ACameraActor* CameraToFind;
-
그런 다음
BlendTriggerVolume.cpp파일로 이동하여 생성자 ABlendTriggerVolume::ABlendTriggerVolume 에 다음을 선언합니다.// 디폴트값 설정 ABlendTriggerVolume::ABlendTriggerVolume() { // 이 액터가 프레임마다 Tick()을 호출하도록 설정합니다. 이 설정이 필요 없는 경우 비활성화하면 퍼포먼스가 향상됩니다. PrimaryActorTick.bCanEverTick = true;
OverlapVolume = CreateDefaultSubobject
(TEXT("CameraProximityVolume")); OverlapVolume->SetupAttachment(RootComponent); CameraToFind = CreateDefaultSubobject
(TEXT("CameraToFind")); } -
ABlendTriggerVolume::NotifyActorBeginOverlap 메서드에서 다음 코드 줄을 제거합니다.
//발견된 카메라 액터를 포함하는 배열 TArray
FoundActors; //레벨 내 모든 카메라 액터로 배열을 채우는 유틸리티 함수 UGameplayStatics::GetAllActorsOfClass(GetWorld(), CameraToFind, FoundActors);
//플레이어 컨트롤러 뷰를 처음 발견된 카메라 액터로 설정
PlayerCharacterController->SetViewTargetWithBlend(FoundActors[0], CameraBlendTime, EViewTargetBlendFunction::VTBlend_Linear);
제거된 코드를 다음으로 대체합니다.
//플레이어 컨트롤러 뷰를 CameraActorToFind 변수로 설정 PlayerCharacterController->SetViewTargetWithBlend(CameraToFind, CameraBlendTime, EViewTargetBlendFunction::VTBlend_Linear); } } }
위 선언에서는 플레이어 캐릭터가 볼륨과 겹쳐질 때 클래스 생성자에서 초기화된 카메라 액터(Camera Actor) 변수로 트랜지션하도록 로직을 대체했습니다.
완성된 코드
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
CameraToFind = CreateDefaultSubobject
// 게임 시작 또는 스폰 시 호출 void ABlendTriggerVolume::BeginPlay() { Super::BeginPlay(); }
void ABlendTriggerVolume::NotifyActorBeginOverlap(AActor OtherActor)
{
if (AStaticCamerasCharacter PlayerCharacterCheck = Cast
void ABlendTriggerVolume::NotifyActorEndOverlap(AActor OtherActor)
{
if (AStaticCamerasCharacter PlayerCharacterCheck = Cast
// 프레임마다 호출 void ABlendTriggerVolume::Tick(float DeltaTime) { Super::Tick(DeltaTime);
}
레벨 구성
새로 구현한 로직을 시연하려면 추가 룸과 카메라 및 오버랩 볼륨을 레벨에 설정해야 합니다.
-
이전에 스태틱 카메라 사용하기 하우투 가이드에서 생성한 맵을 사용하여 추가 룸을 생성합니다.
이미지를 클릭하면 확대됩니다. 3인칭 예시 맵을 복제한 다음 수정하여 두 개의 추가 룸을 생성했습니다.
-
월드 아웃라이너(World Outliner)에서 BP_BlendTriggerVolume 액터를 선택한 다음, 디테일(Details) 패널에서 디폴트(Defaults) 카테고리로 이동합니다. 찾을 카메라(Camera To Find) 변수 옆에 있는 드롭다운 메뉴 를 엽니다.
BP_ExampleCameraActor 를 선택합니다.
-
콘텐츠 브라우저(Content Browser)에서 BP_CameraActor의 인스턴스(BP_CameraActor2)를 월드로 드래그한 다음, 새로 생성한 룸 내의 원하는 뷰포인트로 트랜스폼 좌표를 조정합니다.
이미지를 클릭하면 확대됩니다. BP_CameraActor2가 룸의 구석에 파일럿됩니다.
-
콘텐츠 브라우저 에서 다른 BP_BlendTriggerVolume 액터의 인스턴스(BP_BlendTriggerVolume2 )를 월드로 드래그한 다음, 디테일 패널에서 박스 크기(Box Extent) X, Y 및 Z 값을 새로 추가한 룸의 크기에 맞게 변경합니다.
이미지를 클릭하면 확대됩니다.
-
디테일(Details) 패널의 디폴트(Defaults) 카테고리로 이동하여 찾을 카메라(Camera To Find) 변수 옆에 있는 드롭다운 메뉴를 엽니다.
BP_ExampleCameraActor2 를 선택합니다.
-
툴바로 돌아가서 재생(Play)(PIE) 버튼을 클릭합니다.
최종 결과
게임을 시작하면 플레이어는 WASD를 사용하여 캐릭터의 무브먼트를 제어합니다. 레벨에서 여러 BP_BlendTriggerVolumes 오버랩 시, 카메라 뷰가 앞서 생성하여 레벨에 배치한 BP_CameraActors로 트랜지션됩니다.
