본문 바로가기
Unreal 게임 개발/Unreal 강의 개인 정리

Unreal Object Reflection System & UClass

by daisy0461 2023. 12. 18.

Unreal Object Reflection System

Unreal Object Reflection System은 Unreal 테크놀로지의 근간이며 에디터의 디테일 패널, Serialization, CG, 네트워크 리플리케이션, BP/C++ 등 다수의 시스템에 탑재 되어있다. Unreal에서 자체적으로 시스템을 구축한 것이다.


헤더에 이 Reflection System을 고려해야한다는 것 UHT(Unreal Header Tool)에 알려주는 방법이 우리가 자주 봐왔던 “~~~.generated.h”이다.
이 Reflection System은 필수가 아니며 Reflection System에 보이도록 하는 유형이나 프로퍼티를 주석에 달아주면 UHT가 컴파일할 때 정보를 수집한다.
주석을 다는 방법은 UENUM(), UCLASS(), USTRUCT(), UFUNCTION(), UPROPERTY()를 사용하여 달아줄 수 있다. 이것들을 달아주면 Unreal이 알아서 Reflection System에 필요한 소스코드를 달아준다고 생각하면 된다.

예시

UPROPERTY(EditAnywhere)
Int32 count;


UPROPERTY()부분에 적절한 코드를 자동으로 Intermediate 폴더에 생성을 해준다.
변수나 함수에 UPROPERTY() or UFUNCTION()을 사용하지 않으면 Unreal에서 관리를 따로 받지 않고 C++로 사용할 수 있다는 것을 의미한다.

위에서 설명했던 다수의 기능 설명

  1. CG: 사용자가 관리를 하지 않아도 자동으로 메모리를 관리해준다
  2. Serialization: Unreal Object 객체를 지정된 포멧에 알맞게 저장하거나 불러들이는 것을 일괄적으로 진행할 수 있도록 해준다. (UPROPERTY()로 지정을 해줘야 Unreal Object에서 빼서 활용가능하다.)
  3. BP: C++ 스크립트에서 사용한 변수나 함수를 BP에서도 사용할 수 있도록 해준다.
  4. 런타임 유형 정보 및 형변환: 부모 자식 클래스가 있을 때 런타임 동안 알맞은 동작을 할 수 있도록 해주고 자주 사용하는 Super또한 해당 시스템이 있기에 사용 가능하다. 또한 Cast로 안전하게 형변환을 할 수 있도록 해주면 실패시 null을 보장하기에 if문으로 거르기 편리하다.
  5. 네트워크 리플리케이션: Serialization과 비슷하다고 생각하면 된다. 네트워크 통신을 할 때 자동으로 전송하고 받을 수 있도록 하는 시스템이다.


Unreal Object

Unreal Object에는 특별한 프로퍼티와 함수를 지정할 수 있다.

  • UPROPERTY: 관리되는 클래스 멤버 변수 (생성자 호출 전 초기화 시 쓰레기 값이 아닌  nullptr로 초기화가 된다.)
  • UFUNCTION: 관리되는 클래스 멤버 함수


UClass

모든 Unreal Object는 클래스 정보와 함께 존재한다. Unreal 클래스 정보에는 CDO(Class Default Object)도 포함되어 있다.

UClass에 클래스 정보가 담아져 있고 UClass를 통해서 자신의 프로퍼티, 클래스 이름, 함수 정보와 같은 정보를 컴파일 타임과 런타임에서 조회 가능하다.

 

Class 정보 조회 방법
클래스 정보를 조회하기 위해서는 GetClass() or FileName::StaticClass()를 사용해주면 된다.
GetClass()와 FileName::StaticClass()는 항상 같은 값을 반환한다.

CDO(Class Default Object)
CDO: Unreal 객체가 가진 기본 값을 보관하는 템플릿 객체이다.
기본 값을 저장하여한 클래스로부터 다수의 물체를 생성해서 배치할 때 일관성 있게 기본값을 조정할 수 있도록 한다.
위의 UClass&CDO는 엔진 초기화 과정에서 생성되기 때문에 안심하고 사용해도 무방하다.
번거로운 점이 생성자를 변경했을 때 CDO에 적용시키기 위해선 Unreal엔진을 끄고 다시 켜야한다.
CDO는 GetClass->GetDefaultObject<FileName>()함수를 통해 얻을 수 있다.

관계도를 간단하게 만들어 보자면
언리얼 객체  내부-> UClass 내부 -> CDO가 있는 형식이다.

이처럼 Unreal객체는 C++보다 다양한 기능을 제공하기 때문에 C++에서 만들 때 사용하는 new()키워드가 아니라 NewObject()라는 키워드를 통해 생성해야한다.
일반 C++ 객체는 new() 키워드를 사용해도 된다. 일반 C++ 객체는 Unreal Refelction System은 사용 불가이다.

'Unreal 게임 개발 > Unreal 강의 개인 정리' 카테고리의 다른 글

Unreal Struct & Map  (0) 2024.01.03
Unreal Delegate  (0) 2023.12.29
Unreal Composition & Enum UMETA 출력  (0) 2023.12.28
Unreal Interface  (0) 2023.12.27
Unreal 기본타입 및 문자열  (0) 2023.12.26