[Unreal Engine] 리플렉션 시스템, CDO

2024. 7. 26. 09:23·Game Programming/Unreal Engine
목차
  1. 개요
  2. Reflection System
  3. CDO - Class Default Object
  4. 실습 
728x90
반응형

개요

언제나 자연스럽게 사용하지만 정확히 알지 못하는 언리얼 엔진의 리플렉션 시스템과 CDO(Class Default Object)에 대해 정리해 보았습니다.


Reflection System

리플렉션(Reflection)은 프로그램이 실행시간(런타임)에 자기 자신을 조사하는 기능입니다.

 

기존의 C++에서는 어떠한 형태의 리플렉션도 지원하지 않아 언리얼에는 자체적으로 C++ 클래스, 구조체, 함수, 멤버 변수, 열거형 관련 정보를 수집, 질의, 조작하는 별도의 시스템이 구축되어 있으며 이를 리플렉션 시스템(프로퍼티 시스템)이라고 부릅니다.

 

다음과 같이 언리얼 엔진 내의 여러 가지 시스템들이 이 리플렉션 객체에 의존하며,

  • 네트워크 리플리케이션
  • 블루프린트와 C++ 연동
  • 에디터의 디테일 패널
  • 자동 시리얼라이제이션
  • 가비지 컬렉션

이는 옵션이기에 리플렉션 시스템에 보이도록 했으면 하는 유형이나 프로퍼티에 주석을 달아주면, unreal header tool(UHT)가 그 프로젝트를 컴파일할 때 해당 정보를 수집합니다.

 

사용하는 객체에 UENUM(), UCLASS(), USTRUCT(), UFUNCTION(), UPROPERTY()와 같은 매크로를 사용하면 언리얼 엔진 헤더 툴(UHT)이 이것들을 보고 분석해 자동으로 필요한 소스코드(리플렉션 시스템을 구성하는 소스코드)들을 생성해 주며, 리플렉션 된 프로퍼티가 아닌 것은 언리얼 시스템에 의해 관리를 받지 못하기에 메모리 관리를 스스로 해야 합니다.


CDO - Class Default Object

언리얼에서 오브젝트의 베이스 클래스는 UObject이며, UObject에서 파생되는 클래스에 UClass 매크로를 사용해 태그 해주면 UObject 처리 시스템에서 인식하게 됩니다. 

 

UClass 매크로는 UObject에게 자신의 언리얼에서 기반으로 삼은 유형에 대해 설명해 주는 UClass로 레퍼런스를 넘겨줍니다. 각 UClass는 Class Default Object, 줄여서 CDO 라 불리는 오브젝트를 하나 유지합니다.

 

CDO는 언리얼 객체가 가진 기본 값을 보관하는 템플릿 객체로 클래스 생성자에 의해 생성된 이후 변경되지 않는다는 특징을 가지고 있으며, 한 클래스로부터 다수의 물체를 생성해 레벨에 배치할 때 일관성 있게 기본 값을 조정하는데 유용하게 사용됩니다.

 

주어진 오브젝트 인스턴스에 대해 UClass와 CDO 둘 다 구할 수는 있지만, 일반적으로는 읽기 전용으로 간주되어야 하며, 클래스 정보와 CDO는 엔진 초기화 과정에서 생성되므로 게임 개발에서 안전하게 사용이 가능합니다.


실습 

멤버 변수를 하나 선언하고 UPROPERTY() 매크로를 사용하여 Class Default Objcet(CDO)에 대한 테스트를 해보도록 하겠습니다.

 

CDO는 클래스 정보로부터 GetDefaultObject<클래스명>()을 통해 알 수 있으며, 클래스 정보는 GetClass() 함수로 받아올 수 있습니다.

 

StudyGI.h
UCLASS()
class STUDY0725_API UStudyGI : public UGameInstance
{
	GENERATED_BODY()
	
public:
	// 생성자 선언
	UStudyGI();

	// 초기화 함수
	virtual void Init() override;

private:
	// 멤버 변수 선언
	UPROPERTY()
	FString MyName;
};

 

StudyGI.cpp
#include "StudyGI.h"

UStudyGI::UStudyGI()
{
	// 멤버 변수 초기화
	MyName = TEXT("LeeTaes");
}

void UStudyGI::Init()
{
	Super::Init();

	// 이름 변경
	MyName = TEXT("Hello");

	// MyName 출력
	UE_LOG(LogTemp, Warning, TEXT("MyName : %s"), *MyName);
	// CDO에 저장된 MyName 출력
	UE_LOG(LogTemp, Warning, TEXT("CDO : %s"), *GetClass()->GetDefaultObject<UStudyGI>()->MyName);
}

 

실행 결과

 

생성자에서 초기화하고 Init() 함수 내부에서 변수의 값을 수정하였으나, CDO에는 생성자에서 초기화했던 정보가 남아있는 것을 확인할 수 있습니다.

 


참고 자료

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Objects/

https://www.unrealengine.com/ko/blog/unreal-property-system-reflection

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Game Programming > Unreal Engine' 카테고리의 다른 글

[Unreal Engine] DataAsset, Lazy Loading  (0) 2024.10.28
[Unreal Engine 5] AI Controller  (0) 2024.10.01
[Unreal Engine 5] FABRIK IK  (0) 2024.08.25
[Unreal Engine 5] GameInstanceSubsystem  (0) 2024.07.17
[Unreal Engine 5] 위젯 애니메이션 (C++)  (0) 2024.07.01
  1. 개요
  2. Reflection System
  3. CDO - Class Default Object
  4. 실습 
'Game Programming/Unreal Engine' 카테고리의 다른 글
  • [Unreal Engine 5] AI Controller
  • [Unreal Engine 5] FABRIK IK
  • [Unreal Engine 5] GameInstanceSubsystem
  • [Unreal Engine 5] 위젯 애니메이션 (C++)
리태s
리태s
게임 클라이언트 프로그래머 직무를 준비하며 공부한 내용을 정리한 블로그입니다.
    반응형
    250x250
  • 리태s
    LeeTaes 공부노트
    리태s
  • 전체
    오늘
    어제
    • Home (165)
      • 프로젝트 (20)
        • Isaac 3D (5)
        • TimelessAdventure (13)
        • FruitsPuzzle (2)
      • Game Programming (25)
        • C# (8)
        • Unity Engine (6)
        • Unreal Engine (8)
        • UE_Multiplayer (3)
      • 코딩테스트 (111)
        • 프로그래머스 (Lv. 0) (27)
        • 프로그래머스 (Lv. 1) (31)
        • 프로그래머스 (Lv. 2) (21)
        • 백준 (Study) (29)
        • 알고리즘 (3)
      • CS지식 (7)
        • 운영체제 (7)
      • 일상 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    프로그래머스
    c#
    프로젝트
    백준
    project t.a develop
    C++
    구현
    코딩테스트
    2019 kakao
    fsoftobjectpath
    프로세스
    sesac
    Unreal Engine
    tsoftobjectptr
    unity
    pcce 기출문제
    dataasset
    Summer/Winter Coding
    delegate
    unrealengine
    issac3d
    fruitspuzzle
    CS지식
    timelessadventure
    Algorithm
    ai controller
    2022 kakao
    후기
    청년취업사관학교
    2018 kakao
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
리태s
[Unreal Engine] 리플렉션 시스템, CDO

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.