이것을 찾아보자.

경로는 /Game/PuzzlePlatforms/BP_PlatformTrigger이다.

 

//BPClass인 TriggerPlatform를 C++로 찾아보기
//FClassFinder을 사용한다.
ConstructorHelpers::FClassFinder<APlatformTrigger> PlatformTriggerBPClass(TEXT("/Game/PiuzzlePlatforms/BP_PlatformTrigger"));

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

mPlatformTrigger = PlatformTriggerBPClass.Class;

//문자열을 얻어온다. 포인터이기에 *를 붙어 객체로 넘어가서 GetName()을 한다.
UE_LOG(LogTemp, Warning, TEXT("Found Class %s"), *mPlatformTrigger->GetName());

 

https://docs.unrealengine.com/4.27/en-US/API/Runtime/CoreUObject/UObject/ConstructorHelpers/FClassFinder/

 

FClassFinder

 

docs.unrealengine.com

 

 

C++로 위젯에 엑세스하기위해서는 UMG 모듈을 추가해야한다. (기본적으로 안되어있음)

https://docs.unrealengine.com/4.26/en-US/ProgrammingAndScripting/ProgrammingWithCPP/CPPTutorials/UMG/

 

User Interface With UMG

Create a simple menu system using UMG.

docs.unrealengine.com

 

 

// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;

public class PuzzlePlatforms : ModuleRules
{
	public PuzzlePlatforms(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

																														//UMG를 의존성에 추가한다.
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "UMG" });
	}
}

"UMG" 추가

 

 

설정 후 코드 빌드하고 UE에디터 실행

 

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("게임 인스턴스 생성자 호출"));

	/*
	//BPClass인 TriggerPlatform를 C++로 찾아보기
	//FClassFinder을 사용한다.
	ConstructorHelpers::FClassFinder<APlatformTrigger> PlatformTriggerBPClass(TEXT("/Game/PiuzzlePlatforms/BP_PlatformTrigger"));
	
	//nullptr인지 확인한다.
	//포인터가 저장되는곳은 .Calss이기에 꼭 기억하자
	if (!ensure(PlatformTriggerBPClass.Class != nullptr)) return;

	mPlatformTrigger = PlatformTriggerBPClass.Class;
	
	//문자열을 얻어온다. 포인터이기에 *를 붙어 객체로 넘어가서 GetName()을 한다.
	UE_LOG(LogTemp, Warning, TEXT("Found Class %s"), *mPlatformTrigger->GetName());
	*/

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

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

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

 

메뉴 UI를 Exec함수를 통해 로드를 하고 이를 새로운 레벨의 블루프린트에서 실행하여 자동으로 메뉴가 나오도록 하자.

//GameInstance에서 LoadMenu Exec 함수 생성
UFUNCTION(Exec, BlueprintCallable)
    void LoadMenu();
    
void UPuzzlePlatformsGameInstance::LoadMenu()
{
	//생성자에서 mMenuClass가 할당되지 않을경우 리턴한다. (이전 장에서 다룸)
	if (!ensure(mMenuClass != nullptr)) return;

	//CreateWidget<UUserWidget>함수로 위젯을 생성한다.
	Menu = CreateWidget<UMainMenu>(this, mMenuClass);

	if (!ensure(Menu != nullptr)) return;

	Menu->Setup();

	Menu->SetMenuInterface (this);
}

UFUNTION(Exec, BlueprintCallable) 키워드로 블루프린트에서 실행 가능하게 한다.

 

레벨 블루프린트에서 게임 인스턴스에서 Exec함수를 실행한다.

bonnate