언리얼 오브젝트 리플렉션 시스템(2)

myeongrangcoding·2023년 12월 1일

언리얼 오브젝트 리플렉션 시스템의 활용

  • 언리얼 오브젝트 리플렉션 시스템을 사용해 언리얼 오브젝트를 다룸

// Fill out your copyright notice in the Description page of Project Settings.


#include "MyGameInstance.h"	// 해당 언리얼 오브젝트에 선언된 이 헤더가 가장 위쪽에 위치해 있어야 함.
#include "Student.h"
#include "Teacher.h"

UMyGameInstance::UMyGameInstance()
{
	// 에디터가 활성화되기 이전에 초기화되는 순서를 가지고 있기 때문에
	// 이때 초기화를 진행해도 에디터에서 인지를 못하는 경우가 종종 있음.
	// 생성자 코드를 변경하게 되는 경우에는 에디터를 꺼줘야 됨.
	SchoolName = TEXT("기본학교");
}

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

	UE_LOG(LogTemp, Log, TEXT("============================="));

	UClass* ClassRunTime = GetClass();
	UClass* ClassCompile = UMyGameInstance::StaticClass();
	//check(ClassRunTime != ClassCompile);
	//ensure(ClassRunTime != ClassCompile);
	//ensureMsgf(ClassRunTime != ClassCompile, TEXT("일부러 에러를 발생시킨 코드"));

	UE_LOG(LogTemp, Log, TEXT("학교를 담당하는 클래스 이름: %s"), *ClassRunTime->GetName());

	SchoolName = TEXT("중앙대학교");
	UE_LOG(LogTemp, Log, TEXT("학교 이름: %s"), *SchoolName);
	UE_LOG(LogTemp, Log, TEXT("학교 이름 기본값: %s"), *(GetClass()->GetDefaultObject<UMyGameInstance>()->SchoolName));

	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("============================="));

	Student->DoLesson();

	// 리플렉션을 사용해서 특정 함수 실행.
	UFunction* DoLessonFunc = Teacher->GetClass()->FindFunctionByName(TEXT("DoLesson"));
	if (DoLessonFunc)
	{
		Teacher->ProcessEvent(DoLessonFunc, nullptr);
	}
}


정리

  • 리플렉션 시스템을 사용해 언리얼 오브젝트의 속성과 함수를 이름으로 검색해서 정보를 가져올 수 있다.
  • 리플렉션 시스템을 사용해 접근 지시자와 무관하게 값을 설정할 수 있다.
  • 리플렉션 시스템을 사용해 언리얼 오브젝트의 함수를 호출할 수 있다.
  • 리플렉션 기능을 사용해서 디자인을 하는 것이 바람직한가라는 것에 대해서는 사용하는 사람에 달려있다.
  • 언리얼 엔진의 기본 프레임웍이 리플렉션을 활용해서 많이 구축되어 있기 때문에 언리얼 엔진을 이해하기 위해서는 리플렉션 시스템을 이해하는 것이 필요하다.
profile
명랑코딩!

0개의 댓글