UE 게임플레이 클래스

Taegang Yun·2023년 7월 31일
0

UE5 Documentation

목록 보기
4/5

언리얼 엔진의 클래스에는 표준화된 작명 규칙이 있어, 클래스 이름 첫 글자, 다른말로 접두사만 봐도 클래스의 종류를 바로 알 수 있다.

접두사 의미

A

스폰가능한 게임플레이 오브젝트의 베이스 클래스에서 확장됩니다. 이들은 Actor, 액터로 월드에 바로 스폰 가능합니다.

U

모든 게임플레이 오브젝트의 베이스 클래스에서 확장됩니다. 월드에는 바로 인스턴싱할 수 없으며, 액터에 속해야 합니다.

클래스 헤더

언리얼 엔진의 게임플레이 클래스에는 일반적으로 별도의 고유 클래스 소스 파일이 있다. 이 파일 이름은 보통 그 안에 정의되는 클래스 이름에서 접두사 A 또는 U를 뺀 것과 일치해야 하며, 확장자는 .h를 사용한다. 즉, AActor 클래스에 대한 클래스 소스 파일은 Actor.h 이다.

각 게임플레이 클래스 소스 파일 위에는, 클레스에 대해 제너레이티드 헤더 파일을 포함시켜 줘야 한다. 즉, ClassName.h 상단에, 다음과 같은 줄이 와야 한다.

#include "ClassName.generated.h"

생성자 스태틱 및 헬퍼

좀 더 복잡한 데이터 유형, 특히나 클래스 레퍼런스, 이름, 애셋 레퍼런스 값을 설정하는 데는, 생성자의 ConstructorStatics 구조체가 필요한 여러가지 프로퍼티 값을 담을 수 있도록 정의하고 인스턴싱하는 것이 필요하다. 이 ConstructorStatics 구조체는 생성자가 처음 실행될 때만 만들어진다. 그 이후의 실행시에는 그냥 포인터만 복사하므로 매우 빠르다. ConstructorStatics 구조체 생성시 구조체 멤버에 값이 할당되어, 나중에 생성자에서 실제 프로퍼티 자체에 값을 할당할 때 접근할 수 있다.

ContructorHelpers 는 ObjectBase.h 에 정의되는 특수한 네임스페이스로, 생성자 전용 흔한 동작을 수행하는 데 사용하는 헬퍼 템플릿이 들어 있다. 예를 들어, 애셋이나 클래스로의 레퍼런스 검색은 물론 컴포넌트 생성 및 검색용 헬퍼 템플릿이 있다.

애셋 레퍼런스

이상적으로 클래스의 애셋 레퍼런스는 존재하지 않는다. 하드코딩된 애셋 레퍼런스는 취약해서, 애셋 프로퍼티의 환경설정에는 블루프린트를 사용하는 쪽이 선호되는 방식이다.

ConstructorHelpers::FobjectFinderStaticLoadObject 를 사용해서 지정된 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();
profile
언젠간 전문가가 되겠지

1개의 댓글

comment-user-thumbnail
2023년 7월 31일

잘 봤습니다. 좋은 글 감사합니다.

답글 달기