언리얼 엔진의 클래스에는 표준화된 작명 규칙이 있어, 클래스 이름 첫 글자, 다른말로 접두사만 봐도 클래스의 종류를 바로 알 수 있다.
접두사 의미
A
스폰가능한 게임플레이 오브젝트의 베이스 클래스에서 확장됩니다. 이들은 Actor, 액터로 월드에 바로 스폰 가능합니다.
U
모든 게임플레이 오브젝트의 베이스 클래스에서 확장됩니다. 월드에는 바로 인스턴싱할 수 없으며, 액터에 속해야 합니다.
언리얼 엔진의 게임플레이 클래스에는 일반적으로 별도의 고유 클래스 소스 파일이 있다. 이 파일 이름은 보통 그 안에 정의되는 클래스 이름에서 접두사 A
또는 U
를 뺀 것과 일치해야 하며, 확장자는 .h
를 사용한다. 즉, AActor
클래스에 대한 클래스 소스 파일은 Actor.h
이다.
각 게임플레이 클래스 소스 파일 위에는, 클레스에 대해 제너레이티드 헤더 파일을 포함시켜 줘야 한다. 즉, ClassName.h
상단에, 다음과 같은 줄이 와야 한다.
#include "ClassName.generated.h"
좀 더 복잡한 데이터 유형, 특히나 클래스 레퍼런스, 이름, 애셋 레퍼런스 값을 설정하는 데는, 생성자의 ConstructorStatics 구조체가 필요한 여러가지 프로퍼티 값을 담을 수 있도록 정의하고 인스턴싱하는 것이 필요하다. 이 ConstructorStatics 구조체는 생성자가 처음 실행될 때만 만들어진다. 그 이후의 실행시에는 그냥 포인터만 복사하므로 매우 빠르다. ConstructorStatics 구조체 생성시 구조체 멤버에 값이 할당되어, 나중에 생성자에서 실제 프로퍼티 자체에 값을 할당할 때 접근할 수 있다.
ContructorHelpers 는 ObjectBase.h 에 정의되는 특수한 네임스페이스로, 생성자 전용 흔한 동작을 수행하는 데 사용하는 헬퍼 템플릿이 들어 있다. 예를 들어, 애셋이나 클래스로의 레퍼런스 검색은 물론 컴포넌트 생성 및 검색용 헬퍼 템플릿이 있다.
이상적으로 클래스의 애셋 레퍼런스는 존재하지 않는다. 하드코딩된 애셋 레퍼런스는 취약해서, 애셋 프로퍼티의 환경설정에는 블루프린트를 사용하는 쪽이 선호되는 방식이다.
ConstructorHelpers::FobjectFinder
는 StaticLoadObject
를 사용해서 지정된 UObject
로의 레퍼런스를 찾는다.
ATimelineTestActor::ATimelineTestActor()
{
// 일회성 초기화 저장을 위한 구조체입니다.
struct FConstructorStatics
{
ConstructorHelpers::FObjectFinder<UStaticMesh> Object0;
FConstructorStatics()
: Object0(TEXT("StaticMesh'/Game/UT3/Pickups/Pickups/Health_Large/Mesh/S_Pickups_Base_Health_Large.S_Pickups_Base_Health_Large'"))
{
}
};
static FConstructorStatics ConstructorStatics;
// 프로퍼티 초기화
StaticMesh = ConstructorStatics.Object0.Object;
}
ConstructorHelpers::FClassFinder
는 지정된 UClass
에 대한 레퍼런스를 찾는다. 클래스를 찾지 못하면 실패 보고를 한다.
APylon::APylon(const class FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
// 일회성 초기화 저장을 위한 구조체입니다.
static FClassFinder<UNavigationMeshBase> ClassFinder(TEXT("class'Engine.NavigationMeshBase'"));
if (ClassFinder.Succeeded())
{
NavMeshClass = ClassFinder.Class;
}
else
{
NavMeshClass = nullptr;
}
}
여러가지 경우에 그냥 USomeClass::StaticClass()
를 사용해서 복잡한 ClassFinder는 한꺼번에 건너뛸 수 있다. 예를 들어 대부분의 상황에서 아래 메소드를 사용할 수 있다.
NavMeshClass = UNavigationMeshBase::StaticClass();
잘 봤습니다. 좋은 글 감사합니다.