언리얼 엔진의 **리플렉션 시스템(Reflection System)**은 실행 중인 프로그램이 자기 자신의 클래스, 변수, 함수 등의 정보를 조회하고 수정할 수 있는 기능입니다.
이를 통해 개발자는 동적 객체 관리, 에디터 통합, 블루프린트 연동, 네트워크 리플리케이션 등 다양한 기능을 활용할 수 있습니다.
이번 글에서는 리플렉션 시스템을 활용하여 언리얼 오브젝트의 특정 속성과 함수를 이름으로 검색하고 조작하는 방법을 살펴보겠습니다.
리플렉션 시스템을 사용하면 언리얼 오브젝트의 특정 속성을 문자열 이름으로 검색하여 값에 접근할 수 있습니다. 예제 코드를 살펴보겠습니다.
#include "MyGameInstance.h"
#include "Student.h"
#include "Teacher.h"
void UMyGameInstance::Init()
{
Super::Init();
UE_LOG(LogTemp, Log, TEXT("============================"));
UStudent* Student = NewObject<UStudent>();
UTeacher* Teacher = NewObject<UTeacher>();
Student->SetName(TEXT("학생1"));
UE_LOG(LogTemp, Log, TEXT("새로운 학생 이름 : %s"), *Student->GetName());
FString CurrentTeacherName;
FString NewTeacherName = TEXT("김선생");
FProperty* NameProp = UTeacher::StaticClass()->FindPropertyByName(TEXT("Name"));
if (NameProp)
{
NameProp->GetValue_InContainer(Teacher, &CurrentTeacherName);
UE_LOG(LogTemp, Log, TEXT("기존 선생님 이름 : %s"), *CurrentTeacherName);
NameProp->SetValue_InContainer(Teacher, &NewTeacherName);
UE_LOG(LogTemp, Log, TEXT("새로운 선생님 이름 : %s"), *Teacher->GetName());
}
UE_LOG(LogTemp, Log, TEXT("============================"));
}
위 코드를 실행하면 UTeacher 클래스의 Name 프로퍼티를 직접 검색하여 값을 변경할 수 있습니다. 이는 private 속성이라도 리플렉션을 사용하면 접근이 가능하다는 것을 의미합니다.
리플렉션 시스템을 활용하면 객체의 특정 함수를 동적으로 호출할 수도 있습니다.
UFunction* DoLessonFunc = Teacher->GetClass()->FindFunctionByName(TEXT("DoLesson"));
if (DoLessonFunc)
{
Teacher->ProcessEvent(DoLessonFunc, nullptr);
}
위 코드에서는 UTeacher 객체의 DoLesson 함수를 FindFunctionByName() 으로 찾고, ProcessEvent() 를 사용하여 실행합니다. 이는 동적 호출이 필요한 경우 유용하게 사용할 수 있습니다.
홍길동님이 수업에 참여합니다.
3년차 선생님 김선생님이 수업을 듣습니다.
이처럼 ProcessEvent()를 사용하면 특정 오브젝트의 함수를 실행 중에 동적으로 호출할 수 있습니다.
언리얼 엔진의 리플렉션 시스템을 활용하면 보다 유연하고 동적인 코드 작성이 가능합니다. 특히, 런타임에서 클래스 정보를 탐색하고 수정해야 하는 경우, 리플렉션을 적극 활용하면 개발의 효율성을 높일 수 있습니다.
언리얼 C++ 프로퍼티 시스템과 리플렉션 (Part 1) (0) | 2025.02.28 |
---|---|
언리얼 C++ 오브젝트 시스템 소개 (1) | 2025.02.21 |
언리얼 C++ 기본 타입과 문자열 처리 정리 (0) | 2025.02.21 |
언리얼 엔진 C++ 코딩 표준 정리 (1) | 2025.02.21 |