강의 목표 :
- 언리얼 오브젝트 리플렉션 시스템의 활용
강의 내용 :
- 언리얼 리플렉션 시스템을 사용해 언리얼 오브젝트의 특정 속성과 함수를 이름으로 검색할 수 있다.
- 리플렉션 시스템을 사용해 접근 지시자와 무관하게 값을 설정할 수 있다.
- 리플렉션 시스템을 사용해 언리얼 오브젝트의 함수를 호출할 수 있다.
[ ✔️실습 : 리플렉션 시스템 ]
📍실습 :
실습 예제 구성 :
학교에서 학생과 선생이 수업 하는 것을 기본 전재로 한다.
각 클래스의 내부적인 구조는 아래와 같다.
실습 코드 :
// UObject 객체 생성
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"), *NewTeacherName);
}
UE_LOG(LogTemp, Log, TEXT("========="));
Student->DoLesson();
UFunction* DoLessonFunc = Teacher->GetClass()->FindFunctionByName(TEXT("DoLesson"));
if(DoLessonFunc)
{
// 인자 : 1.함수포인터 2.파라미터
Teacher->ProcessEvent(DoLessonFunc, nullptr);
}
결과 :
📍코드 분석) 프로퍼티 존재여부 확인 :
FProperty* NameProp = UTeacher::StaticClass()->FindPropertyByName(TEXT("Name"));
UClass::FindPropertyByName() 함수를 통해 해당 클래스 내에 "Name" 이라는 프로퍼티가 존재하는지 파악한다.
📍코드 분석) 프로퍼티 값 얻기/수정하기 :
FString CurrentTeacherName;
FString NewTeacherName(TEXT("이득우"));
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"), *NewTeacherName);
}
FProperty::GetValue_InContainer() 함수를 통해 첫번째 인자로 들어온 객체의 프로퍼티 값을 받아온다.
FProperty::SetValue_InContianer() 함수를 통해 첫번째 인자로 들어온 객체의 프로퍼티 값을 수정한다.
📍코드 분석)함수 존재여부 확인 :
UTeacher* Teacher = NewObject<UTeacher>();
UFunction* DoLessonFunc = Teacher->GetClass()->FindFunctionByName(TEXT("DoLesson"));
UClass::FindFunctionByName(). 함수를 통해 "DoLesson" 이름을 가지는 함수가 존재하는지 확인
📍코드 분석) 리플랙션으로 함수 호출하기 :
if(DoLessonFunc)
{
// 인자 : 1.함수포인터 2.파라미터
Teacher->ProcessEvent(DoLessonFunc, nullptr);
}
UFunction* 에 대한 정보가 존재하는 경우, UObject::ProcessEvent() 함수를 통해 함수를 호출할 수 있다.
첫번째 인자로 호출할 함수의 함수포인터, 두번째 인자로 함수호출시 필요한 파라미터 값들을 넣어준다.
📍#include 위치 :
1. 헤더
다른 헤더 파일을 포함시킬 땐 "~.generated.h" 파일보다 위에 포함시켜줘야한다.
그렇지 않으면 아래와 같이 빌드시 실패한다.
2. 구현부
구현부 역시 헤더 파일 추가시 규칙이 있는데, 구현중인 파일의 헤더가 가장 위에 있어야한다.
만약 구현중인 파일의 헤더가 다른 헤더들 보다 아래에 포함되어 있다면 빌드시 에러가 발생한다.
================================
개인 공부 기록용 포스팅입니다.
댓글, 질문 환영해요~!
Unreal Engine Ver : 5.1.1
Refer : Inflearn_이득우의 언리얼 프로그램
================================
'Unreal > Inflearn' 카테고리의 다른 글
Part1.8 언리얼 C++ 설계 Ⅱ - 컴포지션⭕ (0) | 2024.04.09 |
---|---|
Part1.7 언리얼 C++ 설계 Ⅰ - 인터페이스⭕ (0) | 2024.04.09 |
Part1.5 언리얼 오브젝트 리플렉션 시스템 Ⅰ⭕ (3) | 2024.04.08 |
Part1.4 언리얼 오브젝트 소개 ⭕ (0) | 2024.04.08 |
Part1.3 언리얼 C++ 기본 타입과 문자열 ⭕ (0) | 2024.04.08 |