⚡이 문서는 이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해 강의를 바탕으로 작성되었습니다.
언리얼 오브젝트 생성
Person 클래스를 상속받는 Student, Teacher 오브젝트를 생성한다.
언리얼 프로퍼티를 사용하기 위해서는 함수에는 UFUNCTION, 변수에는 UPROPERTY 매크로를 붙인다.
Person 클래스
Person.h
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Person.generated.h"
/**
*
*/
UCLASS()
class OBJECTREFLECTION_API UPerson : public UObject
{
GENERATED_BODY()
public:
UPerson();
UFUNCTION()
virtual void DoLesson();
const FString& GetName() const;
void SetName(const FString& InName);
protected:
UPROPERTY()
FString Name;
UPROPERTY()
int32 Year;
private:
};
Person.cpp
#include "Person.h"
UPerson::UPerson()
{
Name = TEXT("홍길동");
Year = 1;
}
void UPerson::DoLesson()
{
UE_LOG(LogTemp, Log, TEXT("%s님이 수업에 참여합니다."), *Name);
}
const FString& UPerson::GetName() const
{
return Name;
}
void UPerson::SetName(const FString& InName)
{
Name = InName;
}
Student 클래스
Student.h
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Person.h"
#include "Student.generated.h"
/**
*
*/
UCLASS()
class OBJECTREFLECTION_API UStudent : public UPerson
{
GENERATED_BODY()
public:
UStudent();
virtual void DoLesson() override;
private:
UPROPERTY()
int32 Id;
};
Student.cpp
#include "Student.h"
UStudent::UStudent()
{
Name = TEXT("이학생");
Year = 1;
Id = 1;
}
void UStudent::DoLesson()
{
Super::DoLesson();
UE_LOG(LogTemp, Log, TEXT("%d학년 %d번 %s님이 수업을 듣습니다."), Year, Id, *Name)
}
Teacher 클래스
Teacher.h
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Person.h"
#include "Teacher.generated.h"
/**
*
*/
UCLASS()
class OBJECTREFLECTION_API UTeacher : public UPerson
{
GENERATED_BODY()
public:
UTeacher();
virtual void DoLesson() override;
private:
UPROPERTY()
int32 Id;
};
Teacher.cpp
#include "Teacher.h"
UTeacher::UTeacher()
{
Name = TEXT("이선생");
Year = 3;
Id = 1;
}
void UTeacher::DoLesson()
{
Super::DoLesson();
UE_LOG(LogTemp, Log, TEXT("%d년차 선생님 %s님이 수업을 강의하십니다."), Year, *Name)
}
리플렉션을 통한 언리얼 오브젝트 프로퍼티 사용
언리얼 오브젝트 객체를 생성하기 위해서는 NewObject 함수를 사용한다.
UStudent* Student = NewObject<UStudent>();
UTeacher* Teacher = NewObject<UTeacher>();
프로퍼티를 사용하지 않아도 NewObject를 통해 생성한 언리얼 오브젝트에 Get, Set 함수를 사용해서 데이터를 저장, 가져올 수 있다.
Student->SetName(TEXT("학생1번"));
UE_LOG(LogTemp, Log, TEXT("새로운 학생 이름 %s"), *Student->GetName());
프로퍼티를 통해 값을 저장, 가져오기 위해서는 다음과 같은 코드를 사용한다.
StaticClass, Runtime 생성 클래스 모두 사용 가능하다.
- FindPropertyByName을 사용해서 먼저 프로퍼티 포인터를 검색한다. 프로퍼티의 이름을 문자열로 전달하면 프로퍼티에 관한 정보를 가져올 수 있다.
- 검색한 프로퍼티를 사용해서 GetValue_InContainer, SetValue_InContainer를 사용하면 값을 저장, 가져올 수 있다.
UTeacher* Teacher = NewObject<UTeacher>();
UTeacher* TeacherRuntime = NewObject<UTeacher>();
FString CurrentTeacherName;
FString CurrentTeacherNameRuntime;
FString NewTeacherName(TEXT("이득우"));
FString NewTeacherNameRuntime(TEXT("런타임"));
FProperty* NameProp = UTeacher::StaticClass()->FindPropertyByName(TEXT("Name"));
FProperty* NamePropRuntime = TeacherRuntime->GetClass()->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());
}
if (NamePropRuntime)
{
NamePropRuntime->GetValue_InContainer(TeacherRuntime, &CurrentTeacherNameRuntime);
UE_LOG(LogTemp, Log, TEXT("[런타임] 현재 선생님 이름 %s"), *CurrentTeacherNameRuntime);
NamePropRuntime->SetValue_InContainer(TeacherRuntime, &NewTeacherNameRuntime);
UE_LOG(LogTemp, Log, TEXT("[런타임] 새로운 선생님 이름 %s"), *TeacherRuntime->GetName());
}
위 코드를 실행한 결과

프로퍼티를 통해 특정 함수를 사용하기 위해서는 다음과 같이 한다.
마찬가지로 Static, Runtime 클래스 모두 사용 가능하다.
- FindFunctionByName을 사용해서 함수 포인터를 검색한다. 마찬가지로 문자열을 통해 검색한다.
- Teacher 클래스의 ProcessEvent를 사용하여 함수 포인터를 인자로 전달한다.
UFunction* DoLessonFuncStatic = UTeacher::StaticClass()->FindFunctionByName(TEXT("DoLesson"));
UFunction* DoLessonFuncRuntime = TeacherRuntime->GetClass()->FindFunctionByName(TEXT("DoLesson"));
if (DoLessonFuncStatic)
{
Teacher->ProcessEvent(DoLessonFuncStatic, nullptr);
}
if (DoLessonFuncRuntime)
{
TeacherRuntime->ProcessEvent(DoLessonFuncRuntime, nullptr);
}
위 코드를 실행한 결과

'Unreal Engine 학습' 카테고리의 다른 글
| [UE5] 인터페이스 (0) | 2023.09.24 |
|---|---|
| [UE5] 프로젝트 코드 재사용 팁 (0) | 2023.09.23 |
| [UE5] 언리얼 엔진 헤더 파일 #include시 주의사항 (0) | 2023.09.18 |
| [UE5] Unreal Object 리플렉션 시스템 - 1 (0) | 2023.09.17 |
| [UE5] Unreal Object 기초 (0) | 2023.09.17 |