🎮Unreal4/C++_Plugin

[UE4] Weapon 플러그인 만들기, 팩토리(UFactory), ContextMenu 만들기 (FAssetTypeAction_Base, IAssetTools)

공대 컴린이 2023. 4. 26. 20:07
728x90

📦 팩토리(Factory)

무언가를 생성하는 디자인 패턴을 팩토리(Factory)라고 한다.

이러한 팩토리를 이용하여 편리하게 무기와 공격, 장착같은 DataAsset을 생성할 수 있는 플러그인 모듈을 제작해보았다.

 

Factory 클래스를 상속받는 WeaponAssetFactory 클래스를 생성하였다.

 

FactoryCreateNew 함수는 새로운 Factory를 만들어 UObject로 반환해주는 함수로, Factory 클래스의 가상함수를 오버라이드하였다.

 

SupportedClassFactory를 통해 생성하고자 하는 클래스를 지정한다.

 

FactoryCreateNew 함수에서는 NewObject로 CWeaponAsset 클래스를 동적할당으로 생성하여 전달한다.

New Object로 생성하기 때문에 바로 파일로 저장되는 것이 아니라 임시객체로 만들어진다.

 

이렇게 팩토리 클래스를 생성하면 팩토리를 통해 WeaponAsset을 생성할 수 있도록 구현한것이다.

📱 ContextMenu

이후에는 오른쪽 마우스 버튼을 눌렀을 때 나오는 메뉴들인 Context Menu들에 커스텀 카테고리를 추가하여 팩토리로 WeaponAsset을 추가할 수 있도록 만들어보았다.

 

FAssetTypeAction_Base를 상속받는 WeaponContextMenu 클래스를 생성하였다.

 

ContextMenu의 생성자에는 ContextMenu에 표시될 카테고리의 Type을 전달해주었고,

OpenAssetEditor 함수는 에디터를 열 때 커스터마이징하여 편리한 형태로 만들 수 있는 기능을 제공한다. ( 이 내용은 다음 게시글에서 정리할 것이다)

 

상속받은 FAssetTypeAction_Base 클래스는 또한 IAssetTypeAction 인터페이스를 상속받고, 인터페이스에 존재하는 순수가상함수들(GetName, GetSupportedClass, GetTypeColor, GetCategories)을 오버라이드해주었다.

 

ContextMenu의 Category는 위 사진의 기타, 머티리얼&텍스처, 미디어,,등등의 카테고리 목록을 나타내고, GetName 함수에서 말하는 Name은 구조체, 블루프린트 매크로 라이브러리, 블루프린트 인터페이스와 같은 카테고래 내용의 이름을 말한다.

GetTypeColor는 에디터의 클래스 아이콘의 고유 색상을 의미한다.

🔌 플러그인

기본 모드로 Weapon 이라는 이름의 플러그인을 새로 생성한 뒤, 

 

만들어놓은 ContextMenu를 변수로 선언하고, 추가해주었다.

 

StartupModule 함수에서 FModuleManager의 LoadModuleChked 함수를 통해 FAssetToolsModule 클래스인 AssetTools 모듈을 받아오고, IAssetTools 변수로 저장하여 Register 함수를 사용하였다.

이때 AssetTools 모듈은 컨텐츠 브라우저 모듈이다.

 

Content Browser (콘텐츠 브라우저)는 언리얼 에디터 안에서 콘텐츠 애셋을 만들고, 임포트하고, 정리하고, 확인하고, 변경할 때 주로 사용되는 영역

 

IAssetTools 클래스의 RegisterAdvancedAssetCategory 함수를 사용하면 ContextMenu에 추가할 카테고리(EAssetTypeCategory)를 생성할 수 있고, RegisterAssetTypeActions 함수를 사용하면 새로운 ContextMenu에 새로운 목록을 추가할 수 있다.

 

RegisterAdvancedAssetCategory 의 첫번째 매개변수 "WeaponAsset"은 엔진에서의 Key값이고, 두번째 매개변수가 카테고리 목록에 나타날 이름("Weapon")이다.

 

내용이 살짝 복잡한 듯 하지만 정리해보자면 아래와 같다.

1. 컨텐츠 브라우저 모듈("AssetTools")을 불러와 Action을 등록한다.
2. 이때 Action의 종류는  EAssetTypeCategories 가 결정한다.
3. EAssetTypeCategories 의 Type으로 FAssetTypeActions_Base 라는 액션을 생성한 뒤, 카테고리를 하나 등록하라는 액션을 준 것이다.
4. 이때 등록하려는 카테고리 객체를 FWeaponContextMenu로 넘겨준다.

 

컴파일 후 프로그램을 실행시키면 마우스 오른쪽 버튼을 눌렀을 때 Weapon이라는 카테고리가 생성되고, 카테고리 목록에 DataAsset이라는 속성이 추가되어있는 것을 확인할 수 있었다.

 


참조

https://docs.unrealengine.com/4.27/ko/Basics/ContentBrowser/

 

콘텐츠 브라우저

패키지 파일 관리는 물론 애셋을 정리하고 생성하여 유용한 작업을 하기도 하는 툴입니다.

docs.unrealengine.com

728x90