http://egloos.zum.com/sweeper/v/3208657

 

[UE4] ConstructorHelper::FObjectFinder/FClassFinder

1. ConstructorHelper 참고 : 애셋 레퍼런싱의 생성시간 레퍼런싱 이름에서 알 수 있듯이 ConstructorHelper는 UObject의 Constructor(생성자)에서만 사용 가능하다. (즉, CDO 제작에서만 사용된다는 얘기) 아래 FObj

egloos.zum.com

 

헤더
내용

FClassFinder을 이용하여 PlatformTrigger을 찾아보자

#include "PlatformTrigger.h"

GameInstanc의 생성자에서 찾을것이기에 헤더를 포함시킨다. 위 UObject/.... 도 포함시킨다.

레퍼런스를 복사하여 TEXT("ASDF")에 넣어준다.

 

#include "PlatformTrigger.h" // PlatformTrigger을 찾기위해
#include "UObject/ConstructorHelpers.h" //FClassFinder을 사용하기위해

UPuzzlePlatformsGameInstance::UPuzzlePlatformsGameInstance(const FObjectInitializer& ObjectInitializer)
{
	UE_LOG(LogTemp, Warning, TEXT("생성자"));

	//BPClass를 찾는다
	ConstructorHelpers::FClassFinder<APlatformTrigger> PlatformTriggerBPClass(TEXT("/Game/PiuzzlePlatforms/BP_PlatformTrigger"));

	//nullptr인지 확인한다.
	//포인터가 저장되는곳은 .Calss이기에 꼭 기억하자
	if (!ensure(PlatformTriggerBPClass.Class != nullptr)) return;

	//문자열을 얻기 위해서 *을 붙여준다
	UE_LOG(LogTemp, Warning, TEXT("Found Class %s"), *PlatformTriggerBPClass.Class->GetName());
}

*WBP UMG 모듈은 ClassFinder로 찾을 수 없다.

 

Build.cs에서 UMG 추가

프로젝트 재생성을하여 Build.cs 수정사항 적용

 

https://docs.unrealengine.com/4.27/en-US/API/Runtime/UMG/Blueprint/UUserWidget/

 

UUserWidget

The user widget is extensible by users through the WidgetBlueprint.

docs.unrealengine.com

 

#include "Blueprint/UserWidget.h" // ClassFinder가 UUserWidget을 취할 수 있다.

FClassFinder의 리턴타입은 TSubclassOf<T> 이다. 이를 저장하기 위해서는

private:
	TSubclassOf<class UUserWidget> mMenuClass;

TSubClassOf<class UUserWidget>으로 해야함. 헤더파일에는 include가 안되기에 class UUserWidget으로 명시한다.

 

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/TSubclassOf/

 

TSubclassOf

 

docs.unrealengine.com

 

Build.cs에서 UMG없이 빌드할경우

오류남

void UPuzzlePlatformsGameInstance::Init()
{
	UE_LOG(LogTemp, Warning, TEXT("초기화"));

	//문자열을 얻기 위해서 *을 붙여준다
	UE_LOG(LogTemp, Warning, TEXT("Found Class %s"), *mMenuClass->GetName());
}

UPuzzlePlatformsGameInstance::UPuzzlePlatformsGameInstance(const FObjectInitializer& ObjectInitializer)
{
	UE_LOG(LogTemp, Warning, TEXT("생성자"));

	//TriggerPlatform 찾아보기
	////BPClass를 찾는다 
	//ConstructorHelpers::FClassFinder<APlatformTrigger> PlatformTriggerBPClass(TEXT("/Game/PiuzzlePlatforms/BP_PlatformTrigger"));
	//
	////nullptr인지 확인한다.
	////포인터가 저장되는곳은 .Calss이기에 꼭 기억하자
	//if (!ensure(PlatformTriggerBPClass.Class != nullptr)) return;
	//
	////문자열을 얻기 위해서 *을 붙여준다
	//UE_LOG(LogTemp, Warning, TEXT("Found Class %s"), *PlatformTriggerBPClass.Class->GetName());


	//Menuclass찾기
	//BPClass를 찾는다 
	ConstructorHelpers::FClassFinder<UUserWidget> MenuBPClass(TEXT("/Game/MenuSystem/WBP_MainMenu"));

	//nullptr인지 확인한다.
	//포인터가 저장되는곳은 .Calss이기에 꼭 기억하자
	if (!ensure(MenuBPClass.Class != nullptr)) return;

	//필드에 넣어준다. 실제 클래스는 .Class
	mMenuClass = MenuBPClass.Class;
}

bonnate