Unreal Engine Reflection System

Taegang Yun·2023년 7월 27일
0

UE5 Documentation

목록 보기
3/5

언리얼 Engine Reflection System은 엔진 및 에디터 기능을 제공하는 다양한 매크로로 클래스를 캡슐화한다. 언리얼 엔진으로 프로그래밍 할 때 표준 C++ 클래스, 함수 및 변수를 가질 수 있다.

  • Unreal 에서 오브젝트의 기본 클래스는 UObject 이다.

  • 'UClass' 매크로를 사용하여 UObject 로부터 파생된 클래스에 태그를 지정하여 UObject 처리 시스템이 인식하도록 할 수 있다.

  • TSubclassOfUClass의 유현 안전성을 제공하는 템플릿 클래스이다. 특정 형식에서 파생되는 클래스를 할당하는 데 유용하다. 예를 들면 디자이너가 플레이어 캐릭터에 대해 스폰되는 무기 클래스를 할당할 수 있는 블루프린트에 이 변수를 노출할 수 있다.

  • 언리얼 스마트 포인터 라이브러리는 메모리 할당 및 추적의 부담을 덜기 위해 설계된 C++11 스마트 포인터의 맞춤형 구현이다. 이 구현에는 nullable이 아닌 공유 포인터처럼 작동하는 산업 표준 공유 포인터, 약한 포인터, 고유 포인터 및 공유참조가 포함된다.

  • UFUNCTION 및 UPROPERTY 매크로는 UE가 새로운 클래스, 함수 및 변수를 인식하도록 한다. 이 매크로은 엔진에서 수집한 가비지이다. 매크로를 지정할 때 Unreal Editor내에서 편집하고 표시할 수 있다.

  • Metadata 지정자는 클래스, 인터페이스, 구조체, 열거형 , 함수 또는 속성이 엔진 및 편집기의 다양한 측면과 상호 작용하는 방식을 제어한다. 각 유형의 데이터 구조 도는 멤버에는 고유한 메타데이터 지정자 목록이 있다.

Objects

UCLASS Macro

UCLASS 매크로는 Uobject에게 Unreal 기반 유형을 설명하는 UCLASS 에 대한 참조를 제공한다. 각각의 UCLASS 는 클래스 기본 개치(CDO) 라는 하나의 개체를 유지한다. CDO는 본질적으로 기본 템플릿 개체이며 클래스 생성자에 의해 생성되고 그 이후에는 수정되지 않는다.

속성 및 함수 유형

UObject는 멤버 변수(프로퍼티) 또는 모든 유형의 함수를 가질 수 있다. 그러나 언리얼 엔진이 이러한 변수나 함수를 인식하고 조작하려면 특수 매크로로 표시해야 하며 특정 유형 표준을 준수해야 한다.

UObject 생성

UObject는 생성자 인수를 지원하지 않는다. 모든 C++ UObject는 엔진 시작 시 초기화되며 엔진은 기본 생성자를 호출한다. 기본 생성자가 없으면 UObject가 컴파일되지 않는다.

UObject 생성자는 가벼워야 하며 기본값과 하위 객체를 설정하는 데만 사용해야 하며, 생성 시 다른 기능을 호출해서는 안 된다. 액터 및 액터 component의 경우 초기화 기능을 BeginPlay() 메서드에 대신 넣어야 한다.

UObject는 런타임에 NewObject를 사용하거나 생성자의 경우 CreateDefaultSubobject만 사용하여 생성해야 한다.

-NewObject<class> 사용 가능한 모든 생성 옵션에 대한 선택적 매개변수를 사용하여 새 인스턴스를 생성.

  • CreateDefaultSubobject<class> 자식 클래스를 만들고 부모 클래스를 반환하는 메서드를 제공하는 컴포넌츠 또는 하위 개체를 만든다.

Unreal Header Tool

UCLASS()

UCLASS 매크로는 UMyObject를 언리얼 엔진에게 보이게 만든다.

class MYPROJECT_API UMyObject : public UObject

MYPROJECT_API를 구체화하는 것은 만약에 MyProject가 UMyObject 클래스를 다른 모듈에 노출하려는 경우 필요하다.

GENERATED_BODY()

매크로 GENERATED_BODY는 인수를 사용하지 않지만 엔진에 필요한 인프라를 지원하도록 클래스를 설정한다. 모든 UCLASSUSTRUCT에 필요하다.

Properties

Property declaration

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

Integers

  • int32
  • uint32
  • ...

Floating Point Types

언리얼은 표준 C++ floating point type을 사용한다.

Boolean

부울 타입은 C++ bool 키워드나 비트필드로 나타낼 수 있다

uint32 bIsHungry : 1;
bool bisThirsty;

String

언리얼 엔진은 세 가지 핵심 문자열 유형을 지원한다.

  • FString은 고전적인 "동적 문자 배열" 문자열 유형이다.
  • FNAME 은 전역 문자열 테이블에서 대소문자를 구분하지 않는 불변 문자열에 대한 참조.
  • FText 는 localization을 처리하도록 설계된 보다 강력한 문자열 표현

대부분의 경우 Unreal은 문자에 TCHAR 유형을 사용한다. TEXT() 매크로는 TCHAR 리터럴을 나타내는 데 사용할 수 있다.

MyDogPtr->DogName = FName(TEXT("Blar Blar"));

Property Specifiers

  • BlueprintCallable : 멀티캐스트 델리게이트만 해당. Blueprint 코드에서 호출하려면 속성을 노출해야 한다.

  • BlueprintReadOnly : 이 프로퍼티는 블루프린트에서 읽을 수 있지만 수정할 수 없다.

  • BlueprintReadWrite : 이 프로퍼티는 블루프린트에서 읽거나 쓸 수 있다.

  • Category = " " : 블루프린트 편집 도구에 표시될 때 속성의 카테고리를 지정.

  • EditAnywhere : 이 프로퍼티는 아키타입과 인스턴스의 프로퍼티 창에서 편집할 수 있다. 'Visible' 지정자와 호환되지 않는다.

  • Replicated : 속성은 네트워크를 통해 복제되어야 한다.

  • ReplicatedUsing = FunctionName : ReplicatedUsing 지정자는 속성이 네트워크를 통해 업데이트 될 때 실행되는 콜백 함수를 지정한다.

  • Transient : 속성은 일시적이므로 저장되거나 로드되지 않는다. 이 방법으로 태그가 지정된 속성은 로드 시 0으로 채워진다.

  • VisibleAnywhere : 이 속성이 모든 속성 창에 표시되지만 편집할 수 없다.

TSubclassOf

TSubclassOf는 UClass 유형 안정성을 제공하는 템플릿 클래스이다. 예를 들어 디자이너가 damagetype을 지정할 수 있는 발사체 클래스를 생성한다고 가정해보자.

/* type of damage */
UPROPERTY(EditDefaultsOnly, Category = Damage)
UClass* DamageType;
/* type of damage */
UPROPERTY(EditDefaultsOnly, Category = Damage)
TSubclassOf<UDamageType> DamageType;

두 번째 선언에서, 템플릿 클래스는 편집기의 속성 창에 속성에 대한 선택 항목으로 UdamageType에서 파생된 클래스만 나열하도록 지시한다.

UFunction

UFunction은 언리얼 엔진 리플렉션 시스템에서 인식하는 C++ 함수이다.

UFUNCTION([specifier1 = setting1, ...] , [meta(key1 = "value1", ...)])
ReturnType FunctionName([Parameter1, ...] [const];

Function Specifiers

  • BlueprintCallable : 함수는 블루프린트 또는 레벨 블루프린트 그래프에서 실행

  • BlueprintPure : 기본적으로 표시된 함수는 const 함수로 노출된다.

  • Client : 함수는 함수가 호출되는 객체를 소유한 클라이언트에서만 실행된다. 기본 함수와 이름이 동일하지만 끝에 _Implementation 가 추가된 추가 함수를 선언한다.

  • NetMulticast : 이 함수는 서버에서 로컬모두 작동하며, 모든 클라이언트에게 replicate되고, Actor의 NetOwner에 상관없이 동작한다.

  • Reliable : 이 함수는 네트워크를 통해 복제된다.

profile
언젠간 전문가가 되겠지

0개의 댓글