728x90
반응형
언리얼 엔진의 리플렉션(Reflection)은 프로그램이 런타임에 클래스, 구조체, 함수, 멤버 변수 등 객체의 메타데이터를 조사하고 조작할 수 있는 시스템이고 언리얼 엔진의 핵심 기능이다.
엔진은 리플렉션 시스템에 의존하므로, 언리얼 엔진에서 효율적으로 개발하려면 사실상 사용이 필수적이다.
에디터, 블루프린트, 직렬화(Serialization), 네트워크 리플리케이션 등 다양한 시스템에서 사용된다.
리플렉션의 주요 목적
- 런타임 타입 정보 접근
- 실행 중 특정 객체의 클래스 타입 정보 확인.
- 예: `GetClass()`를 통해 클래스 정보를 조회.
- 실행 중 특정 객체의 클래스 타입 정보 확인.
- 동적 객체 생성
- 메타데이터 접근 및 조작
- 변수와 함수의 속성 및 설명을 코드에서 활용.
- 예: `UPROPERTY()`와 같은 매크로를 통해 변수에 메타데이터를 추가.
- 변수와 함수의 속성 및 설명을 코드에서 활용.
- 블루프린트와 C++ 연동
- C++에서 작성된 클래스와 함수, 속성을 블루프린트에 노출하여 비주얼 스크립팅에서 사용할 수 있도록 지원.
- 엔진 기능 지원
- 엔진의 다양한 기능 사용.
- 직렬화(Serialization) : 객체 데이터를 파일로 저장하거나 네트워크로 전송하기 위한 작업
- 게임 저장 시스템에서 객체의 상태를 파일로 저장하거나 복원하려면 리플렉션을 통해 변수 정보를 자동으로 처리 UPROPERTY() 매크로
- 네트워크 리플리케이션(Network Replication)
- 온라인 멀티플레이어 게임 개발에서 객체의 상태를 서버와 클라이언트 간에 동기화할 때 필요
- UPROPERTY(Replicated) 매크로를 사용하여 변수의 동기화를 자동으로 처리
- 네트워크 코드 작성이 간소화 및, 효율적으로 데이터 동기화 구현
- 가비지 컬렉션(Garbage Collection)
- 가비지 컬렉션 시스템을 지원하는데 필요
- UObject기반 클래스들은 가비지 컬렉션 대상
- 직렬화(Serialization) : 객체 데이터를 파일로 저장하거나 네트워크로 전송하기 위한 작업
- 엔진의 다양한 기능 사용.
리플렉션 시스템의 작동 원리
- Unreal Header Tool (UHT)
- 프로젝트 컴파일 시 UHT가 헤더 파일을 스캔하여 리플렉션 데이터 수집
- 리플렉션 정보를 기반으로 `.generated.h` 파일을 생성하여 메타데이터와 헬퍼 코드 제공
- 매크로 사용
- UCLASS, UPROPERTY, UFUNCTION 등의 매크로를 사용해 클래스와 멤버를 리플렉션 시스템에 등록
- 이를 통해 해당 요소들이 블루프린트 및 엔진 시스템에서 인식 및 조작 가능
- 런타임 데이터 접근
- 런타임 중 StaticClass() / GetClass()를 통해 클래스 정보 조회및 활용 가능
리플렉션의 장점
- 런타임에 객체 정보를 동적으로 조회하고 생성할 수 있어, 코드의 확장 및 유연성이 높아진다.
- StaticClass()/NewObject()
- c++로 작성된 요소들을 블루프린트에서 사용할 수 있다.
- 에디터 확장 및 커스터마이징
- UPROPERTY(EditAnywhere)을 사용하면 에디터에서 조정 가능하도록 표시된다.
- 가비지 컬렉션 및 직렬화 등의 시스템을 자동으로 관리해 준다.
리플렉션의 단점
- UHT가 헤더파일을 확인하고. generated.h파일을 생성하는 과정이 추가되므로, 컴파일 시간이 증가한다.
- 런타임 중 메타데이터 조회 및 조작은 성능 비용 이슈가 있다.
- 매크로와. generated.h가 많아지면 코드가 복잡해질 수 있다.
출처
https://www.unrealengine.com/ko/blog/unreal-property-system-reflection
728x90
반응형
'개발일지 > Unreal&C++' 카테고리의 다른 글
[Unreal] 언리얼 인터페이스, 그리고 장/단점 (Interface) (0) | 2025.04.03 |
---|---|
[Unreal] 오브젝트 그리고 CDO(Class Default Object), generated.h, GENERATED_BODY (0) | 2025.04.01 |
[C++] 가상 함수와 비 가상 함수 (0) | 2025.03.18 |
[Unreal] 게임 플레이 프레임워크 (0) | 2025.03.18 |
[Unreal] 서브 레벨 구성 및 스트리밍 레벨 로드 (0) | 2025.03.18 |