티스토리 뷰

언리얼 엔진 위에서 언리얼 엔진과 상호작용하려는 코드를 작성하기 위해서는 언리얼에서 제공하는 각종 매크로의 도움을 받을 수 밖에 없습니다. 그 중, UPROPERTY는 멤버 변수( 또는 프로퍼티 ) 앞에서 기술되며, UPROPERTY 내에 프로퍼티 지정자를 나열함으로써, 해당 프로퍼티가 엔진과 에디터의 다양한 부분과 상호작용할 수 있습니다.

 

 

 

UPROPERTY


UPROPERTY의 역할은 기본적으로 언리얼 리플렉션 시스템에 해당 프로퍼티가 있음을 알리는 것입니다. 예를 들어, 다음과 같이 기술하면 :

UPROPERTY()
USomeClass* SomeClass;

 

빌드 시에 UHT(Unreal Header Tool)이 이 매크로를 감지하고 리플렉션 유형에 추가하게 됩니다. 이렇게 언리얼 리플렉션 시스템에 추가된 UPROPERTY는 가비지 콜렉션(Gargbage Collection)에 의해 생명 주기가 관리되며, 리플렉션을 통해 이 멤버 변수의 이름, 유형 등을 런타임 중에 확인할 수 있게 됩니다.

 

반대로 말하자면, UPROPERTY() 매크로가 기술되지 않은 멤버 변수( 프로퍼티 )는 언리얼 리플렉션에 노출되지 않으며, 리플렉션 시스템이 제공하는 GC, 런타임 정보 확인 등을 사용할 수 없다는 이야기가 되는 셈입니다.

 

다만, 이러한 내용은 UPROPERTY보다는 언리얼 리플렉션 시스템에 관련된 포스팅에 더 어울리는 내용이므로, 이러한 내용은 추후에 포스팅하도록 하겠습니다.

 

 

 

UPROPERTY 지정자


멤버 변수( 프로퍼티 )에 UPROPERTY()를 붙이는 것만으로 리플렉션 시스템에 등록된다고 앞서 말씀드렸습니다. 여기에 프로퍼티 지정자를 추가하게 된다면, 이러한 리플렉션 시스템을 바탕으로 엔진과 에디터와 상호작용할 수 있는 기능을 추가로 제공할 수 있습니다.

언리얼 공식 문서에 따르면, 프로퍼티 선언은 다음과 같이 이루어집니다 :

UPROPERTY(\specifier, specifier, ...], [meta(key=value, key=value, ...)]) Type VariableName;

 

그리고, 프로퍼티 지정자에 들어갈 수 있는 지정자의 종류만 해도 수십 가지가 됩니다. 이번 포스팅의 목적은, 일반적으로 Unreal Engine에서 C++로 프로그래밍할 때 자주 사용하는 지정자에 대해서 알려드리는 것입니다. 아래 카테고리 항목은 제 개인적인 경험에서 분류되었고, 공식 문서에서는 별다른 분류를 제공하지 않으므로, 이 점에 대해서 숙지하고 읽어주시길 바라겠습니다.

 

 

General

이 항목은 일반적인, 대부분의 경우에서 작성되는 평범함 변수에 대해서 붙는 지정자들에 대해 알아보겠습니다. 요약하자면, 가장 많이 쓰이는 지정자라고 할 수 있겠습니다.

프로퍼티 지정자 설명
BlueprintReadWrite  이 프로퍼티는 블루프린트에서 읽거나 쓸 수 있습니다. BlueprintReadOnly 지정자와 호환되지 않습니다.
 위 지정자를 사용하면 블루프린트 에디터 내 내 블루프린트 패널 또는 우클릭 액션 목록에서 'Get/Set 변수명'을 이벤트 그래프 또는 함수 창에서 사용할 수 있음을 의미합니다.
BlueprintReadOnly  이 프로퍼티는 블루프린트에서 읽을 수는 있지만 변경은 안됩니다. BlueprintReadWrite 지정자와 호환되지 않습니다.
 위 지정자를 사용하면 블루프린트 에디터 내 내 블루프린트 패널 또는 우클릭 액션 목록에서 'Get 변수명'을 이벤트 그래프 또는 함수 창에서 사용할 수 있음을 의미합니다.
BlueprintSetter =SetterFunctionName  이 프로퍼티에는 커스텀 뮤테이터(Mutator, Setter 다른 말) 함수가 있으며, 묵시적으로 BlueprintReadWrite 지정자가 붙습니다. 참고로 뮤터이터 함수는 같은 클래스 이름으로 그 일부를 따서 지어야 합니다.
 BlueprintReadWrite를 바탕으로 블루프린트에서 변수를 Set할 때 SetterFunctionName 함수를 Setter 함수로 실행시킨다는 것을 의미합니다.
BlueprintGetter =GetterFunctionName  이 프로퍼티에는 커스텀 액세서(Accessor, Getter의 다른말) 함수를 지정합니다. 또한 BlueprintSetter 또는 BlueprintReadWrite 지정자가 지정되지 않으면, BlueprintReadOnly로 간주합니다.
 블루프린트에서 변수를 Get할 때 GetterFunctionName 함수를 Getter 함수로 실행시킨다는 것을 의미합니다.
EditAnywhere  이 프로퍼티는 아키타입이나 인스턴스 양쪽의 프로퍼티 창에서 편집할 수 있습니다. 이 지정자는 어떤 "Visible" 지정자와도 호환되지 않습니다.
 레벨에 배치된 클래스를 클릭했을 때 나오는 디테일 창 및 블루프린트 에디터의 디테일 창에서 해당 변수가 노출되며, 편집가능한 상태가 됩니다.
VisibleAnywhere  이 프로퍼티는 모든 프로퍼티 창에서 보이지만 편집할 수 없음을 나타냅니다. 이 지정자는 어떤 "Edit" 지정자와도 호환되지 않습니다.
 레벨에 배치된 클래스를 클릭했을 때 나오는 디테일 창 및 블루프린트 에디터의 디테일 창에서 해당 변수가 노출되지만, InputField가 회색으로 블록되어 편집할 수 없습니다.
EditDefaultsOnly  이 프로퍼티는 프로퍼티 창에서 편집할 수 있지만, 아키타입 상에서만 가능합니다. 이 지정자는 어떤 "Visible" 지정자와도 호환되지 않습니다.
 블루프린트 에디터의 디테일 창에서만 해당 변수가 노출되며, 편집가능한 상태가 됩니다.
VisibleDefaultsOnly  이 프로퍼티는 아키타입에 대한 프로퍼티 창에서 보이기만 할 뿐, 편집할 수는 없음을 나타냅니다. 이 지정자는 어떤 "Edit" 지정자와도 호환되지 않습니다.
 블루프린트 에디터의 디테일 창에서만 해당 변수가 노출되며, InputField가 회색으로 블록되어 편집할 수 없습니다.
EditInstanceOnly
 이 프로퍼티는 프로퍼티 창에서 편집할 수 있지만, 아키타입이 아닌 인스턴스 상에서만 가능합니다. 이 지정자는 어떤 "Visible" 지정자와도 호환되지 않습니다.
 레벨 에디터에 배치된 인스턴스의 디테일 창에서만 해당 변수가 노출되며, 편집가능한 상태가 됩니다.
VisibleInstanceOnly
 이 프로퍼티는 아키타입이 아닌 인스턴스에 대한 프로퍼티 창에서 보이기만 할 뿐, 편집할 수는 없음을 나타냅니다. 이 지정자는 어떤 "Edit" 지정자와도 호환되지 않습니다.
 레벨 에디터에 배치된 인스턴스의 디테일 창에서만 해당 변수가 노출되며, InputField가 회색으로 블록되어 편집할 수 없습니다.
Category=" TopCategory| SubCategory|..."  블루프린트 편집 툴에 이 프로퍼티를 표시할 때의 카테고리르 지정합니다. 중첩 카테고리는 | 연산자로 정의합니다.
 블루프린트의 내 블루프린트 패널, 우클릭 액션 목록, 디테일 창 등 표시될 수 있는 곳에 카테고리가 매겨집니다.
메타데이터 지정자 설명
AllowPrivateAccess =true  정의되지 않음
 C++ 코드상에서 private 접근 한정자로 수식된 변수에 대해 접근을 허용하여, 블루프린트 상에 노출시킬 수 있도록 돕습니다.

 

 

델리게이트

이 항목은 델리게이트를 사용할 때, 블루프린트에 노출하려는 경우 사용되는 지정자들에 대해서 설명합니다.

프로퍼티 지정자 설명
BlueprintAssignable  멀티캐스트 델리게이트하고만 사용할 수 있습니다. 프로퍼티를 블루프린트에서 할당할 수 있도록 노출시킵니다.
 델리게이트 변수가 블루프린트 내 내 블루프린트 및 우클릭 액션 목록 등에서 노출되며, 사용할 수 있습니다.
BlueprintCallable  멀티캐스트 데리게이트 전용입니다. 프로퍼티를 노출시켜야 블루프린트 코드에서 호출할 수 있습니다.
 Broadcast() 등의 함수를 블루프린트에서 호출할 수 있음을 의미합니다.

 

델리게이트 관련 지정자에는 BlueprintGetter, BlueprintSetter 지정자가 사용될 수 없음에 유의하시기 바랍니다( 컴파일 에러를 발생시킵니다 ).

 

 

 

레퍼런스


Unreal Engine Wiki - UPROPERTY
Unreal Engine Document - 프로퍼티 지정자
Unreal Answerhub - Why can't I tag a delegate created with DECLARE_EVENT as a UPROPERTY

 

댓글