언리얼 엔진에서 주로 쓰는 UPROPERTY 매크로에 대해서 알아보자
C++ 변수 선언 앞에 매크로를 지정할 수 있다. 어떤 변수에 이 매크로를 지정하게 되면 언리얼 엔진의 리플렉션 시스템에 등록되고 다음이 가능해진다
빌드 시에 UHT이 매크로를 감지해 리플렉션 유형에 추가하게 된다
UPROPERTY([specifier, specifier, ...], [meta(key = value, key = value, ...)])
int32 variable;
프로퍼티에 지정자를 통해 엔진과 에디터와 어떻게 상호작용하는지 지정할 수 있다
종류를 살펴보자.
EditAnywhere : 에디터 모든 곳에서 수정이 가능EditDefaultsOnly : 블루프린트 클래스 기본값에서만 수정 가능EditInstanceOnly : 레벨에 배치된 인스턴스에서만 수정이 가능EditFixedSize : 동적 배열 전용이며, 에디터에서 배열 길이를 바꾸지 못하도록 한다EditInline : 다른 오브젝트를 참조할 때, 참조된 객체의 내부 속성을 에디터에서 직접 편집할 수 있게 해주는 지정자Instanced랑 같이 써야하고 참조 대상 클래스에 UCLASS(EditInlineNew)가 있어야 한다VisibleAnywhere : 에디터에서 읽기만 가능VisibleDefaultsOnly : 아키타입에 대한 프로퍼티 창에서 볼 수만 있음VisibleInstanceOnly : 아키타입이 아닌 인스턴스에 대한 프로퍼티 창에서 볼 수만 있음AdvancedDisplay : 디테일 패널의 Advanced 섹션에 들어간다
Category : 에디터에서 프로퍼티의 카테고리를 지정함. | 연산자를 통해 상위 카테고리 | 하위 카테고리 지정이 가능NoClear : 에디터에서 이 오브젝트 레퍼런스를 none으로 설정하지 못하게 한다NonTransactional : 이 프로퍼티를 변경 시 에디터의 되돌리기/다시하기 히스토리에 포함되지 않는다BlueprintReadOnly : 블루프린트에서 읽기만 가능BlueprintReadWrite : 블루프린트에서 읽기 및 쓰기 모두 가능BlueprintAssignable : 멀티캐스트 델리게이트하고만 사용이 가능하다. 프로퍼티를 블루프린트에서 할당할 수 있도록 노출한다BlueprintAuthorityOnly : 이 프로퍼티는 멀티캐스트 델리게이트여야 한다. 블루프린트에서, BlueprintAuthorityOnly 지정자가 붙은 이벤트만 받는다BlueprintCallable : 멀티캐스트 델리게이트 전용이며 프로퍼티를 노출시켜야 블루프린트 코드에서 호출이 가능NotReplicated : 리플리케이션을 생략한다. 서비스 요청 함수의 구조체 멤버와 파라미터에만 적용됨Replicated : 이 프로퍼티는 네트워크를 통해 리플리케이트된다ReplicatedUsing=FunctionName : 프로퍼티가 업데이트될 때 실행되는 콜백 함수를 지정한다AssetRegistrySearchable : 이 프로퍼티와 그 값이, 이것을 멤버 변수로 포함하는 클래스 인스턴스에 대한 애셋 레지스트리에 자동 추가됨을 나타낸다. 구조체 프로퍼티나 파라미터에 사용하는 것은 적합하지 않다Config : 프로퍼티가 환경설정이 가능해짐. 현재 값이 클래스와 연결된 .ini 파일에 저장되며, 생성시 로드된다. 디폴트 프로퍼티에 값을 줄 수 없다GlobalConfig : 위와 비슷하지만 서브클래스에서 덮어쓸 수 없다DuplicateTransient : 이 프로퍼티를 복제할 때 클래스 기본 값으로 리셋시킬지를 나타낸다Localized : 주로 스트링에 사용되며 현지화 값이 있다Transient : 이 프로퍼티는 휘발성이라, 저장 또는 로드되지 않는다. 로드 시간에 0으로 채워짐Instanced : 이 클래스의 인스턴스가 생성될 때, 이를 지정한 프로퍼티의 복사본도 새로 생성된다. 다른 객체가 같은 인스턴스를 참조하는 현상을 막을 수 있다SaveGame : USaveGame을 상속한 클래스에서 저장할 데이터를 명시적으로 나타내는 용도로 사용된다잘 이해가 가지 않는 키워드만 따로 정리해보자
이를 제대로 이해하려면 애셋 레지스트리(Asset Registry)에 대해 알고 있어야 할 것 같다
애셋 레지스트리는 프로젝트 내 모든 애셋의 메타데이터 정보를 관리하는 시스템이다
FAssetRegistryModule을 통해 코드에서 직접 접근하고 쿼리 가능아직 직접 프로젝트에서 이를 사용해보지 못해 감이 안와서 자세한 내용은 나중에 다뤄보겠다
매크로에서 프로퍼티나 함수에 추가적인 메타데이터를 제공할 수 있는 옵션이다. 매크로마다 지정자가 다양한데 UPROPERTY에서 사용하는 지정자를 알아보자
ClampMin="", ClampMax=""BindWidgetBindWidgetOptionalBindWidgetAnimAllowPrivateAccess = "true/false"private 변수를 블루프린트에서 읽고 싶을 때 사용EditCondition = "부울 변수"true일 때 프로퍼티를 보거나 수정할 수 있음DisplayName = ""DisplayThumbnail="true"DisplayPriority="N"ForceInlineRowTooltip = ""