Unreal Engine C++

2026. 3. 27. 18:17TIL

언리얼 엔진에서 C++을 다루면서 가장 낯설었던 부분은 기존 C++문법과 조금 다르게 보였던 언리얼 전용 클래스와 함수들이었다.

 

액터를 돌리고 움직이는 코드를 작성했었는데 아래 코드에는 처음 보는 요소들이 많이 등장했다.

#include "MyActor.h"
#include "Engine/Engine.h"

AMyActor::AMyActor()
{
	PrimaryActorTick.bCanEverTick = true;
}

void AMyActor::BeginPlay()
{
	Super::BeginPlay();

	SetActorLocation(FVector(0, 50, 0));
	RunRandomMovementAndRotation();
}

void AMyActor::Move(float Distance)
{
	FVector ForwardVector = GetActorForwardVector();
	FVector CurrentLocation = GetActorLocation();

	FVector NewLocation = CurrentLocation + (ForwardVector * Distance);

	SetActorLocation(NewLocation);

	PrintCurrentLocation();
}

void AMyActor::Turn(float Angle)
{
	FRotator CurrentRotation = GetActorRotation();

	CurrentRotation.Yaw += Angle;
	CurrentRotation.Pitch += Angle;
	CurrentRotation.Roll += Angle;

	SetActorRotation(CurrentRotation);
}

void AMyActor::RunRandomMovementAndRotation()
{
	for (int i = 0; i < 10; i++)
	{
		float RandomDistance = FMath::RandRange(100.0f, 300.0f);
		float RandomAngle = FMath::RandRange(-90.0f, 90.0f);

		UE_LOG(LogTemp, Warning, TEXT("Step %d"), i + 1);
		UE_LOG(LogTemp, Warning, TEXT("Move Distance: %f"), RandomDistance);
		UE_LOG(LogTemp, Warning, TEXT("Turn Angle: %f"), RandomAngle);

		Turn(RandomAngle);
		Move(RandomDistance);
	}
}

void AMyActor::PrintCurrentLocation()
{
	FVector CurrentLocation = GetActorLocation();
	FRotator CurrentRotation = GetActorRotation();

	FString DebugMessage = FString::Printf(
		TEXT("Location -> X: %.2f, Y: %.2f, Z: %.2f | Rotation -> Pitch: %.2f, Yaw: %.2f, Roll: %.2f"),
		CurrentLocation.X,
		CurrentLocation.Y,
		CurrentLocation.Z,
		CurrentRotation.Pitch,
		CurrentRotation.Yaw,
		CurrentRotation.Roll
	);

	if (GEngine)
	{
		GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Green, DebugMessage);
	}

	UE_LOG(LogTemp, Warning, TEXT("%s"), *DebugMessage);
}

 

이번 글에서는 여기서 등장하는 언리얼 C++의 핵심 요소들을 중심으로 정리해보려고 한다.

 

#include "Engine/Engine.h"

이 코드는 엔진 기능을 사용하기 위한 헤더를 포함하는 부분이다.

이 헤더를 포함하면 GEngine같은 엔진 전역 객체에 접근할 수 있다.

 

예를 들어서 화면에 디버그 메시지를 띄우는 AddOnScreenDebugMessage()를 사용하려면 이 헤더가 필요하다.

 


PrimaryActorTick.bCanEverTick = true;

이 코드는 이 액터가 매 프레임마다 Tick() 함수를 호출할 수 있게 설정하는 부분이다.

 

이 Tick()은 게임이 실행되는 동안 매 프레임 반복 호출되는데, 현재 코드에서는 Tick() 안에 특별한 동작이 없지만, 이 설정을 해두면 나중에 실시간으로 이동하거나 회전 같은 기능을 추가할 수 있다.

 


BeginPlay()

void AMyActor::BeginPlay()
{
	Super::BeginPlay();

	SetActorLocation(FVector(0, 50, 0));
	RunRandomMovementAndRotation();
}

BeginPlay()는 액터가 게임에 실제로 등장해서 처음 실행될 때 한 번 호출되는 함수이다.

 

이 함수는 게임 시작시 이 액터가 처음 무엇을 할지 정하는 시작 함수라고 이해하면 된다.

 


Tick(float DeltaTime)

Tick()은 위에서 설명했듯 매 프레임 호출되는 함수이다.

여기서 DeltaTime은 이전 프레임과 현재 프레임 사이의 시간 차이를 뜻하고, 프레임 속도(컴퓨터의 성능)와 상관없이 일정한 속도로 움직이게 할 때 자주 사용한다.

void AMyActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
}

FVector

FVector(0, 50, 0)

FVector는 언리얼에서 3차원 좌표와 방향을 표현하는 구조체이다.

 

값은 괄호 첫 번째부터 X, Y, Z축이다.

 

또한 FVector는 단순히 위치뿐 아니라 방향, 속도, 이동 거리 계산에도 자주 사용된다.

// 현재 바라보는 방향 벡터를 가져오기
FVector ForwardVector = GetActorForwardVector();
//현재 위치를 가져오기
FVector CurrentLocation = GetActorLocation();
// 방향 x 거리만큼 더해서 새 위치를 계산
FVector NewLocation = CurrentLocation + (ForwardVector * Distance);

코드 내에서는 이렇게 사용되었다.

이처럼 FVector는 위치와 방향을 계산하는 언리얼의 기본 자료형이다.


FRotator

FRotator CurrentRotation = GetActorRotation();

FRotator는 액터의 회전값을 저장하는 구조체이다.

 

세 가지 축으로 회전을 표현한다.

 

Pitch : 위아래 회전 (X축)

Yaw : 좌우 회전 (Y축)

Roll : 기울기 회전 (Z축)

CurrentRotation.Yaw += Angle;
CurrentRotation.Pitch += Angle;
CurrentRotation.Roll += Angle;

코드 내에서는 현재 회전값에 Angle만큼을 더해서 회전시키는 방식을 사용했다.

이동 방향을 바꾸는 데에는 Yaw만 사용해도 되지만 연습과 사용 방법을 익혀보기 위해 전부 사용해보았다.


SetActorLocation()

SetActorLocation(FVector(0, 50, 0));

이 함수는 액터의 위치를 설정하는 함수이다.

 

이 코드에서는 액터의 위치를 

X = 0

Y = 50

Z = 0 

으로 설정했다.

 

이는 위치를 직접 바꿔주는 함수인데, 순간이동처럼 바로 이동시켜준다. 좌표 계산과 함께 자주 사용된다.


GetActorForwardVector();

FVector ForwardVector = GetActorForwardVector();

이 함수는 액터가 현재 바라보고 있는 앞 방향을 벡터로 반환한다.

 

예를 들어 액터가 오른쪽을 보고 있으면 그 방향의 벡터가 나오고, 앞을 보고 있으면 앞쪽 방향 벡터가 나온다.

 

FVector NewLocation = CurrentLocation + (ForwardVector * Distance);

이 코드는 현재 바라보는 방향으로 Distance만큼 이동시키는 코드이다.

 

단순히 X값만 늘리는 것이 아니라 회전 상태에 따라 이동 방향도 함께 달라진다.


SetActorRotation() / GetActorRotation()

FRotator CurrentRotation = GetActorRotation();
SetActorRotation(CurrentRotation);

이 두 함수는 액터의 회전값을 가져오고 설정하는 함수이다.

 

흐름은

1. 현재 회전값 가져오기

2. 원하는 각도만큼 수정

3. 수정한 값을 다시 적용

이렇게 사용하는 것이 일반적이다.

 


FMath::RnadRange()

float RandomDistance = FMath::RandRange(100.0f, 300.0f);
float RandomAngle = FMath::RandRange(-90.0f, 90.0f);

FMath는 언리얼에서 수학 관련 기능을 모아둔 클래스이다.

그 중에서 RandRange()는 지정한 범위 안에서 랜덤 값을 뽑아준다.

 

이동거리를 100~300,

회전 각도를 -90~90으로

랜덤값으로 들어갈 수 있도록 해주는 코드이다.


UE_LOG()

UE_LOG()는 언리얼에서 로그 창에 메시지를 출력하는 대표적인 디버깅 함수이다.

UE_LOG(로그카테고리, 로그레벨, TEXT("출력할 내용"), 값);

형식은 대체로 이렇다.

 

현재 코드에서 사용한 요소는

로그 카테고리 : LogTemp

로그레벨 : Warning(노란색)

TEXT() : 언리얼 문자열 매크로

 

로그 레벨은 종류가 다음과 같다.

심각도 콘솔 출력 색상
Log 일반적인 메시지, 색상 없음 (기본 검정 텍스트, 흰색 배경) 또는 흰색.
Display 파란색 (일반 정보를 강조하기 위해 표시).
Warning 주황색 또는 노란색 (경고 메시지를 시각적으로 강조).
Error 빨간색 (문제가 되는 상황을 강조).
Fatal 빨간색 (치명적 오류이며 이후 프로그램 종료).

 

 

UE_LOG(LogTemp, Warning, TEXT("Move Distance: %f"), RandomDistance);

예를 들어 이 코드를 보면, 이 코드는 로그 창에 Warning(노란색)으로 이동 거리(RandomDistanse)를 출력하는 코드이다.

 

UE_LOG()의 장점은

- 에디터 Output Log에서 확인 가능

- 반복문 안 값 확인에 좋음

- 실행 흐름 추적이 쉬움

 


TEXT()

TEXT("Step %d")

TEXT()는 언리얼에서 문자열을 다룰 때 자주 사용하는 매크로이다.

 

문자열을 언리얼 문자열 형식에 맞게 처리해준다.

 

언리얼에서는 문자열 관련 함수에서 이 형식을 자주 요구한다. 그래서 로그 출력이나 문자열 포맷팅에서는 거의 습관처럼 붙는다고 보면 된다.

 


FString

FString DebugMessage = FString::Printf(...);

FString은 언리얼에서 사용하는 문자열 클래스이다.

C++의 std::string과 비슷하지만, 언리얼 엔진 내부 시스템에 맞게 만들어져 있다.

 

디버그 메시지, UI 텍스트 처리, 로그 출력 등에서 자주 사용된다.


FString::Printf()

FString DebugMessage = FString::Printf(
	TEXT("Location -> X: %.2f, Y: %.2f, Z: %.2f | Rotation -> Pitch: %.2f, Yaw: %.2f, Roll: %.2f"),
	CurrentLocation.X,
	CurrentLocation.Y,
	CurrentLocation.Z,
	CurrentRotation.Pitch,
	CurrentRotation.Yaw,
	CurrentRotation.Roll
);

코드에서 사용한 FString::Printf()이다. 이 함수는 여러 값을 하나의 문자열로 예쁘게 조합할 때 사용한다.

 

예를 들어서 좌표값과 회전값을 따로따로 출력하지 않고, 한 줄의 문장으로 만들어서 보기 쉽게 정리할 수 있다.


GEngine

if (GEngine)
{
	GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Green, DebugMessage);
}

GEngine은 언리얼 엔진이 제공하는 전역 엔진 객체 포인터다. 

 

엔진 기능에 접근하기 위한 대표 창구라고 볼 수 있다.

 

여기서는 AddOnScreenDebugMessage()를 호출해서 화면에 직접 디버그 메시지를 띄우는 데 사용했다.


AddOnScreenDebugMessage()

GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Green, DebugMessage);

이 함수는 화면 왼쪽 위에 디버그 메시지를 띄워준다.

 

각 인자는 다음 뜻이다.

 

-1 : 새 메시지로 계속 추가

5.0f : 5초 동안 표시

FColor::Green : 초록색으로

DebugMessage : 출력할 문자열

 

아까 UE_LOG가 로그 출력이라면 이 함수는 게임 화면에서 출력하는 코드이다. 예전에 언리얼 블루프린트에서 사용한 Print String과 같다.

 


*DebugMessage

UE_LOG(LogTemp, Warning, TEXT("%s"), *DebugMessage);

여기서 사용한 *DebugMessage는 조금 낯설었다.

 

이는 FString 내부 문자열 데이터에 접근하는 방식이다.

 

DebugMessage : Fstring 객체

*DebugMessage : 로그 출력용 문자열 데이터

 

라고 이해하면 된다.


처음 언리얼 C++를 접하면 UE_LOG, GEngine 등 여러 요소들이 낯설게 느껴진다. 하지만 결국은 블루프린트를 해보며 다 했던 내용들이고 함수 이름도 크게 다르지 않다.

 

이번 실습 코드를 통해 액터의 이동과 회전 뿐 아니라 언리얼 C++에서 자주 사용하는 핵심 함수들의 쓰임을 쉽게 익혀볼 수 있었다.

'TIL' 카테고리의 다른 글

[TIL 45일차] <언리얼 C++> 액터의 라이프 사이클  (0) 2026.04.08
[TIL 44일차]언리얼C++ 액터 기본세팅  (1) 2026.04.07
C++ < String >  (0) 2026.03.12
C언어 <math.h>  (0) 2026.03.11
C++ < STL (기초) >  (1) 2026.03.10