Code Less, Create More!

Simple but useful code snippets for 3D Graphic Developers

Unreal Engine

현재 카메라의 위치와 회전값을 얻어내는 방법 (Unreal Engine, C++)

데브엑스 2023. 3. 11. 15:26
반응형

카메라는 게임에서 가장 중요한 요소 중 하나로, 플레이어에게 세계를 보여주는 역할을 합니다. 3D 개발자로서, 객체를 생성하거나 장면의 시점을 지정된 방향을 바라보도록 객체를 조정하는 등의 작업을 수행하기 위해 카메라의 위치와 회전값을 얻어내야 합니다.

Unreal Engine에서는 다양한 방식으로 객체들을 조합해서 장면을 구성하기 때문에 복잡한 구조로 부터 빠르게 카메라의 위치와 회전 정보를 얻는 방법을 알아두면 매우 유용하게 사용할 수 있습니다.

1. Player Camera Manager 사용

Unreal Engine에서는 PlayerCameraManager 클래스를 통해 카메라 위치와 회전을 직접적으로 가져올 수 있습니다. PlayerCameraManager는 플레이어의 카메라를 관리하는 클래스로, 현재 카메라의 위치와 회전 값을 포함하고 있습니다.

아래의 예제에서처럼 GetWorld()->GetFirstPlayerController()->PlayerCameraManager 또는 UGameplayStatics:: GetPlayerCameraManager() 함수를 사용하여 현재 플레이어 캐릭터의 포인터를 찾을 수 있습니다.

// Includes 
#include "Engine/World.h"
#include "Kismet/GameplayStatics.h"
#include "Camera/PlayerCameraManager.h"

// Get a pointer to the current player's camera manager
APlayerCameraManager* PlayerCameraManager = GetWorld()->GetFirstPlayerController()->PlayerCameraManager;
// Same function using UGameplayStatics
APlayerCameraManager* PlayerCameraManager = UGameplayStatics::GetPlayerCameraManager(GetWorld(), 0);

// Get the location and rotation of the camera
FVector CameraLocation = PlayerCameraManager->GetCameraLocation();
FRotator CameraRotation = PlayerCameraManager->GetCameraRotation();

위의 코드에서는 GetFirstPlayerController() 함수를 사용하여 플레이어 컨트롤러에 대한 포인터를 가져온 후, PlayerCameraManager 클래스를 사용하여 카메라의 위치와 회전에 액세스합니다.

 

PlayerCameraManager를 사용하여 카메라 위치와 회전 값을 가져오는 것은, 특히 게임에 많은 캐릭터가 있거나 플레이어가 차량이나 캐릭터 이외의 다른 객체를 제어하는 경우, 플레이어 캐릭터의 카메라 컴포넌트에 액세스하는 것보다 더 효율적일 수 있습니다. 또한, 플레이어 캐릭터가 사용 불가능하거나 활동적이지 않은 경우, 예를 들어 컷신이나 플레이어가 항상 캐릭터를 가지고 있지 않은 멀티플레이어 게임에서도 카메라 정보에 액세스할 수 있습니다.

따라서 이 방법을 사용하여 카메라 정보를 가져오는 것은, 게임의 상황에 따라 더욱 효율적이며 유용할 수 있습니다.

2. Player Controller의 Pawn 사용

플레이어의 Pawn에서 카메라 위치와 회전 값을 가져올 수도 있습니다. 이를 위해서는 GetWorld()->GetFirstPlayerController()->GetPawn() 함수를 사용하여 현재 플레이어 캐릭터의 Pawn을 가져온 후, Pawn에서 GetActorLocation() 및 GetActorRotation() 함수를 사용하여 카메라 위치와 회전 값을 가져올 수 있습니다.

// Includes 
#include "Engine/World.h"
#include "Kismet/GameplayStatics.h"
#include "GameFramework/PlayerController.h"

// Get a reference to the player controller
APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
// Same function using UGameplayStatics
APlayerController* PlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0);
 
// Get a reference to the pawn
APawn* Pawn = PlayerController->GetPawn();
UCameraComponent* CameraComponent = Pawn->FindComponentByClass<UCameraComponent>();
        
// If the camera component exists, get the location and rotation of the camera
FVector CameraLocation = CameraComponent->GetComponentLocation();
FRotator CameraRotation = CameraComponent->GetComponentRotation();

이 작업은 현재 플레이어 컨트롤러의 포인터를 반환하는 GetWorld()->GetFirstPlayerController() 또는 UGameplayStatics:: GetPlayerController() 함수를 사용하여 수행할 수 있습니다.

 

이 함수들을 사용하면 현재 플레이어 컨트롤러의 포인터를 쉽게 가져올 수 있으며, 해당 컨트롤러를 통해 카메라 정보를 가져올 수 있습니다. 따라서 이 방법을 사용하면 카메라 정보에 대한 액세스가 보다 용이하고 간편해집니다.

이러한 함수를 사용하는 것은 매우 일반적이며, Unreal Engine에서는 여러 곳에서 이러한 함수들을 사용합니다. 따라서 이러한 함수를 숙지하고 사용하는 것은 중요합니다.

3. Player Character 사용

다른 방법으로 현재 카메라 위치와 회전 값을 가져오는 방법은 카메라에 직접 액세스하는 것입니다. Unreal Engine에서 카메라는 GameObject에 부착된 Camera Component에 의해 제어됩니다. 이를 위해서는 카메라가 부착된 GameObject를 찾아야 합니다. 이를 위해 UGameplayStatics::GetPlayerCharacter() 함수를 사용할 수 있으며, 이 함수는 현재 플레이어 캐릭터의 포인터를 반환합니다.

// Includes 
#include "Kismet/GameplayStatics.h"
#include "GameFramework/Character.h"
#include "Camera/CameraComponent.h"

// Get a pointer to the current player character
ACharacter* PlayerCharacter = UGameplayStatics::GetPlayerCharacter(GetWorld(), 0);
UCameraComponent* CameraComponent = PlayerCharacter->FindComponentByClass<UCameraComponent>();
 
// Get the location and rotation of the camera
FVector CameraLocation = CameraComponent->GetComponentLocation();
FRotator CameraRotation = CameraComponent->GetComponentRotation();

플레이어 캐릭터를 얻은 후에는 FindComponentByClass() 함수를 사용하여 Camera Component에 액세스할 수 있습니다. 이 함수는 찾고자하는 컴포넌트 유형을 지정하는 템플릿 매개변수를 사용합니다. Camera Component를 찾으려면 UCameraComponent 유형을 지정하면 됩니다.

이제, GetComponentLocation() 및 GetComponentRotation() 함수를 사용하여 카메라 위치와 회전 값을 가져올 수 있습니다. 이 방법은 상대적으로 복잡하지만, 카메라가 부착된 객체를 직접적으로 액세스하여 더욱 정확한 카메라 정보를 가져올 수 있습니다.

 

이 함수를 사용하면 현재 플레이어 캐릭터를 찾을 수 있으며, 이를 통해 Camera Component를 찾아 카메라의 위치와 회전 값을 가져올 수 있습니다. 이 방법은 PlayerCameraManager를 사용하는 것보다 약간 더 복잡할 수 있지만, 카메라가 부착된 객체를 직접적으로 액세스하여 보다 정확한 카메라 정보를 가져올 수 있습니다.

 

주의 사항

예제 코드에서는 플레이어 Pawn 또는 Player Character에 항상 카메라 컴포넌트가 있는 것으로 가정합니다. 그러나 실제로는 카메라 컴포넌트가 없는 상황이 발생할 수 있으며, 이는 런타임 오류나 예상치 못한 동작을 초래할 수 있기 때문에 반드시 객체 포인터를 검사하는 코드를 추가해야 합니다.

 

결론

이 방법들 중에서 어떤 것을 선택할 지는 구체적인 사용 사례에 따라 달라집니다. 만약 첫 번째 플레이어의 카메라 정보를 가져오고자 하며, 그들이 어떤 캐릭터를 제어하든 상관하지 않는다면 GetFirstPlayerController 함수가 정보를 더욱 효율적이고 간단한 방법으로 제공할 수 있습니다.

반면, 특정한 플레이어의 Pawn이나 Character의 카메라 정보를 가져오고자 한다면 PlayerController에서 Pawn을 가져오거나 GetPlayerCharacter 를 사용해서 카메라 객체를 찾아내는 것이 더 나은 선택일 수 있습니다.

 

추가로, UGameplayStatics는 언리얼 엔진에서 C++의 전역 함수들을 제공하는 매우 유용한 도구입니다. 더 자세한 내용은 아래 링크를 참조하세요.

https://docs.unrealengine.com/5.1/en-US/API/Runtime/Engine/Kismet/UGameplayStatics/

반응형