본문 바로가기

Unreal 5/디자인 패턴 및 주요 개념

[Unreal 5] 매크로 지정자

기본적으로 매크로 지정자들은 언리얼 엔진과 에디터에서

Reflection 시스템을 사용하기 위해, Blueprint 와 같이 사용하기 위한 기능들을 엔진 내부적으로 구현하기 위해 사용하는 매크로다.

 

언리얼에는 꽤나 많은 매크로 지정자가 있는데,

언리얼 초보 입장에서는 어떤 매크로를 어떤 상황에 써야 하는지 이해하기가 쉽지 않다.

 

본인 역시 그러하기 때문에 개발하면서 알게 되는 내용들을 여기에 기록해 놓으려고 한다.

 


 

UPROPERTY() 지정자 (프로퍼티 지정자)

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-engine-uproperties?application_version=5.3

 

 

BlueprintReadOnly, ReadWrite 지정자 :

 

이 지정자는 해당 멤버를 블루프린트에서 읽거나(ReadOnly), 읽고 수정(ReadWrite)할 수 있도록 만든다.

예를 들어 아래와 같은 멤버 변수가 있다면

 


 

 

UFUNCTION() 지정자 (함수 지정자)

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/ufunctions-in-unreal-engine?application_version=5.3

 

 

BlueprintCallable 지정자 :

 

이 지정자는 해당 함수를 블루프린트 그래프에서 호출할 수 있도록 만든다.

예를 들어 아래와 같은 함수가 있다면

 

 

이런식으로 블루린트 그래프에 해당 함수가 노출되게 된다.

물론 블루프린트에서 호출해야 하므로 함수의 몸체는 CPP에서 구현해야 한다.

즉, CPP → Blueprint 가 된다.

 


 

 

BlueprintImplementableEvent 지정자 :

 

이 지정자는 해당 함수를 블루프린트에서 구현하도록 만든다.

하지만 위의 BlueprintCallable 지정자와는 반대로 Blueprint 에서 몸체를 구현해야 한다.

즉, Blueprint → Cpp 가 된다.

 

 

이런 함수가 존재한다면, VS IDE 기준으로 초록 밑줄이 쳐져 있듯 CPP에서는 몸체를 구현하지 않는다.

 

 

대신, Blueprint 에서 위 사진과 같이 해당 이벤트에서 무엇을 할지 구현할 수 있게 된다.

 

여기서, 사실 SomeFunction 은 Interface 의 가상 함수이다.

중요한 점은 만약 Interface 에서 사용할 함수를 블루프린트에서 구현하고 싶다면

이렇게 virtual 키워드가 필요 없다는 것이다.

 

매크로 지정자에 의해 엔진에서 내부적으로 BP에서 사용할 가상 함수 테이블을 만들고 구현하기 때문에 사실상 SomeFunction 자체는 가상 함수가 아니기 때문이다.

 

 

물론 BlueprintImplementableEvent 를 위와 같이 CPP에서 호출하는 것도 가능하다.

 


 

 

BlueprintNativeEvent 지정자 :

 

이 지정자는 해당 함수를 블루프린트에서 구현 가능하게 만들 뿐더러, CPP에 내장 구현을 만들기도 한다.

BlueprintImplementableEvent 가 CPP 내장 함수도 있는 구조라고 생각하면 된다.

 

 

예를 들어 위와 같은 인터페이스 함수가 있다면, 이 함수는 CPP에서의 몸체도 내부적으로 생긴다.

그 몸체는 함수명 뒤에 _Implementation 이 붙은 형태로 아래와 같은 형태이다.

 

 

보면 원래 함수 이름인 GetHitReactMontage 의 뒤에 _Implementation 을 붙여서 구현해 놓았다.

즉, 이 인터페이스를 상속하는 객체의 CPP 구현부에서는 위와 같이 원본 함수 이름에 _Implementation 을 붙여 주면 된다.

처음엔 이런 방식이 헷갈릴 수 있는데 그냥 이러한 규칙만 기억하고 있으면 된다.

 

 

Implementation 을 붙이는 이유는 엔진 코드가 내부적으로 그렇게 만들어서 그렇다.

좀 더 자세하게는 언리얼 문서에서 설명된대로, 엔진과 에디터에서는 BlueprintNativeEvent 지정자가 붙은 함수의 Blueprint 구현부를 먼저 찾고, 만약 Blueprint로 override 된 함수가 없다면 CPP에서 해당 이름의 _Implementation 함수를 찾기 때문에 그렇다.


 

BlueprintPure 지정자 :

 

기본적으로 Pure 함수는 외부 실행에 영향을 주지 않고 단순히 값 하나를 반환하는 함수이다.

BlueprintPure 는 그냥 CPP의 함수를 BlueprintPure 함수로 만든다는 뜻이다.

 

 

보면 실행 핀이 없다는 것을 알 수 있다.

 

 

 

 

(업데이트 중)