C++ 로 프로그래밍 하기(Unreal)

정혜창·2025년 1월 7일

독학

목록 보기
20/28

기초

언리얼 엔진은 프로그래머, 이자이너, 아티스트가 Workflow를 가속화하기 위한 다수의 툴 세트를 제공한다. (수정 및 설정 가능)

  • C++에서 새 게임플레이 클래스를 생성하면, VS또는 XCODE로 컴파일한 후 모든 변경사항이 언리얼 에디터에 반영된다. 언리얼 엔진에서 클래스를 생성하는 것은 표준 C++ 클래스, 함수, 변수를 생성하는 것과 유사하다.

  • 에디터 함수기능을 제공하는 메타데이터 프로퍼티 지정자 매크로를 통해 클래스를 캡슐화하는 언리얼 리플렉션 시스템을 사용한다

  • 언리얼 엔진의 컨테이너는 클래스 및 데이터 구조체 컬렉션에 정보를 제공한다.

#include "CoreMinimal.h : 기본적으로 엔진의 기초 기능을 담고 있는 헤더
#include "GameFramework/Charactor.h" : 기본적으로 캐릭터의 기초 기능을 담고 있는 헤더
#include "Logging / LogMacros.h" : 기본적으로 로그를 남기는 기능을 담고있는 헤더
#include "Gam1Character.generated.h" GENERATED_BODY( )를 쓰기 위한 헤더로 헤더 선언에서 가장 마지막으로 위치해야만 제대로 포함된다.

여기서 잠깐 GENERATED_BODY()를 짚고 넘어가자면

  • 클래스의 정보를 언리얼로 인식시켜주는 중요한 역할을 한다.

  • Reflection System과 관련된 매크로 중 하나로 C++에서 Unreal Engine의 객체 시스템과 통합하기 위해 사용된다.

  • 더 정확하게, 이 매크로는 클래스의 선언부에 추가되며, 해당 클래스가 UCLASS, USTRUCT, UENUM 등과 같은 Unreal Engine의 Reflection System에서 작동하도록 만든다.


Reflection System

언리얼에서 리플렉션 시스템(Reflection System)은 코드에서 객체와 그 속성에 대한 정보를 동적으로 조회할 수 있는 매커니즘을 제공한다. 이를 통해 코드의 일부를 변경하지 않고도 객체의 타입, 클래스 멤버(속성, 메소드 등), 객체 간의 관계 등을 조회하고 조작할 수 있다. 리플렉션 시스템은 특히 에디터에서의 동적 프로퍼티 조작, 블루프린트와의 상호작용, 디버깅 및 직렬화에서 유용하다.

주요개념

  1. UCLASS, UPROPERTY, UFUNCTION : 리플렉션 시스템은 주로 이 매크로들을 통해 활성화 된다. 각 매크로는 클래스, 속성, 메서드가 리플렉션 시스템에서 인식되도록 해준다.

    • UCLASS : 클래스를 리플렉션 시스템에 등록하는데 사용한다.
    • UPROPERTY : 클래스의 멤버변수를 리플렉션에 포함시켜 에디터에서 수정 가능하도록 한다.
    • UFUNCTION : 클래스의 메소드를 리플렉션 시스템에 등록하여 호출가능하게 만든다.
  2. TArray, TMap, TSet : 이러한 컨테이너 타입들도 리플렉션을 지원하여 직렬화 및 동적속성 변경이 가능해진다.

  3. ReflectionMetadata : 리플렉션은 메타데이터를 통해 클래스, 속성 및 함수의 정보에 접근할 수 있도록 해준다. 이를 통해 클래스가 갖는 변수나 함수에 대한 정보뿐만 아니라, 변수의 범위나 기본값 같은 속성도 알 수 있다.

  4. 동적 바인딩 : 리플렉션을 통해 객체의 타입을 동적으로 확인하고, 이를 바탕으로 실행 중에 메소드를 호출하거나 속성에 접근하는 것이 가능하다.

예제

UCLASS()
class MYGAME_API AMyActor : public AActor
{
	GENERATED_BODY()
    
public:
    AMyActor();
    
    // 속성의 리플렉션 예시
    UPROPERTY ( EditAnywhere, BlueprintReadWrite, Category = "Stats")
    int32 Health;
    
    // 함수의 리플렉션 예시
    UFUNCTION ( BlueprintCallable, Category = "Action"
    void Heal(int32 Amount);
    
};

void AMyActor::Heal(int32 Amount) {
	Health += Amount

이 코드에서 AMyActor 클래스는 UCLASS 매크로로 리플렉션 시스템에 등록된다. 또한, Health 변수는 UPROPERTY 매크로로 표시되어 에디터나 블루프린터에서 조작할 수 있게 된다. Heal 함수는 UFUNCTION 매크로를 사용하여 블루프린트에서 호출할 수 있게 된다.


변수(UPROPERTY)

거의 C++과 비슷하지만 언리얼에서는 int 자료형을 길이가 고정되어 있는 것을 제공한다.

  • int8, int16, int32, int64 : int 뒤의 숫자는 자료형이 사용하는 비트 개수이다.

  • 문자열은 FString 을 쓴다. FString s = TEXT(" ")
    이외에도 FVector, FHitResult 등이 있지만 언리얼의 접두사에 대해서는 양이 방대해서 다음에 따로 다루겠음.

UPROPERTY()는 변수마다 앞에 붙여줘야 하며 주로 선언부(.h파일)에서 쓰인다. UPROPERTY()는 언리얼 엔진에 이러한 변수가 있음을 알리고 연결되었을 때 어떻게 작동할지 지정하기 위해 사용된다.
실제로 선언부에서 구현해 보았다. 모드 UPROPERTY()를 써준모습

그러나 UPROPERTY(" ") 매크로가 비어있는 상태에서는 언리얼 엔진에서는 UPROPERTY를 찾지 못한다. 보이게 하기 위해선 매크로에 필요한 지정자를 넣어줘야 한다.

많은 지정자가 있지만 가장 기본이 되는 것 부터 알아보면 EditAnywhere, EditDefaultOnly, BlueprintReadWrite, Category = " ", Transient 등이 있다.

예시

// 변수 선언의 정석, 괄호 안에 지정자의 개수는 상관 없다.
UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Transient, Category = "Damage")
float DamagePerSecond;

실습 결과

생성자를 이용하여 초기값 설정
생성자를 이용하여 초기값 설정
UPROPERTY 지정자에 의해 언리얼에서 표시되는 부분
UPROPERTY 지정자에 의해 언리얼에서 표시되는 부분
선언부의 초기값으로 설정되어 있는 모습
선언부의 초기값으로 설정되어 있는 모습


profile
Unreal 1기

0개의 댓글