ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180)
      • Unreal (69)
      • Unity (100)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • SQL
  • c#
  • string
  • 파이썬
  • 포인터
  • 함수
  • 오블완
  • 백준
  • C
  • 배열
  • 알고리즘
  • 프로그래머스
  • C++
  • 문자열
  • 클래스
  • Unity
  • 티스토리챌린지
  • 언리얼
  • 그래픽스
  • 유니티

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

[Unreal] Reflection (리플렉션)
게임엔진/Unreal

[Unreal] Reflection (리플렉션)

2023. 12. 4. 10:38

언리얼은 UHT(Unreal Header Tool) 을 이용해 클래스 계층 구조, 멤버 변수/함수 등의 정보를 UClass 에 저장한다. 이를 리플렉션이라고도 하고, 프로퍼티 시스템이라고도 부른다.

리플리케이션 시스템은 부가 기능으로, 리플렉션 시스템에 보이도록 했으면 하는 유형이나 프로퍼티에 주석을 달아두면 UHT 가 컴파일시 해당 정보를 수집하게 된다.

 

프로퍼티 시스템 계층 구조는 아래와 같다. (UField 아래에 UStruct, UEnum, UProperty 가 있음)

 

#include "MyObject.generated.h"

UCLASS(Blueprintable)
class UMyObject : public UObject
{
    GENERATED_BODY()

public:
    MyUObject();

    UPROPERTY(BlueprintReadOnly, EditAnywhere)
    float ExampleProperty;

    UFUNCTION(BlueprintCallable)
    void ExampleFunction();
};

 

UStruct 모든 멤버에 대한 반복처리를 위해서는, TFieldIterator 를 사용한다. 특정 UObject 타입과 서브클래스에 대해서는 TObjectIterator 를 사용한다.

for (TFieldIterator<UProperty> PropIt(GetClass()); PropIt; ++PropIt)
{
	UProperty* Property = *PropIt;
	// Do something with the property
}

// Will find ALL current UObject instances
for (TObjectIterator<UObject> It; It; ++It)
{
    UObject* CurrentObject = *It;
    UE_LOG(LogTemp, Log, TEXT("Found UObject named: %s"), *CurrentObject->GetName());
}

 

리플렉션 데이터를 사용하면 (프로퍼티 열거, 데이터 주도형 방식으로 값 구하거나 설정, 리플렉션된 함수 실행, 새 오브젝트 생성까지도) 여러가지 많은 작업이 가능하다.

이를 잘 활용하면, 현재 World 에 있는 특정 클래스의 액터를 조회할 수도 있다. 다음 예시 코드를 보자.

PlayerController 를 가져와서, GetWorld 함수를 호출해 해당 PlayerController 가 속한 World 를 얻은 다음, 해당 월드에 있는 AEnemy 타입의 액터들을 조회하는 코드이다. 

추가적으로, 리플렉션 데이터를 C++ generated 코드로 저장하면 엔진 코드와 함께 컴파일 되기 때문에 바이너리와의 동기화가 보장된다.

APlayerController* MyPC = GetMyPlayerControllerFromSomewhere();
UWorld* World = MyPC->GetWorld();

// Like object iterators, you can provide a specific class to get only objects that are
// or derive from that class
for (TActorIterator<AEnemy> It(World); It; ++It)
{
    // ...
}

 

UPROPERTY 는 아와 같은 형식으로 사용된다. Specifier 에는 VisibleAnywhere, EditAnywhere, [Visible, Edit] [DefaultsOnly, InstanceOnly], BlueprintReadOnly/BlueprintWriteOnly, BlueprintAssignable, Config(config) 등 이 있다.

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

 

 

언리얼 프로퍼티 시스템 : 리플렉션(Reflection) (koreanfoodie.me)

저작자표시 (새창열림)

'게임엔진 > Unreal' 카테고리의 다른 글

[Unreal] C++ error C2018 : '' 문자를 인식할 수 없습니다 오류 해결  (0) 2024.01.16
[Unreal] C++ 변환할 수 없습니다 오류 해결  (0) 2024.01.16
[Unreal] 비동기 에셋 로딩  (0) 2023.12.04
[Unreal] 엔진에서 제공하는 데미지 라이브러리  (0) 2023.11.15
[Unreal] 미니맵 및 캐릭터 위치 표시  (0) 2023.11.15
    '게임엔진/Unreal' 카테고리의 다른 글
    • [Unreal] C++ error C2018 : '' 문자를 인식할 수 없습니다 오류 해결
    • [Unreal] C++ 변환할 수 없습니다 오류 해결
    • [Unreal] 비동기 에셋 로딩
    • [Unreal] 엔진에서 제공하는 데미지 라이브러리
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바