[UE5] 언리얼 엔진 입문

[언리얼 입문] 5 - 언리얼 C++ 코드의 진입 방식과 구조 이해

지망셍 2025. 6. 2. 20:29

언리얼은 C++ 기반 게임 엔진이다.

블루프린트만으로 게임을 만들 수 있지만,

결국 언리얼의 진짜 힘은 C++ 구조를 이해하고 제어할 수 있을 때 발휘된다.

이번 편에서는 언리얼에서 C++ 코드는 어떻게 동작하고,

어디에서 시작하며, 어떤 구조로 확장되는지를 소개한다.


1. 언리얼의 C++ 클래스는 어떻게 생겼나?

언리얼의 C++ 클래스는 UCLASS()와 GENERATED_BODY()를 통해

리플렉션과 에디터 연동이 가능한 구조를 만든다.

UCLASS()
class AMyActor : public AActor
{
    GENERATED_BODY()

public:
    AMyActor();

protected:
    UPROPERTY(EditAnywhere)
    float Health;

    UFUNCTION(BlueprintCallable)
    void TakeDamage(float Amount);
};

  • UCLASS() → 이 클래스가 언리얼 시스템과 연결될 수 있도록 지정
  • UPROPERTY() → 에디터에서 보이게 하거나 저장, GC 추적에 포함
  • UFUNCTION() → 블루프린트, 네트워크, 에디터 등과 연결 가능

2. Header(.h)와 Source(.cpp) 파일 구조

  • .h 파일: 선언부 (클래스, 변수, 함수 시그니처)
  • .cpp 파일: 정의부 (함수 구현, 초기화 로직 등)
// AMyActor.cpp
AMyActor::AMyActor()
{
    PrimaryActorTick.bCanEverTick = true;
    Health = 100.0f;
}


3. 클래스를 만들면 어떤 일이 벌어지는가?

  • UnrealHeaderTool(UHT)이 .generated.h 파일을 생성한다
  • 이 파일이 리플렉션, 직렬화, GC, Blueprint 연동 등을 자동으로 구성
  • 모든 언리얼 C++ 클래스는 반드시 GENERATED_BODY()가 필요하다

4. C++ 클래스 생성 실습

  1. 언리얼 에디터 → "Tools > New C++ Class" 선택
  2. Actor 기반 클래스 생성
  3. Visual Studio가 열리고, 클래스가 추가됨
  4. Tick(), BeginPlay() 등 직접 구현 가능

5. C++ 클래스와 Blueprint 클래스의 관계

역할 설명

C++ 클래스 논리적 베이스 (기능 정의)
블루프린트 클래스 C++ 클래스를 확장, 데이터 설정, 시각적 로직 구성
조합 방식 “C++로 만든 클래스를 블루프린트로 Wrapping”

예:

UCLASS(Blueprintable)
class AMyEnemy : public ACharacter
{
    GENERATED_BODY()
public:
    UFUNCTION(BlueprintImplementableEvent)
    void OnDeath();  // 블루프린트에서 구현 가능
};


6. 빌드 시스템 맛보기

  • Build.cs: 이 모듈이 어떤 의존성, 설정을 갖는지 정의
  • MyGame.Target.cs: 전체 프로젝트 빌드 설정

복잡해 보일 수 있지만 대부분 자동으로 설정된다.

필요할 때만 수정하는 것이 일반적이다.


7. 실전 설계 팁

  • 블루프린트와 C++은 경쟁 관계가 아니라 보완 관계다
  • 반복 로직, 성능 민감한 연산, 커스텀 시스템은 C++에서 처리
  • UI, 연출, 이벤트는 블루프린트에서 연결

마무리하며

언리얼의 C++ 구조는 겉보기에는 복잡하지만,

패턴을 익히면 강력한 제어력과 확장성을 제공한다.

— 오브젝트, 실행 흐름, 블루프린트, 그리고 C++ —

모두를 연결할 수 있는 흐름을 익히는 것은

언리얼의 핵심 구조를 파악하는 첫걸음이 되어 줄 것이다.