🎮Unreal4/C++_Plugin

[UE4] Editor에 Detail View 추가하기 (IDetailsView, FPropertyEditorModule, FDetailsViewArgs, GetEditingObject, AddEditingObject, Engin Slate 클래스)

공대 컴린이 2023. 5. 1. 21:09
728x90

이전 학습을 통해 만들어놓은 Weapon Asset Editor 창의 왼쪽에 ListView를 배치하고, 오른쪽에는 ListView의 항목을 선택했을 때 해당 DataAsset의 디테일 창이 배치될 수 있도록 Detail View를 추가해보았다.

 

🪄 IDetailsView 객체 생성

FWeaponAssetEditor::Open()

DetailView는 IDetailsView 라는 인터페이스 객체로 선언하여 만들 수 있다.

 

엔진에 존재하는 모든 디테일창은 FPropertyEditorModule 클래스를 이용하여 접근할 수 있다.

 

또한 DetailView를 생성하기에 앞서, DetailView의 기능을 설정할 수 있는 FDetailsViewArgs 구조체를 사용하였다.

나는 네번째 매개변수인 ENameAreaSettings의 설정값을 Actor의 이름으로 뜨는 것이 아닌, Object의 이름으로 띄우게 하기 위해 Args 값을 변경하였다.

 

이후, IDetailsView로 선언해둔 DetailsView 객체에 FPropertyEditorModule의 CreateDetailView 함수를 이용하여 디테일 뷰를 초기화 및 생성해주었다.

🪄 Layout에 Detail Tab 추가

FWeaponAssetEditor::Open()

이후 Layout을 설정할 때도 NewStack 영역을 생성하여 AddTab으로 DetailTab을 추가해주었다.

 

🪄 Detail View에 WeaponAssetData 띄우기

FWeaponAssetEditor::Open

이후 Open함수의 마지막 부분에 Detail View에 나타낼 WeaponAsset을 선택하는 내용을 구현하였다.

 

기본적으로 직접 DataAsset을 클릭하여 열었을때는 해당 WeaponAsset을 DetailView에 띄우고,

ToolBar에 추가해둔 "웨폰" 커스텀 버튼을 클릭하여 WeaponEditor를 열었을때는 ListView의 첫번째 항목을 DetailView에 띄워주었다.

 

탭을 등록하는 RegisterTabSpawners 함수에서도 DetailTab을 할당하는 BindSP 함수를 사용하여 등록해주었다.

 

최종적으로 Spawn_DetailsViewTab 함수를 만들어, Open 함수에서 생성해두었던 DetailsView 객체를 Tab 공간에 추가하여 반환해주었다.

🪄 ListView의 항목과 Detail View의 연동

이후, ListView의 항목을 선택하는것에 따라 해당 DataAsset의 Detail 내용을 DetailView에 출력하기 위한 연동 작업을 수행하였다.

ListView의 항목을 눌렀을 때 호출되는 함수인 OnListViewSelectedItem 함수에 해당 내용을 작성하였다.

 

GetEditingObject 함수어떤 에디터 창을 열어서 현재 편집중인 Object를 반환해준다.

따라서, 현재 편집중인 Object가 존재한다면 RemoveEditingObject 함수를 통해 편집중인 Object를 지우고,

 

AddEditingObject 함수를 통해 현재 선택한 오브젝트(DataAsset)를 에디터의 수정 대상 목록에 추가하는 역할을 수행하였다.

 

이후, DetailView의 SetObject 함수로 현재 선택한 DataAsset을 띄우며 마무리하였다.

 

에디터의 창을 여는 OpenWindow 함수에서는 새로운 DataAsset 클래스를 클릭할 때 이미 열린 창의 데이터와 비교하여 새로운 창을 열 것인지, 그대로 유지할것인지를 구분하여 구현하였다.


컴파일 후 프로그램을 실행시켜보면 WeaponAssetEditor를 열었을때와, DataAsset 파일을 직접 열었을 때 성공적으로 ListView의 항목들과 그에 맞는 DetailView가 출력되는것을 볼 수 있었다.

 

💡 Engin 폴더의 클래스들

- 다양한 Slate 테마들이 존재

Engin->Source->Runtime->SlateCore->Private->Styling

Engin->Source->Runtime->Slate->Private->Framework->Styling

- Slate 클래스

Engin->Source->Editor->PropertyEditor->Private-> S가 접두사로 붙은 클래스


참조

https://docs.unrealengine.com/4.27/en-US/API/Editor/PropertyEditor/FDetailsViewArgs/

 

FDetailsViewArgs

Init params for a details view widget

docs.unrealengine.com

728x90