[TIL 46일차] <언리얼 C++> 리플렉션 시스템

2026. 4. 9. 19:54TIL

리플렉션 (Reflection) ?

언리얼에서 리플렉션 시스템은 C++ 클래스의 변수 및 함수 정보를 엔진 내부의 메타데이터 형태로 저장하고, 이를 에디터나 블루 프린트에서 활용할 수 있게 만들어주는 기술이다.

 

  • C++ 클래스에 있는 여러 변수와 함수 등을 Reflection해 에디터와 블루프린트에서 직접 설정, 호출이 가능하도록 한다.
  • C++ 로직의 뼈대를 디자이너나 다른 팀원들이 에디터에서 직관적으로 조정할 수 있다.
  • 매개변수를 코드에서만 변경하는 것이 아닌, 에디터에서 바로 조정하여 반복 테스트를 빠르게 진행할 수 있다.

리플렉션 기본 틀

이건 클래스의 헤더이다. 여기서 리플렉션과 관련된 매크로를 확인해보려고 한다.

 

  • #include "MoveItem.generated.h"
    • 언리얼 엔진이 자동 생성하는 헤더파일이다. 클래스 내에 리플렉션 및 엔진 통합에 필요한 코드가 들어있다.
    • 반드시 헤더 파일의 가장 아래 부분에 위치해야 한다. 그렇지 않으면 빌드 에러가 발생할 위험이 있다.
  • UCLASS()
    • 이 매크로가 적용되어 있는 클래스를 엔진의 리플렉션 시스템에 등록한다는 의미이다.
    • 이 매크로가 있어야 블루프린트 등 에디터 차원에서 이 클래스를 인식하고 사용할 수 있다.
  • GENERATED_BODY()
    • 언리얼의 코드 생성 도구가 사용하는 코드를 삽입하는 역할을 한다.
    • 클래스 내부에 필요한 리플렉션 정보를 자동으로 생성해 준다.
  • UPROPERTY()
    • 이 매크로가 적용되어 있는 변수를 엔진의 리플렉션 시스템에 등록한다.

UCLASS()

UCLASS() 매크로는 클래스를 리플렉션 시스템에 등록하는 매크로이다. 괄호 안에 몇 가지 지정자를 설정할 수 있다.

 

기본 동작

아무 옵션을 주지 않으면 블루프린트에서 상속이 가능, 변수로 참조가 가능한 형태로 등록됨.

 

주요 옵션

  • Blueprintable
    • 블루프린트에서 상속 가능한 클래스로 만든다.
  • NotBlueprintable
    • 블루프린트에서 상속이 불가능하도록 한다.
  • BlueprintType
    • 블루프린트에서 변수나 참조로 사용할 수 있게 한다.
    • 위 옵션이 없이 이 옵션만 있다면, (ex. UCLASS(BlueprintType)) 상속은 허용되지 않고 참조만 가능하다.

이 지정자들을 조합해 클래스와 블루프린트가 상호작용하는 방식을 명시할 수 있다.


UPROPERTY()

 

  • 편집 범위 지정자
    • VisibleAnywhere : 읽기 전용으로 표시되며, 수정이 불가능하다.
    • EditAnywhere : 클래스 기본값과 인스턴스에서 모두 수정 가능하다.
    • EditDefaultsOnly : 클래스 기본값에서만 수정 가능하다.
    • EditInstanceOnly : 인스턴스에서만 수정 가능하다.
  • 블루프린트 접근 지정자
    • BlueprintReadWrite : 블루프린트 그래프에서 Getter/Setter로 값을 읽거나 쓸 수 있다.
    • BlueprintReadOnly : 블루프린트 그래프에서 Getter만 쓸 수 있다.
  • 카테고리 지정자
    • 디테일 패널에서 이 변수는 Rotation 범주 아래에 표시된다.
    • 여러 변수를 비슷한 카테고리로 묶으면 세부 정보 패널에서 깔끔하게 정리할 수 있다.
    • Category = "내용"
  • 메타 옵션 지정자
    • meta=(ClampMin="0.0") : 에디터에서 변수 입력시 최소값을 제한할 수 있다.
    • meta=(AllowPrivateAccess="true") : 해당 멤버가 private로 선언되어 있어도, 에디터나 블루프린트에서 접근할 수 있도록 허용한다.
  • 아무 지정자도 선언하지 않으면?
    • 엔진 리플렉션 시스템에는 등록되지만, 에디터나 블루프린트에 노출되지 않는다.
    • 리플렉션에 등록만 되어 있어도 가비지 컬렉션(메모리 관리)과 직렬화(세이브 / 로드) 같은 엔진 내부 기능이 작동할 수 있다.

이런식으로 Rotation Speed를 변경할 수 있다.


함수 리플렉션 UFUNGTION()

주요 지정자

  • 블루프린트 관련 지정자
    • BlueprintCallable
      • 블루프린트 이벤트 그래프에서 호출 가능한 함수로 만든다.
    • BlueprintPure
      • Getter 역할만 수행한다.
    • BlueprintImplementableEvent
      • 함수의 선언만 C++에 있고, 구현은 블루프린트 안에서 하도록 한다. 코드에선 함수의 이름만 정의하고 실제 동작은 블루프린트 이벤트 그래프 안에서 이벤트 노드처럼 구현된다.

 

UFUNCTION()만 사용한다면?

UPROPERTY()와 마찬가지로, 함수가 언리얼 리플렉션에 등록은 되지만, 블루프린트에 노출되진 않는다.

 

 

리플렉션 등록해보기

 

BlueprintImplementableEvent를 사용했는데, 블루프린트에서 구현되지 않았다고 나옴. 즉, 블루프린트에서 구현해야함.

 

이런식으로 Rotate는 블루프린트에서 함수로 구현할 수 있고, GetRotationSpeed는 Getter로 사용할 수 있다.