이 튜토리얼에서는 캐릭터 클래스에 카메라 컴포넌트를 추가합니다. 카메라는 레벨을 볼 수 있고, 플레이 가능한 캐릭터와 플레이할 수 없는 액터를 포함하여 레벨의 모든 액터에 어태치할 수 있는 시야 전환 기능을 제공합니다.
캐릭터 블루프린트 생성
-
먼저 신규(New) > 게임(Games) > 기본(Blank) > 블루프린트(Blueprint) 프로젝트를 생성하고 이름은 CameraComponents 로 짓습니다.
-
콘텐츠 브라우저(Content Browser) 에서 추가/임포트(Add/Import) 버튼을 클릭하여 새 캐릭터(Character) 블루프린트 클래스를 생성하고 이름을 BP_CameraCharacter 로 변경합니다.
-
콘텐츠 브라우저(Content Browser) 에서 BP_CameraCharacter 를 더블클릭하여 클래스 디폴트(Class Defaults) 를 엽니다.
-
메시(Mesh) 스켈레탈 메시 컴포넌트를 선택한 다음 컴포넌트(Components) 탭에서 컴포넌트 추가(Add Component) 를 클릭하고, 드롭다운 메뉴에서 화살표(Arrow) 를 선택한 다음 이름을 CameraRShoulderLocation 으로 변경합니다.
화살표 컴포넌트(Arrow Component) 는 씬 컴포넌트(Scene Component) 이며, 선이 있는 단순한 화살표를 렌더링하여 가리키는 방향을 나타냅니다. 자세한 정보는 유틸리티 컴포넌트 문서를 참고하세요.
-
CameraRShoulderLocation 화살표 컴포넌트를 선택하고 디테일(Details) 패널에서 트랜스폼(Transform) 카테고리로 이동하여 위치(Location) 를 (-30, 0, 150 )으로, 회전(Rotation) 을 (0, 0, 90 )으로 설정합니다.
-
메시(Mesh) 스켈레탈 메시 컴포넌트를 선택한 다음 컴포넌트 탭(Components tab) 에서 컴포넌트 추가(Add Component) 를 클릭합니다. 드롭다운 메뉴에서 화살표(Arrow) 를 선택하고 이름을 CameraOriginLocation 으로 변경합니다.
-
컴포넌트 탭에서 CameraOriginLocation 화살표 컴포넌트를 선택한 다음 디테일(Details) 패널의 트랜스폼(Transform) 카테고리로 이동하여 위치를 (0, -120, 150 )으로, 회전을 (0, 0, 90 )으로 설정합니다.
CameraOriginLocation 및 CameraRShoulderLocation 이 스켈레탈 메시 컴포넌트(Skeletal Mesh Component) 에 어태치되어 카메라 컴포넌트가 뷰포인트 위치를 전환하는 곳을 시각적으로 표현합니다.
-
컴포넌트(Components) 탭에서 메시(Mesh) 컴포넌트를 선택하고 디테일(Details) 패널로 이동합니다. 메시 카테고리에서 스켈레탈 메시를 선택하고 드롭다운 메뉴에서 TutorialTPP 를 검색하여 선택합니다.
드롭다운 메뉴에 옵션이 보이지 않는다면 뷰 옵션(View Options) 을 클릭하고 엔진 콘텐츠 표시(Show Engine Content) 박스를 체크합니다.
-
디테일(Details) 패널에서 트랜스폼(Transform) 카테고리로 이동하여 메시의 위치(Location) 를 (0, 0, -90 )으로, 회전(Rotation) 을 (0, 0, -90 )으로 설정합니다.
-
다음으로 컴포넌트(Components) 탭에서 컴포넌트 추가(Add Component) 버튼을 클릭하고 카메라(Camera) 컴포넌트를 추가한 다음 컴포넌트 이름을 CameraComp 로 변경합니다.
-
디테일(Details) 패널에서 카메라의 위치(Location) 값을 (0, -120, 150 )으로 설정합니다.
-
컴파일(Compile) 하고 저장(Save) 합니다.
캐릭터 클래스 생성하기
-
먼저 신규(New) > 게임(Games) > 기본(Blank) > C++ 프로젝트를 생성하고, 프로젝트 이름은 CameraComponents 로 짓습니다.
-
C++ 클래스 마법사(C++ Class Wizard) 에서 CameraCharacter 라는 이름의 새 캐릭터(Character) 클래스를 생성한 다음,
CameraCharacter.h파일로 이동하여 아래의 클래스 정의를 선언합니다.protected: // 카메라 숄더 뷰포인트 위치에 대한 화살표 컴포넌트 UPROPERTY(EditDefaultsOnly, BlueprintReadWrite) class UArrowComponent* CameraRShoulderLocation; // 카메라 원점 뷰포인트 위치에 대한 화살표 컴포넌트 UPROPERTY(EditDefaultsOnly, BlueprintReadWrite) class UArrowComponent* CameraOriginLocation; UPROPERTY(EditDefaultsOnly, BlueprintReadWrite) class UCameraComponent* CameraComp; -
CameraCharacter.cpp파일로 이동하여 아래의 클래스 라이브러리를 추가합니다.#include "Camera/CameraComponent.h" #include "Components/ArrowComponent.h" -
ACameraCharacter::ACameraCharacter 생성자 메서드에서 화살표 및 카메라 컴포넌트를 인스턴스화하고 캐릭터의 스켈레탈 메시에 어태치하기 위해 다음을 선언합니다.
// 클래스 컴포넌트 인스턴스화 CameraRShoulderLocation = CreateDefaultSubobject<UArrowComponent>(TEXT("CameraRShoulderLocation")); CameraOriginLocation = CreateDefaultSubobject<UArrowComponent>(TEXT("CameraOriginLocation")); CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComp")); // 클래스 컴포넌트를 디폴트 캐릭터의 스켈레탈 메시 컴포넌트에 어태치합니다. CameraRShoulderLocation->SetupAttachment(GetMesh()); CameraOriginLocation->SetupAttachment(GetMesh()); CameraComp->SetupAttachment(GetMesh());UProperty 지정자는 블루프린트의 클래스 컴포넌트 및 프로퍼티를 수정하는 기능을 제공합니다.
- 코드를 컴파일(Compile) 합니다.
-
콘텐츠 브라우저(Content Browser) 에서 C++ 클래스(C++ Classes) 폴더로 이동합니다. CameraCharacter 클래스를 우클릭하고 드롭다운 메뉴에서 CameraCharacter 기반 블루프린트 클래스 생성(Create Blueprint class based on CameraCharacter) 을 선택한 다음 블루프린트를 BP_CameraCharacter 로 명명합니다.
-
BP_CameraCharacter 를 더블클릭하여 클래스 디폴트를 엽니다.
-
컴포넌트 탭에서 메시 컴포넌트를 선택하고 디테일(Details) 패널로 이동합니다. 메시 카테고리에서 스켈레탈 메시를 선택하고 드롭다운 메뉴에서 TutorialTPP 를 검색하여 선택합니다.
드롭다운 메뉴에 옵션이 보이지 않는다면 뷰 옵션(View Options) 을 클릭하고 엔진 콘텐츠 표시(Show Engine Content) 박스를 체크합니다.
-
디테일(Details) 패널에서 트랜스폼(Transform) 카테고리로 이동하여 메시의 위치(Location) 를 (0, 0, -90 )으로, 회전(Rotation) 을 (0, 0, -90 )으로 설정합니다.
-
CameraRShoulderLocation 화살표 컴포넌트를 선택하고 디테일(Details) 패널에서 트랜스폼(Transform) 카테고리로 이동하여 위치(Location) 를 (-30, 0, 150 )으로, 회전(Rotation) 을 (0, 0, 90 )으로 설정합니다.
-
컴포넌트 탭에서 CameraOriginLocation 화살표 컴포넌트를 선택한 다음 디테일(Details) 패널의 트랜스폼(Transform) 카테고리로 이동하여 위치를 (0, -120, 150 )으로, 회전을 (0, 0, 90 )으로 설정합니다.
CameraOriginLocation 및 CameraRShoulderLocation 이 스켈레탈 메시 컴포넌트(Skeletal Mesh Component) 에 어태치되어 카메라 컴포넌트가 뷰포인트 위치를 전환하는 곳을 시각적으로 표현합니다.
-
컴포넌트 탭에서 CameraComp 를 선택한 다음 디테일 패널의 트랜스폼(Transform) 카테고리로 이동하여 위치를 (0, -120, 150 )으로, 회전을 (0, 0, 90 )으로 설정합니다.
-
컴파일(Compile) 하고 저장(Save) 합니다.
-
컴포넌트가 아래 뷰포트와 같이 나타날 것입니다.
미완성된 블루프린트
이 예시에서는 카메라가 캐릭터의 스켈레탈 메시 컴포넌트에 어태치되어 삼인칭 시점을 제공하지만, 카메라 컴포넌트는 어떤 카메라 시점을 선택하든 모든 블루프린트 액터 클래스에 추가될 수 있습니다.
미완성된 코드
CameraCharacter.h
// 프로젝트 세팅의 설명 페이지에 저작권 통지를 채워 넣으세요.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "CameraCharacter.generated.h"
UCLASS()
class CAMERACOMPONENTS_API ACameraCharacter : public ACharacter
{
GENERATED_BODY()
public:
// 이 캐릭터의 프로퍼티에 적용되는 디폴트값 설정
ACameraCharacter();
protected:
// 게임 시작 또는 스폰 시 호출
virtual void BeginPlay() override;
public:
// 프레임마다 호출
virtual void Tick(float DeltaTime) override;
// 함수 기능을 입력에 바인딩하기 위해 호출
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
protected:
// 카메라 숄더 뷰포인트 위치에 대한 화살표 컴포넌트
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
class UArrowComponent* CameraRShoulderLocation;
// 카메라 원점 뷰포인트 위치에 대한 화살표 컴포넌트
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
class UArrowComponent* CameraOriginLocation;
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
class UCameraComponent* CameraComp;
};
CameraCharacter.cpp
// 프로젝트 세팅의 설명 페이지에 저작권 통지를 채워 넣으세요.
#include "CameraCharacter.h"
#include "Camera/CameraComponent.h"
#include "Components/ArrowComponent.h"
// 디폴트값 설정
ACameraCharacter::ACameraCharacter()
{
// 이 캐릭터가 프레임마다 Tick()을 호출하도록 설정합니다. 이 설정이 필요 없는 경우 비활성화하면 퍼포먼스가 향상됩니다.
PrimaryActorTick.bCanEverTick = true;
// 클래스 컴포넌트 인스턴스화
CameraRShoulderLocation = CreateDefaultSubobject<UArrowComponent>(TEXT("CameraRShoulderLocation"));
CameraOriginLocation = CreateDefaultSubobject<UArrowComponent>(TEXT("CameraOriginLocation"));
CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComp"));
// 클래스 컴포넌트를 디폴트 캐릭터의 스켈레탈 메시 컴포넌트에 어태치합니다.
CameraRShoulderLocation->SetupAttachment(GetMesh());
CameraOriginLocation->SetupAttachment(GetMesh());
CameraComp->SetupAttachment(GetMesh());
}
// 게임 시작 또는 스폰 시 호출
void ACameraCharacter::BeginPlay()
{
Super::BeginPlay();
}
// 프레임마다 호출
void ACameraCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
// 함수 기능을 입력에 바인딩하기 위해 호출
void ACameraCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
}
입력 키 이벤트 생성 및 바인딩
캐릭터 블루프린트 클래스가 생성되면, 두 화살표 컴포넌트 위치 간의 카메라 컴포넌트 상대 위치를 트랜지션하기 위해 스크립팅된 로직을 구성해야 합니다.
-
BP_CameraCharacter의 클래스 디폴트에서 이벤트 그래프(Event Graph) 탭을 클릭하고 그래프에서 우클릭 합니다. 드롭다운 메뉴에서 마우스 오른쪽 버튼(Right Mouse Button) 을 선택하여 입력 마우스 이벤트를 추가합니다.
이벤트 그래프는 카메라를 움직일 스크립팅된 로직이 발생하는 곳입니다.
-
내 블루프린트(My Blueprint) 패널의 변수 카테고리에서 CameraComp 를 Ctrl+클릭 한 채 이벤트 그래프로 드래그합니다.
CameraComp 변수의 사본을 생성하면 클래스 메서드를 통해 프로퍼티를 설정하거나 카메라 컴포넌트에 영향을 미칠 수 있습니다.
-
내 블루프린트(My Blueprint) 탭의 변수 카테고리로 다시 이동하여 CameraOriginLocation 및 CameraRShoulderLocation 화살표 컴포넌트를 Ctrl+클릭 한 채 이벤트 그래프로 드래그합니다.
-
이벤트 그래프에서 CameraComp 출력 핀을 클릭하고 드래그한 다음 드롭다운 메뉴에서 Set Relative Location 을 검색하고 선택합니다.
SetRelativeLocation 함수 메서드를 사용하면 카메라 컴포넌트를 선택한 위치로 옮길 수 있습니다.
-
CameraRShoulderLocation 노드 출력 핀을 클릭하고 드래그한 다음 Get Relative Location 을 검색하고 선택합니다.
-
상대적 위치(Relative Location) 노드의 출력 핀을 New Location 핀에 연결하고, 오른쪽 마우스 버튼(Right Mouse Button) 이벤트 노드의 Pressed 실행 핀을 상대적 위치 설정(Set Relative Location) 노드의 입력 실행 핀에 연결합니다.
마우스 오른쪽 버튼 이 눌리면 카메라의 상대적 위치가 화살표 컴포넌트 CameraRShoulderLocation 의 위치로 설정됩니다.
-
Camera Comp 핀을 클릭하여 드래그한 다음 드롭다운 메뉴에서 Set Relative Location 을 선택합니다.
-
CameraOriginLocation 노드 출력 핀을 클릭하여 드래그한 다음 드롭다운 메뉴에서 Get Relative Location 을 선택합니다.
-
CameraOriginLocation 의 상대적 위치(Relative Location) 노드 출력 핀을 New Location 핀에 연결하고 오른쪽 마우스 버튼(Right Mouse Button) 이벤트 노드의 Released 실행 핀을 상대적 위치 설정(Set Relative Location) 노드의 입력 실행 핀에 연결합니다.
-
컴파일(Compile) 하고 저장(Save) 합니다.
이제 이벤트 그래프는 아래 이미지와 같은 모습일 것입니다.
입력 키 이벤트 함수 생성 및 바인딩
캐릭터 블루프린트 클래스가 생성되면, 두 화살표 컴포넌트 위치 간의 카메라 컴포넌트 상대 위치를 트랜지션하기 위해 스크립팅된 로직을 구성해야 합니다.
-
레벨 에디터의 툴바에서 편집(Edit) > 프로젝트 세팅(Project Settings) 으로 이동한 다음 입력(Input) 페이지를 엽니다. 그런 다음 바인딩(Bindings) 카테고리에서 액션 매핑(Action Mappings) 옆에 있는 +** 아이콘을 클릭하여 새 입력 매핑을 생성합니다.
-
액션 매핑을 SwitchCamera 로 명명하고 드롭다운 메뉴에서 오른쪽 마우스 버튼(Right Mouse Button) 키 값을 선택합니다.
-
CameraCharacter.h파일로 이동하여 다음 클래스 정의를 선언합니다.protected: // CameraComp의 상대적 위치를 CameraRShoulderLocation 화살표 컴포넌트로 설정합니다. void SetCameraShoulderLocation(); // CameraComp의 상대적 위치를 CameraOriginLocation 화살표 컴포넌트로 설정합니다. void SetCameraOriginLocation(); -
CameraCharacter.cpp파일에서 다음 클래스 메서드를 구현합니다.void ACameraCharacter::SetCameraShoulderLocation() { CameraComp->SetRelativeLocation(CameraRShoulderLocation->GetRelativeLocation()); } void ACameraCharacter::SetCameraOriginLocation() { CameraComp->SetRelativeLocation(CameraOriginLocation->GetRelativeLocation()); } -
그런 다음, ACameraCharacter::SetupPlayerInputComponent 메서드로 이동하여 아래의 코드를 구현합니다.
//함수 기능을 입력에 바인딩하기 위해 호출 void ACameraCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); PlayerInputComponent->BindAction("SwitchCamera", IE_Pressed, this, &ACameraCharacter::SetCameraShoulderLocation); PlayerInputComponent->BindAction("SwitchCamera", IE_Released, this, &ACameraCharacter::SetCameraOriginLocation); }플레이어 컨트롤러와 폰 액터 빙의에 대해 자세히 알아보려면 폰을 참고하세요.
-
코드를 컴파일(Compile) 합니다.
완성된 블루프린트

완성된 코드
CameraCharacter.h
// 프로젝트 세팅의 설명 페이지에 저작권 통지를 채워 넣으세요.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "CameraCharacter.generated.h"
UCLASS()
class CAMERACOMPONENTS_API ACameraCharacter : public ACharacter
{
GENERATED_BODY()
public:
// 이 캐릭터의 프로퍼티에 적용되는 디폴트값 설정
ACameraCharacter();
protected:
// 게임 시작 또는 스폰 시 호출
virtual void BeginPlay() override;
public:
// 프레임마다 호출
virtual void Tick(float DeltaTime) override;
// 함수 기능을 입력에 바인딩하기 위해 호출
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
protected:
// 카메라 숄더 뷰포인트 위치에 대한 화살표 컴포넌트
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
class UArrowComponent* CameraRShoulderLocation;
// 카메라 원점 뷰포인트 위치에 대한 화살표 컴포넌트
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
class UArrowComponent* CameraOriginLocation;
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
class UCameraComponent* CameraComp;
protected:
// CameraComp의 상대적 위치를 CameraRShoulderLocation 화살표 컴포넌트로 설정합니다.
void SetCameraShoulderLocation();
// CameraComp의 상대적 위치를 CameraOriginLocation 화살표 컴포넌트로 설정합니다.
void SetCameraOriginLocation();
};
CameraCharacter.cpp
// 프로젝트 세팅의 설명 페이지에 저작권 통지를 채워 넣으세요.
#include "CameraCharacter.h"
#include "Camera/CameraComponent.h"
#include "Components/ArrowComponent.h"
// 디폴트값 설정
ACameraCharacter::ACameraCharacter()
{
// 이 캐릭터가 프레임마다 Tick()을 호출하도록 설정합니다. 이 설정이 필요 없는 경우 비활성화하면 퍼포먼스가 향상됩니다.
PrimaryActorTick.bCanEverTick = true;
// 클래스 컴포넌트 인스턴스화
CameraRShoulderLocation = CreateDefaultSubobject<UArrowComponent>(TEXT("CameraRShoulderLocation"));
CameraOriginLocation = CreateDefaultSubobject<UArrowComponent>(TEXT("CameraOriginLocation"));
CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComp"));
// 클래스 컴포넌트를 디폴트 캐릭터의 스켈레탈 메시 컴포넌트에 어태치합니다.
CameraRShoulderLocation->SetupAttachment(GetMesh());
CameraOriginLocation->SetupAttachment(GetMesh());
CameraComp->SetupAttachment(GetMesh());
}
// 게임 시작 또는 스폰 시 호출
void ACameraCharacter::BeginPlay()
{
Super::BeginPlay();
}
// 프레임마다 호출
void ACameraCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
//함수 기능을 입력에 바인딩하기 위해 호출
void ACameraCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAction("SwitchCamera", IE_Pressed, this, &ACameraCharacter::SetCameraShoulderLocation);
PlayerInputComponent->BindAction("SwitchCamera", IE_Released, this, &ACameraCharacter::SetCameraOriginLocation);
}
void ACameraCharacter::SetCameraShoulderLocation()
{
CameraComp->SetRelativeLocation(CameraRShoulderLocation->GetRelativeLocation());
}
void ACameraCharacter::SetCameraOriginLocation()
{
CameraComp->SetRelativeLocation(CameraOriginLocation->GetRelativeLocation());
}
게임 모드 설정하기
캐릭터가 생성 및 설정되었으니, 플레이(PIE)를 클릭했을 때 캐릭터를 스폰하기 위해 게임 모드를 수정해야 합니다.
-
콘텐츠 브라우저(Content Browser) 에서 추가/임포트(Add/Import) 버튼을 클릭하여 새 게임 모드 베이스 블루프린트 클래스를 생성하고 이름을 BP_CameraCompGameMode 로 변경합니다.
-
BP_CameraCompGameMode 를 더블클릭하여 클래스 디폴트(Class Defaults) 를 엽니다. 디테일(Details) 패널의 클래스(Class) 카테고리에 있는 디폴트 폰 클래스(Default Pawn Class) 드롭다운 메뉴에서 BP_CameraCharacter 를 선택합니다.
플레이어 컨트롤러와 폰 액터 빙의에 대해 자세히 알아보려면 폰 빙의를 참고하세요.
-
컴파일(Compile) 하고 저장(Save) 합니다.
-
언리얼 엔진 툴바에서 편집(Edit) > 프로젝트 세팅(Project Settings) 을 선택한 다음 맵 & 모드(Maps & Modes) 세팅으로 이동합니다. Default Modes 카테고리에서 새로 생성된 BP_CameraCompGameMode 클래스를 선택합니다.
-
레벨 에디터에서 플레이(PIE) 버튼을 클릭하여 변경 사항 프리뷰를 시작합니다.
게임 모드 설정
캐릭터가 생성 및 설정되었으니, 플레이(PIE)를 클릭했을 때 캐릭터를 스폰하기 위해 게임 모드를 수정해야 합니다.
-
우선 C++ 클래스 폴더로 이동합니다. CameraComponentsGameModeBase 클래스를 우클릭하고 드롭다운 메뉴에서 CameraComponentsGameModeBase 기반 블루프린트 클래스 생성(Create Blueprint class based on CameraComponentsGameModeBase) 을 선택한 다음 블루프린트를 BP_CameraCompGameMode 로 명명합니다
-
디테일(Detail) 패널에서 클래스(Class) 카테고리로 이동한 다음 디폴트 폰 클래스(Default Pawn Class) 드롭다운 메뉴에서 BP_CameraCharacter 를 선택합니다.
디폴트 폰 클래스도 코드의 GameModeBase 디폴트 폰 변수에서 설정될 수 있습니다.
-
컴파일(Compile) 하고 저장(Save) 합니다.
-
언리얼 엔진 툴바에서 편집(Edit) > 프로젝트 세팅(Project Settings) 을 선택한 다음 맵 & 모드(Maps & Modes) 세팅으로 이동합니다. Default Modes 카테고리에서 새로 생성된 BP_CameraCompGameMode 클래스를 선택합니다.
-
레벨 에디터에서 플레이(PIE) 버튼을 클릭하여 변경 사항 프리뷰를 시작합니다.
최종 결과
Play (PIE) 를 선택하면 마우스 오른쪽 버튼을 누르고 떼는 동작으로 두 개의 카메라 위치 전환을 볼 수 있습니다.
다음 단계
지금까지 카메라 컴포넌트 작업을 했으니 이제 스프링 암 컴포넌트 튜토리얼을 진행하는 것이 좋습니다. 좁은 공간이나 캐릭터와 카메라 사이에 오브젝트가 들어설 때 카메라 시야가 가리지 않도록 하는 데 도움이 되기 때문입니다.