언리얼 개발/이것저것 테스트

[UE_5] 모듈 제작 -6.1(Custom Editor Tab)

WhNi 2024. 4. 22. 23:06

저번에 만들었던 Custom 메뉴 Extension 에서 이번에는 Custom Tab을 새로 열어볼 예정이다. 

 

ContentBrowser에서 특정 메뉴 Extension을 통해서 새로운 Tab을 열려면

 

void FSuperManagerModule::RegisterAdvanceDeletionTab()
{
	//Tab 매니저를 호출해서 새로운 탭을 등록하고
	FGlobalTabmanager::Get()->RegisterNomadTabSpawner(FName("AdvanceDeletion"),
    // 마찬가지로 델리게이트를 통해서 연결을 시킨다. 
	FOnSpawnTab::CreateRaw(this, &FSuperManagerModule::OnSpawnAdvanceDeletionTab)).SetDisplayName(FText::FromString(TEXT("AdvanceDeletion")));
}

// FOnSpawnTab을 들어가면 델리게이트에 필요한 매개변수 데이터형을 파악할 수 있고,
TSharedRef<SDockTab> FSuperManagerModule::OnSpawnAdvanceDeletionTab(const FSpawnTabArgs& args)
{
	//이를 통해 적합한 데이터형을 반환하는 함수를 생성한다.
    // ETabRole은 탭이 어떤 기능을 하는지 보여주는 타입인데 아무것도 없는 탭을 일단 꺼내보자
	return SNew(SDockTab).TabRole(ETabRole::NomadTab);
}

https://docs.unrealengine.com/4.27/en-US/API/Runtime/Slate/Widgets/Docking/ETabRole/

 

ETabRole

How will this tab be used.

docs.unrealengine.com

 

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/Slate/InGameUI/

 

게임내 슬레이트 사용하기

게임내 유저 인터페이스에 Slate UI 위젯 사용하기 입니다.

docs.unrealengine.com

 

Slate Widget이라는  클래스를 만들고,

 

 

//Widget을 만드는 기본적인 header 인거 같다.
#include "Widgets/SCompoundWidget.h"

// 원래 있던 내용들 다 지우고 여기있는 것들로 기본 구성을 한다.
class SAdvanceDeletionTab : public SCompoundWidget
{
	//slate의 생성자 느낌이다.
	SLATE_BEGIN_ARGS(SAdvanceDeletionTab){}
	
	SLATE_ARGUMENT(FString,TestString)
	
	SLATE_END_ARGS()

public:

	void Construct(const FArguments& InArgs);
};

 

void SAdvanceDeletionTab::Construct(const FArguments& InArgs)
{
	//Can the widget ever support keyboard focus 이라는 언리얼 공식 문서의 설명이다.
    // 말하자면, 키보드의 입력을 받는다의 기능을 하는 코드이다. 
	bCanSupportFocus = true;
    	//  생성자에서 자식 slot에 있는 기능을 실행시키고,(_TestString의 string화)
    	ChildSlot
		[
			SNew(STextBlock).Text(FText::FromString(InArgs._TestString))
		];
}

 

https://docs.unrealengine.com/4.26/en-US/API/Runtime/SlateCore/Widgets/SWidget/

 

SWidget

Abstract base class for Slate widgets.

docs.unrealengine.com

 

 

TSharedRef<SDockTab> FSuperManagerModule::OnSpawnAdvanceDeletionTab(const FSpawnTabArgs& args)
{
	return SNew(SDockTab).TabRole(ETabRole::NomadTab)
    // []은 하나의 슬롯이라고 보면 된다.
    // SAdvanceDeletionTab의 기능을 실행시킨다.
	[
		SNew(SAdvanceDeletionTab).TestString(TEXT("Data Passing Test"))
	];
}

앞서  SLATE_ARGUMENT(FString,TestString) 의 기능을 생성하고, 생성된 슬롯에

SAdvanceDeletionTab 위젯 클래스를 넣고 원하는 출력 데이터를 넣는다. 

 

그러면 새로운 Tab에 출력 데이터가 나오게 된다.

 

 

 

어찌보면  UI 위젯을 코드로 작성하는 방법이다. 

 

void SAdvanceDeletionTab::Construct(const FArguments& InArgs)
{
	bCanSupportFocus = true;
	
	FSlateFontInfo TitleTextFont = FCoreStyle::Get().GetFontStyle(FName("EmbossedText"));
	TitleTextFont.Size = 30;
	ChildSlot
	[
		//SNew(STextBlock).Text(FText::FromString(InArgs._TestString))
		
		//Create Main verticalBox
		SNew(SVerticalBox)
			//First vertical slot for title text
		+SVerticalBox::Slot().AutoHeight()
		[
			SNew(STextBlock)
			.Text(FText::FromString(TEXT("Advance Deletion")))
			.Font(TitleTextFont)
			.Justification(ETextJustify::Center)
			.ColorAndOpacity(FColor::White)
		]
	];
}

이런식으로 자세히 보면 실제 위젯의 기능들을 전부 다 가지고 있고, 별도의 문법으로 설정이 전부 가능하다.

여기서 설정이 가능한것들이 코드로도 가능하다는 뜻이다.

심지어 Widget이랑 섞어서도 만들 수 있기에 더욱 용이할거 같다.  

 

나머지는 다음시간에 이어서 작성해보도록 하겠다.