[UE4] OpenWindow : 창 띄우기 (FAssetEditorToolkit, FTabManager, InitAssetEditor, NewObject<>)
툴바에 Open Window라는 이름의 버튼을 추가하여, 버튼이 눌렸을 때 새로운 Window 창이 열리는 기능을 구현해보았다.
1️⃣ OpenWindow 툴바 버튼 추가
이전에 툴바에 커스텀 버튼을 추가할 때 사용했던 ButtonCommand 클래스와 ExampleStyle 클래스에 Open Window 버튼 객체를 추가하였다.
2️⃣ Window 객체 생성하기 - ExampleMeshWindow : FAssetEditorToolkit
Window 창을 띄우기 위한 클래스 ExampleMeshWindow를 생성하였다.
창의 형태로 클래스를 띄우기 위해선 FAssetEditorToolkit 클래스를 상속받아야 한다.
ExampleMeshWindow 클래스는 싱글톤 형태로 사용할 수 있게 구성하였다.
GetToolkitFName 함수와 같은 FAssetEditorToolkit 부모의 순수가상함수들을 모두 Override 하여 생성해주었다.
OpenWindow 함수는 Instance 객체가 존재하는지를 체크하여 존재한다면 Window 창을 Close하고, 존재하지 않는다면 Window 창을 Open 한다.
🚩 Layout 구성하기
Open 함수에서는 Layout을 구성하여 Window 창을 띄우는 핵심 기능을 구현하였다.
Layout을 구성하는데 필요한 요소들은 FTabManager 클래스의 함수들을 이용하여 생성할 수 있다.
NewLayout 함수로 새로운 레이아웃을 생성하였고, 레이아웃 명을 매개변수로 전달하였다.
이렇게 만들어진 NewLayout 객체에 AddArea 함수로 레이아웃 안에 새로운 공간을 추가하고,
NewPrimaryArea 함수로 Area 공간안에 주 영역을 설정한 뒤 해당 공간안에 들어갈 요소들을 또 추가하면 된다.
SetOrientation 함수로 수직 혹은 수평방향으로 배치할것인지 설정한 뒤,
->Split 명령어로 공간을 나눠주었다.
FTabManager의 NewStack 함수로 요소를 추가할 공간을 만들고, 그안에 SetSizeCoefficient 함수로 배치될 비율을 설정한 뒤, AddTab 함수로 추가할 탭의 속성을 초기화하였다.
NewPrimaryArea 이외의 보조 영역은 NewSplitter 함수로 추가할 수 있다.
이후에 영역들은 똑같이 ->Split 함수로 나누고, NewStack 함수로 분할 영역을 초기화하면 된다.
🚩 InitAssetEditor
Open 함수의 맨 아랫줄을 보면 FAssetEditorToolkit 클래스의 InitAssetEditor 함수를 통해 커스텀 Window 창에 Layout을 적용시켜 초기화할 수 있다.
InitAssetEditor 함수의 매개변수
const EToolkitMode::Type Mode
const TSharedPtr< class IToolkitHost >& InitToolkitHost
const FName AppIdentifier
const TSharedRef<FTabManager::FLayout>& StandaloneDefaultLayout
const bool bCreateDefaultStandaloneMenu
const bool bCreateDefaultToolbar
UObject* ObjectToEdit
const bool bInIsToolbarFocusable
const bool bInUseSmallToolbarIcons
InitAssetEditor 함수의 매개변수로
첫번째는 EToolkitMode 의 Standalone은 독립형 Window 창으로 설정하고, WorldCentric은 소속형 창으로 설정한다.
두번째는 Window 창의 부모를 넘겨주는데, 사용하지 않으므로 기본객체를 생성하여 넘겨주었다.
세번째는 에디터의 명을 전달하고
네번째로 위에 만들어둔 Layout을 전달해준다.
다섯번째는 메뉴가 보일것인지에 대한 bool형이고,
여섯번째는 툴바가 보일것인지에 대한 bool형이다.
마지막으로는 만들어질 Window 창에서 편집할 객체를 전달해준다.
OpenWindow 버튼이 눌렸을 때 실행되는 OnClicked_OpenWindow 함수에서는 현재 선택중인 액터를 전달하여 Window 객체로 만들어둔 ExampleMeshWindow 클래스의 OpenWindow 함수를 실행시킨다.
선택한 액터가 존재한다면 해당 액터를 OpenWindow 함수로 넘겨주고, 존재하지 않는다면 StaticMeshActor를 새롭게 생성하여 OpenWindow 함수로 넘겨주었다.
이때 사용되는 NewObject<AStaticMeshActor>() 함수는 Runtime 에서의 동적할당을 시킬 수 있는 함수이다.
프로그램을 실행시킨 뒤 툴바에 추가한 OpenWindow 버튼을 추가하면 위와같은 Window 창이 띄워지는것을 확인할 수 있었다.