언리얼 C++에서 구현한 클래스들은 별도로 리플랙션을 설정 해주지않으면 에디터에서 수정 및 읽을 수 가 없는데
이번엔 이를 해결하기 위한 리플렉션 시스템을 알아본다.
리플렉션 설정은 모두 헤더 파일에서 매크로를 사용하여 설정 가능하다.
리플렉션은 크게 클래스, 함수, 변수로 지정 가능한 매크로들이 존재한다.
1. 클래스 리플렉션
Item.h

이전시간 만들었던 액터 클래스의 헤더파일에서 Item.generated.h 가 #include 선언 되어있는지 확인
해당 헤더파일이 항상 마지막에 선언되어야 리플렉션을 적용할 수 있다.
UCLASS() :
해당 클래스가 언리얼 엔진에서 리플렉션 시스템에 등록한다는 의미이다.
이 매크로가 있어야지만 언리얼에서 이 클래스를 인식하고 사용 가능
GENERATED_BODY() :
언리얼의 코드 생성도구가 사용하는 코드를 삽입하는 역할
클래스 내부에 필요한 리플렉션 정보를 자동으로 생성
2 변수와 함수 리플렉션
Item.h

2-1) 변수에 리플렉션 적용
UPROPERTY( #1편집 가능 여부, #2블루프린트 접근 여부, #3카테고리 지정, #4메타옵션 지정 ) :
해당 매크로의 인자 값에 따라 바로 아래에 선언된 변수를 수정 및 읽기가 가능
#1 편집 가능 여부
1) VisivleAnywhere : 읽기 전용, 수정 불가
2) EditAnywhere : 클래스 기본값, 인스턴스 모두 수정 가능
3) EditDefaultsOnly : 클래스 기본값에서만 수정 가능
4) EditInstanceOnly : 인스턴스에서만 수정 가능
#2 블루프린트 접근 여부
1) BlueprintReadWirte : 블루프린트 그래프에서 Getter/Setter로 값을 읽거나 쓸 수 있다.
2) BlueprintReadOnly : 블루프린트 그래프에서 Getter 핀만 노출되어 읽기만 가능.
#3 카테고리 지정
디테일 패널에서 해당 텍스트로 Rotation 범주 아래에 폴더 형식으로 표시 카테고리를 하나 만든다고 생각하면됨
#4 메타 옵션 지정
1) meta=(ClampMin="0.0") : 에디터에서 변수 입력 시 최소값을 제한 할 수 있다.
2) meta=(AllowPrivateAccess="true") : 해당 멤버가 private 로 선언 되어 있어도 에디터나 블루프린트에서 접근 가능
위 인자값들을 다 무시하고 UPROPERTY()만 사용한다하면 에디터나 블루프린트에선 노출이 안된다.
여기서 말하는 블루프린트는 해당 액터 클래스를 기반으로 한 블루프린트로 다음과 같이 생성한다.

변수 리플렉션 결과물
1) VisivleAnywhere : 읽기 전용 수정 불가

2) EditAnywhere : 어디서든 편집 가능

해당 메쉬 컴포넌트는 이전시간엔 리플렉션을 사용하지 않아서 위 이미지 처럼 에디터에서 머티리얼과 메쉬 설정을 못하고 소스코드에서 레퍼런스 주소를 가져와 Set Mesh, Set Material 함수를 이용해 할당했는데 위처럼 리플렉션 설정을 해주면 아래 이미지에 작성한 Set Mesh, Material 부분은 생략해도 된다.

3) EditDefaultsOnly : 클래스 디폴트에서만 수정 가능

2-2) 함수에 리플렉션 적용


UFUNCTION( #1인자값 ) :
해당 매크로를 이용해 클래스 멤버 함수를 에디터 및 블루프린트에서 노출 및 수정이 가능하다.
기본 적으로 인자값을 주지않으면 블루프린트에 노출 되지 않는다.
#1 인자값
1) BlueprintCallable : 블루프린트 이벤트 그래프에서 호출 가능한 함수로 만든다.
2) BlueprintPure : 블루프린트에서 Getter 역할만 수행하도록 한다.
3) BlueprintImplementableEvent : 함수 선언만 C++에 존재하고 구현은 블루프린트에서 한다.
(동작은 블루프린트 이벤트 그래프 안에서 이벤트 노드 처럼 구현된다.)
함수 리플렉션 결과물

위에서 선언한 함수들은 에디터에서 해당 액터 클래스를 상속받는 블루프린트로 생성후 블루프린트 이벤트 그래프에서 위 처럼 함수들을 가져올 수 있다.
표로 정리하자면 아래와 같다.

'Unreal 5' 카테고리의 다른 글
| C++ 캐릭터 클래스와 카메라 셋팅 (1) | 2025.07.12 |
|---|---|
| GameMode 클래스 (1) | 2025.07.12 |
| Tick() 이벤트 함수를 이용한 Rotation 값 업데이트 (2) | 2025.07.11 |
| 액터의 Transform 제어 방법 (1) | 2025.07.11 |
| UE_LOG 출력 및 카테고리 추가 (0) | 2025.07.10 |