Unreal Engine 프로퍼티 시스템 (리플렉션)

끄적끄적·2025년 1월 23일

리플렉션 이란?

리플렉션(Reflection)은 프로그램이 실행시간에 자기 자신을 조사하는 기능

C++은 리플렉션을 지원하지 않아서 언리얼 자체적으로 별도의 시스템이 구축되어 있음

프로퍼티 시스템을 이용하기 위해선?

#include "FileName.generated.h" 을 추가해 주어야 한다.
헤더 맨 아랫단에 반드시 위치 해야함

프로퍼티 시스템의 계층 구조

UField

	UStruct

		UClass (C++ class)

		UScriptStruct (C++ struct)

		UFunction (C++ function)

	UEnum (C++ enumeration)

	UProperty (C++ member variable or function parameter)

	(Many subclasses for different types)

  • UStruct 는 기본적인 종합 구조체 (C++ 클래스, 구조체, 함수와 같이 다른 멤버를 포함하는 모든 것)이며, (UScriptStruct 인) C++ 구조체와 헷갈리지 말아야 한다.
  • UClass 는 그 자손으로 함수나 프로퍼티를 포함할 수 있는 반면, UFunction 과 UScriptStruct 는 프로퍼티로만 제한된다.

UCALSS()

클래스를 리플렉션 시스템에 등록하기 위한 키워드
등록된 클래스는 블루프린트에서 접근 가능

GENERATED_BODY() : 클래스를 리플렉션 시스템에 등록하기 위한 매크로

UCLASS() <- 이 기본 상태는 UCLASS(Blueprintable, BlueprintType) <- 이 것과 동일

Blueprintable , NotBlueprintable

블루프린트 상속 가능,블루프린트 상속 불가능
 

BlueprintType

 해당 클래스를 블루프린트의 변수로 사용할 수 있는 형식으로
  노출시키는 지정자이다.

Abstract

 해당 클래스가 추상 클래스임을 나타내는 지정자이다.
당연하게도 인스턴스를 생성하지 못하며, 에디터 상에 그 자체로 추가될 수 없다.
엔진에 미리 정의된 클래스 중에선, 대표적으로 AActor 클래스가 추상 클래스이다.

Config=iniName

해당 클래스가 환경설정(*.ini) 파일에 데이터를 저장할 수 있음을 나타낸다.

클래스 멤버 변수 중 config/globalconfig 지정자를 가지는 변수가 있을 경우,
 이 지정자는 그 프로퍼티를 해당 이름의 환경설정 파일에 저장하도록 한다.

이 지정자는 모든 자식 클래스에 전파되며 무시될 수 없으나, 자식 클래스에서 
config 지정자에 다른 파일 이름을 지정하는 식으로 재정의하여 
저장될 ini 파일을 변경할 수는 있다.

데이터를 저장할 .ini 파일명은 게임 이름에서 "Game"을 뺀 다음
 IniName을 덧붙인 형식을 가진다.

(UDKGame에서 config=Camera라면, UDKCamera.ini를 사용하게 된다)

다음 네 개의 ini는 기본적으로 존재하는 것들이다.

- Config=Engine
- Config=Editor
- Config=Game
- Config=Input
    

MinimalAPI

클래스의 형식 정보만 다른 모듈에서 사용할 수 있게 export 하도록
 하는 지정자이다.
즉, 해당 클래스로 형 변환은 가능하지만, 해당 클래스의 함수는 호출이 
불가능하다 (inline 메소드는 제외)

다른 모듈에서 모든 함수를 접근하도록 할 필요가 없는 클래스의 
export 타임이 단축된다.
대표적인 예가, GameMode 클래스라 할 수 있다.

DependsOn=(ClassName, ...)

해당 클래스보다 먼저 컴파일되어야 할 클래스들의 이름을 다음과 같은 
두 형식으로 지정할 수 있다.
1. UCLASS(DependsOn=(Head, Arm, Leg))
2. UCLASS(DependsOn=Head, DependsOn=Arm, DependsOn=Leg)

Within = (ClassName)

이 클래스의 객체(오브젝트)가 ClassName의 외부에서는 
생성되거나 존재할 수 없음을 의미한다.

이 클래스의 객체를 생성하기 위해서는 ClassName이 Outer Object로 
지정되어야 한다.

Const

이 클래스의 모든 프로퍼티와 함수는 const 이며 const 로 노출됨. 이 지정자는 서브클래스에 상속된다.

UPROPERTY()

AdvancedDisplay속성이 표시되는 모든 패널의 고급(드롭다운) 섹션에 속성이 배치됩니다.
AssetRegistrySearchableAssetRegistrySearchable 지정자는 이 프로퍼티와 그 값이 이를 멤버 변수로 포함하는 모든 에셋 클래스 인스턴스에 대해 에셋 레지스트리에 자동으로 추가됨을 나타냅니다. 구조체 프로퍼티나 파라미터를 사용하는 것은 합법적이지 않습니다.
BlueprintAssignable멀티캐스트 델리게이트에서만 사용할 수 있습니다. 블루프린트에서 할당할 프로퍼티를 노출시킵니다.
BlueprintAuthorityOnly이 프로퍼티는 멀티캐스트 델리게이트여야 합니다. 블루프린트에서는 BlueprintAuthorityOnly 태그가 붙은 이벤트만 받습니다.
BlueprintCallable멀티캐스트 델리게이트 전용입니다. 프로퍼티를 노출시켜야 블루프린트 코드에서 호출할 수 있습니다.
BlueprintGetter=GetterFunctionName이 프로퍼티는 커스텀 액세서 함수를 지정합니다. 또한 BlueprintSetter 또는 BlueprintReadWrite 지정자가 지정되지 않으면, BlueprintReadOnly 로 간주합니다.
BlueprintReadOnly이 프로퍼티는 블루프린트에서 읽을 수는 있지만 변경은 안됩니다. BlueprintReadWrite 지정자와 호환되지 않습니다.
BlueprintReadWrite이 프로퍼티는 블루프린트에서 읽거나 쓸 수 있습니다. BlueprintReadOnly 지정자와 호환되지 않습니다.
BlueprintSetter=SetterFunctionName이 프로퍼티에는 커스텀 뮤테이터 함수가 있으며, 묵시적으로 BlueprintReadWrite 지정자가 붙습니다. 참고로 뮤테이터 함수는 "같은 클래스 이름으로 그 일부를 따서 지어야 합니다.
Category="TopCategory\|SubCategory\|..."블루프린트 편집 툴에 이 프로퍼티를 표시할 때의 카테고리를 지정합니다. 중첩 카테고리는 \| 연산자로 정의합니다.
Config이 프로퍼티는 환경설정 가능해집니다. 현재 값은 클래스와 연결된 .ini 파일에 저장되며, 생성시 로드됩니다. 디폴트 프로퍼티에 값을 줄 수는 없습니다. BlueprintReadOnly 로 간주합니다.
DuplicateTransient이 프로퍼티를 (복사/붙여넣기든, 이진 복제든) 어떤 식으로든 복제할 때 클래스 기본 값으로 리셋시킬지를 나타냅니다.
EditAnywhere이 프로퍼티는 아키타입이나 인스턴스 양쪽의 프로퍼티 창에서 편집할 수 있습니다. 이 지정자는 어떤 "Visible" 지정자와도 호환되지 않습니다.
EditDefaultsOnly이 프로퍼티는 프로퍼티 창에서 편집할 수 있지만, 아키타입 상에서만 가능합니다. 이 지정자는 어떤 "Visible" 지정자와도 호환되지 않습니다.
EditFixedSize동적 배열 전용입니다. 사용자가 언리얼 에디터 프로퍼티 창을 통해 배열 길이를 바꾸지 못하도록 합니다.
EditInline사용자가 언리얼 에디터의 프로퍼티 인스펙터 안에서 이 프로퍼티에 참조된 오브젝트의 프로퍼티를 편집할 수 있도록 합니다 (오브젝트 레퍼런스 배열을 포함한 오브젝트 레퍼런스 전용입니다).
EditInstanceOnly이 프로퍼티는 프로퍼티 창에서 편집할 수 있지만, 아키타입이 아닌 인스턴스 상에서만 가능합니다. 이 지정자는 어떤 "Visible" 지정자와도 호환되지 않습니다.
Export오브젝트 (또는 오브젝트 배열) 프로퍼티 전용입니다. 이 프로퍼티에 할당된 오브젝트는 오브젝트를 (복사/붙여넣기할 때의) 복사하기나 T3D 로 익스포트할 때, 오브젝트 레퍼런스 자체만 출력하는 것이 아니라 서브오브젝트 블럭 전체로 익스포트해야 함을 나타냅니다.
GlobalConfigConfig 과 비슷하지만 서브클래스에서 덮어쓸 수 없습니다. 디폴트 프로퍼티에 값을 줄 수 없습니다. BlueprintReadOnly 로 간주합니다.
Instanced오브젝트 (UCLASS) 프로퍼티 전용입니다. 이 클래스의 인스턴스가 생성될 때, 이 프로퍼티에 기본으로 할당된 오브젝트 고유 사본을 쥐어줍니다. 클래스 디폴트 프로퍼티에 정의된 서브오브젝트 인스턴싱에 사용됩니다. EditInline 및 Export 로 간주됩니다.
Interp이 값은 마티네의 트랙으로 시간에 따라 구동시킬 수 있음을 나타냅니다.
Localized이 프로퍼티 값은 정의된 현지화 값이 있습니다. 거의 스트링에 사용됩니다. ReadOnly 로 간주합니다.
Native이 프로퍼티는 네이티브입니다. 즉 C++ 코드가 시리얼라이즈와 가비지 컬렉션으로의 노출을 담당합니다.
NoClear에디터에서 이 오브젝트 레퍼런스를 none (없음)으로 설정하지 못하게 합니다. 에디터에서 clear(비우기) (및 browse(둘러보기)) 버튼을 숨깁니다.
NoExport네이티브 클래스 전용입니다. 이 프로퍼티는 자동 생성 클래스 선언에 포함시켜서는 안됩니다.
NonPIEDuplicateTransient이 프로퍼티는 에디터에서 플레이(PIE) 세션 도중이 아닌 경우 복제 도중 기본값으로 리셋됩니다.
NonTransactional이 프로퍼티에 대한 변경은 에디터의 되돌리기/다시하기 히스토리에 포함되지 않습니다.
NotReplicated리플리케이션을 생략합니다. 서비스 요청 함수의 구조체 멤버와 파라미터에만 적용됩니다.
Replicated이 프로퍼티는 네트워크를 통해 리플리케이트됩니다.
ReplicatedUsing=FunctionNameReplicatedUsing 지정자는 네트워크를 통해 프로퍼티를 업데이트할 때 실행되는 콜백 함수를 지정합니다.
RepRetry구조체 프로퍼티 전용입니다. (오브젝트 레퍼런스가 아직 네트워크를 통한 시리얼라이즈에 사용할 수 없는 상태라던가 해서) 이 프로퍼티를 완전히 전송하는 데 실패한 경우 그 리플리케이션을 재시도합니다. 단순 레퍼런스라면 기본값이지만, 구조체의 경우 보통 대역폭 비용으로 인해 바람직하지 않으므로, 직접 지정하지 않는 한 비활성화되는 옵션입니다.
SaveGame이 지정자는 프로퍼티 레벨에서 체크포인트/저장 시스템용 필드를 명시적으로 포함시키기 위한 단순한 방법입니다. 이 옵션은 저장된 게임의 일부로 포함시키려는 모든 필드에 설정해 두면, 프록시 아카이버를 사용하여 읽기/쓰기 가능합니다.
SerializeText네이티브 프로퍼티는 텍스트 (ImportTextExportText) 로 시리얼라이즈해야 합니다.
SkipSerialization이 프로퍼티는 시리얼라이즈되지 않지만, (복사/붙여넣기 등) 텍스트 포맷으로 익스포트는 가능합니다.
SimpleDisplayVisible 또는 Editable 프로퍼티는 디테일 패널에 표시되며, "Advanced" (고급) 섹션을 열지 않아도 보입니다.
TextExportTransient이 프로퍼티는 (복사/붙여넣기 등의) 텍스트 포맷으로 익스포트되지 않습니다.
Transient이 프로퍼티는 휘발성이라, 저장 또는 로드되지 않습니다. 이런 식의 지정자가 붙은 프로퍼티는 로드 시간에 0 으로 채워집니다.
VisibleAnywhere이 프로퍼티는 모든 프로퍼티 창에 보이지만 편집할 수 없음을 나타냅니다. 이 지정자는 "Edit" 지정자와 호환되지 않습니다.
VisibleDefaultsOnly이 프로퍼티는 아키타입에 대한 프로퍼티 창에서 보이기만 할 뿐, 편집할 수는 없음을 나타냅니다. 이 지정자는 어떤 "Edit" 지정자와도 호환되지 않습니다.
VisibleInstanceOnly이 프로퍼티는 아키타입이 아닌 인스턴스에 대한 프로퍼티 창에서 보이기만 할 뿐, 편집할 수는 없음을 나타냅니다. 이 지정자는 어떤 "Edit" 지정자와도 호환되지 않습니다.

출저 언리얼 공식 문서

USTRUCT

언리얼 엔진의 리플렉션 시스템은 구조체를 UStruct로 인식하지만, UObject 에코시스템의 일부가 아니므로 UClass 내부에서 사용할 수 없다.

동일한 데이터 레이아웃을 사용하는 UObject 보다 UStruct 를 생성하는 것이 더 빠르다.

UStruct는 UProperty를 지원하지만 가비지 컬렉션 시스템에 의해 관리되지 않으며 UFunction 함수를 제공할 수 없다.

UStruct 구현

  1. 구조체를 정의하려는 헤더(.h) 파일을 연다 .

  2. C++ 구조체를 정의하려면 USTRUCT매크로를 구조체 정의 위에 넣는다.

  3. GENERATED_BODY()정의의 첫 번째 줄에 매크로를 포함한다 .

USTRUCT([Specifiers, Specifiers, ...])
	struct FStructName
	{
		GENERATED_BODY()
	};

구조체 지정자 (Struct Specifiers)

Atomic

이 구조체가 항상 단일 단위로 직렬화되어야 함을 나타냅니다. 
이 클래스에 대해 자동 생성된 코드는 생성되지 않습니다. 헤더는 메타데이터를 파싱하기 위해서만 제공됩니다.

BlueprintType

 이 구조체를 블루프린트에서 변수에 사용할 수 있는 유형으로 노출시킵니다.

NoExport

이 클래스에 대해 자동 생성된 코드가 생성되지 않습니다. 헤더는 메타데이터 구문 분석을 위해서만 제공됩니다.

0개의 댓글