[Unreal] US_GameMode Class 생성자 코드 분석
US_GameMode.h
#include "CoreMinimal.h"
#include "GameFramework/GameMode.h"
#include "US_GameMode.generated.h"
UCLASS()
class UNREALSHADOWS_LOTL_API AUS_GameMode : public AGameMode
{
GENERATED_BODY()
public:
AUS_GameMode();
};
헤더 파일 다른 문서에 작성한 내용과 중복됨으로 생략 한다.
US_GameMode.cpp
#include "US_GameMode.h"
#include "US_GameState.h"
#include "US_PlayerController.h"
#include "US_Character.h"
#include "UObject/ConstructorHelpers.h"
AUS_GameMode::AUS_GameMode()
{
GameStateClass = AUS_GameState::StaticClass();
PlayerStateClass = AUS_PlayerController::StaticClass();
PlayerControllerClass = AUS_PlayerController::StaticClass();
static ConstructorHelpers::FClassFinder<APawn>
PlayerPawnBPClass(TEXT("/Game/Blueprints/BP_Character"));
if (PlayerPawnBPClass.Class != nullptr)
{
DefaultPawnClass = PlayerPawnBPClass.Class;
}
}
GameModeBase
처음 코드를 작성하면서 놀란점은 GameStateclass, PlayerStateClass, PlayerControllerClass의 변수가 선언없이 작성할 수 있다는 점이다.

이들이 어디서 왔는지 확인해보면 GameModeBase에 존재한다는 것을 알수 있다.
StaticClass()
해당 함수가 어디에서 왔는지 코드에서 확인할려고 하면 찾을 수가 없었다.
[UE] StaticClass
공식 문서를 읽어보면 UClass::StaticClass는 "return a object representing this class at runtime"이라고 합니다. 즉 런타임에 클래스를 나타내는 UClass 객체를 반환 한다고 되어 있습니다. 그럼 UClass객체는 뭔지부
cjbworld.tistory.com
그래서 위의 자료를 보고 알아낸 점은 UCLASS()에서 제공하는 함수임을 알 수 있다. 내용은 좀 어렵다고 느껴졌지만 납득이 되는 이야기였다. 또한 CDO가 언급되는데, 정확하게 파악하기에는 아직 어려움이 많아 내용을 조사해 봤다.
[언리얼] CDO(Class Default Object)
언리얼 c++ CDO(Class Default Object)개념, 목적 정리CDO(Class Defualt Object)는 언리얼 Editor나 빌드된 게임을 실행한 후에 모든 UCLASS들의 생성자를 각각 호출해서 UCLASS마다 1개씩 기본으로 생성되는 기본 인
velog.io
이 내용에서 알아야 할 점은 CDO가 기술적으로 어떻게 되었는가보다는 이것이 필요한 이유를 명확하게 확인하는 것이라 생각된다.
추가적으로 GetClass를 조사하다 알게 되었는데,
언리얼 GetClass 와 StaticClass 의 차이
GetClass vs StaticClass 코드를 짜다보면, 특정 객체의 클래스 정보를 알기 위해 GetClass 혹은 StaticClass 를 쓰는 것을 볼 수 있다. 그런데 이 둘의 차이는 무엇일까? 한 줄 요악 : StaticClass 는 컴파일 타임
koreanfoodie.me
결론적으로 컴파일 타임이냐 런타임이냐의 차이다. 이 점은 게임을 만들 때 매우 중요한 정보라고 생각된다.
ConstructorHelpers
언리얼에서 에셋 정보를 가져오기 위해 사용한다.
ConstructorHelpers + 애셋 로딩 시점관련
CDO를 제작하는 생성자 코드에서 애셋에 관련된 정보를 불러올 때에는 ConstructorHelpers라는 특수한 클래스를 사용합니다. 이 클래스는 애셋 내 가져올 종류에 따라 ObjectFinder와 ClassFInder라는 두 API
kyoun.tistory.com
[UE5.3] ClassFinder와 ObjectFinder 차이
ConstructorHelpers, ClassFinder, ObjectFinder, BlueprintClass, GetObjectType, TypeOf, TObjectPtr, TSubobjectPtr, LoadObject, TSoftObjectPtr
velog.io
위 두 내용을 참고하여 이번에 사용한 코드에서는 애셋 형(Type) 정보를 생성자에서 가져올 때 사용하였다.
결론
GameMode에 UCLASS를 설정하기 위해 또 컴파일 단계에서 가져오기 위해 코드를 사용하였다.