2026. 3. 27. 18:17ㆍTIL
언리얼 엔진에서 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 |