언리얼로 개발을 하면서 검색을 하다가 다른 사람은 UPROPERTY()와 UFUCTION() 매크로를 사용한 것을 보았다.

내 코드는 저 두가지 매크로를 사용하지 않았지만 아무런 문제는 없었다.

그렇다면 저 매크로들은 왜 사용하는 것일까?

 

결과부터 말하자면 언리얼의 리플렉션 시스템에 속성과 함수를 노출시키기 위해서 사용한다고 한다.

이 매크로는 언리얼 엔진이 C++ 코드와 에디터, 블루프린트 등 다른 시스템 간의 상호작용을 원활하게 할 수 있도록 중요한 역할을 한다.

 

그럼 리플렉션 시스템은 뭘까?

 

언리얼 엔진에서의 리플렉션 시스템

개발자들이 C++ 코드와 언리얼 엔진의 다양한 시스템(에디터, 블루프린트, 직렬화, 네트워킹 등) 간의 상호작용할 수 있도록 지원하는 메커니즘이다.

런타임 또는 컴파일 타임에 객체의 속성과 메서드에 대한 정보를 동적으로 접근하고 조작할 수 있게 해준다.

주로 UPROPERTY()와 UFUNCTION() 같은 매크로를 통해 구현되며, 언리얼 헤더 툴(UHT)에 의해 처리된다.

 

자세한 내용은 언리얼 공식 문서에 설명되어있으니 참고하면 좋을 것 같다.

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/reflection-system-in-unreal-engine

 

UPROPERTY()

- 클래스의 멤버 변수를 언리얼 에디터 내에 노출시킨다.

- 디자이너나 개발자가 에디터 상에서 직접 값을 수정할 수 있도록 한다.

- 블루프린트에서 해당 속성에 대해 접근거나 수정함으로써 블루프린트(시각적 스크립팅)과의 통합이 가능하다.

- 게임 데이터를 저장하거나 불러올 때, 자동으로 직렬화되어 저장한다.

- 언리얼의 가비지 컬렉션 시스템이 메모리를 효율적으로 관리할 수 있도록 도와준다
(UPROPERTY로 선언된 포인터는 자동으로 참조 카운트가 관리된다)

- 매크로 안에 다양한 메타데이터를 지정하여 속성의 동작 방식을 세부적으로 제어가능하다.
예를 들면 EditAnywhere, BlueprintReadWrite 등의 키워드를 사용해 편집 가능 여부나 블루프린트 접근성을 설정할 수 있다.

 

UFUNCTION()

- 클래스의 멤버 함수를 언리얼 에디터나 블루프린트에서 호출할 수 있게 한다.

- 블루프린트 내에서 해당 함수를 노드로 사용해 시각적으로 로직을 구성할 수 있다.

- 네트워크 동작 방식을 정의해(Server, Client, NetMulticast 등) 네트워크 함수를 호출할 수 있다.

- 특정 이벤트에 함수를 바인딩하여 이벤트가 발생했을 때, 자동으로 함수 호출이 가능하다.

- 메타데이터를 지정하여 함수의 동작 방식을 세부적으로 제어할 수 있다.

 

마지막 말

UPROPERTY()와 UFUNCTION()은 언리얼 헤더 툴이 올바르게 코드를 파싱하고 필요한 리플렉션 코드를 생성할 수 있게 도와준다.

언리얼 엔진에서 해당 매크로를 사용하면 개발자가 작성한 코드가 엔진의 다양한 기능과 원활하게 통합되어 개발 과정을 유연하고 효율적으로 가져갈 수 있을 것이다!