[UE] Weapon Plugin 1: Slate UI Plugin 만들기

목차
Plugins |
||||
Weapon |
||||
Resource |
||||
Icon128.png weapon_thumbnail_icon.png |
||||
Source |
||||
Weapon | ||||
Weapon.Build.cs 생성 WeaponAssetFactory.h .cpp 생성 WeaponContextMenu.h .cpp 생성 WeaponModule.h .cpp 생성 WeaponStyle.h .cpp 생성 |
||||
Source | ||
U2212_06 | ||
Characters | ||
CAnimInstance.h .cpp CEnemy.h .cpp CPlayer.h .cpp ICharacter.h .cpp |
||
Components | ||
CMontagesComponent.h .cpp CMovementComponent.h .cpp CStateComponent.h .cpp CWeaponComponent.h .cpp |
||
Notifies | ||
CAnimNotifyState_BeginAction.h .cpp CAnimNotify_CameraShake.h .cpp CAnimNotifyState_EndAction.h .cpp CAnimNotify_EndState.h .cpp CAnimNotifyState_Collision.h .cpp CAnimNotifyState_Combo.h .cpp CAnimNotifyState_Equip.h .cpp |
||
Utilities | ||
CHelper.h CLog.h .cpp |
||
Weapons | ||
CDoAction_Combo.h .cpp CAttachment.h .cpp CDoAction.h .cpp CEquipment.h .cpp CWeaponAsset.h .cpp CWeaponStructures.h .cpp |
||
Global.h CGameMode.h .cpp .Build.cs |
||
.uproject | ||
DX 개발
Core Engine | Common | - Project |
Model | - Game | |
- Material Editor |
Unreal 구조
sln | |
Unreal | Game |
↑ Weapon |
|
Item |
Weapon 플러그인 만들기
Plugin 생성 - Weapon
편집 - 플러그인 - 새 플러그인 - 기본 - Weapon 플러그인 생성



Plugins\Weapon\Resources에 썸네일(Thumbnail)로 사용할 이미지를 넣어준다.

※ 참고



에셋 생성(버튼)들은 FAssetTypeAction으로부터 상속받아 구현되었다.
Editor에 관련된 모든 UI 버튼은
C:\Program Files\Epic Games\UE_4.26\Engine\Content\Editor\Slate
에 위치해있다.
Weapon.Build.cs 생성
Weapon.Build.cs
using UnrealBuildTool; public class Weapon : ModuleRules { public Weapon(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; PrivateIncludePaths.Add(ModuleDirectory); PublicDependencyModuleNames.Add("Core"); PrivateDependencyModuleNames.Add("U2212_06");//프로젝트명 PrivateDependencyModuleNames.Add("CoreUObject"); PrivateDependencyModuleNames.Add("Engine"); PrivateDependencyModuleNames.Add("Slate"); PrivateDependencyModuleNames.Add("SlateCore"); PrivateDependencyModuleNames.Add("UnrealEd");//UFactory } }
WeaponModule
새 C++ 클래스 - - WeaponModule 생성
WeaponModule.h
#pragma once #include "CoreMinimal.h" #include "Modules/ModuleManager.h" class FWeaponModule : public IModuleInterface { public: virtual void StartupModule() override; virtual void ShutdownModule() override; private: TSharedPtr<class FWeaponContextMenu> ContextMenu;//언리얼 내 우클릭 대분류목록 };
- TSharedPtr<class FWeaponContextMenu> ContextMenu;
- 언리얼 내 우클릭 대분류목록
WeaponModule.cpp
#include "WeaponModule.h" #include "WeaponContextMenu.h" #include "IAssetTools.h" #include "AssetToolsModule.h" #define LOCTEXT_NAMESPACE "FWeaponModule" IMPLEMENT_MODULE(FWeaponModule, Weapon) void FWeaponModule::StartupModule() { IAssetTools& assetTools = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools").Get(); EAssetTypeCategories::Type categories = assetTools.RegisterAdvancedAssetCategory("WeaponAsset", FText::FromString("Weapon"));// ContextMenu = MakeShareable(new FWeaponContextMenu(categories)); assetTools.RegisterAssetTypeActions(ContextMenu.ToSharedRef()); } void FWeaponModule::ShutdownModule() { if (ContextMenu.IsValid()) ContextMenu.Reset(); } #undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE를 위에 올려놓는 이유는?
- 플러그인 여러개 작업하면 헷깔릴 수 있기 때문에 맨 위에 올려놓고 작업하는게 편하다.
※ 주의!!
IMPLEMENT_MODULE(모듈의 타입, 모듈 이름)
- ex. IMPLEMENT_MODULE(FWeaponModule, Weapon)
- 모듈 이름은 임의로 정하는게 아니라 uplugin에 있는 Name으로 지정해줘야 한다.

IMPLEMENT_MODULE 이란?
IMPLEMENT_MODULE은 모듈을 C++ 클래스로 구현하는 매크로다. 이 매크로는 모듈의 시작과 종료를 관리하고, 모듈의 이름과 타입을 정의한다.
#include "ModuleTestModule.h" IMPLEMENT_MODULE(FModuleTestModule, ModuleTest) void FModuleTestModule::StartupModule() { // 모듈이 시작될 때 실행할 코드 } void FModuleTestModule::ShutdownModule() { // 모듈이 종료될 때 실행할 코드 }
Unreal Engine Modules | Unreal Engine 4.27 Documentation
Unreal Engine Modules
Modules are the building blocks of Unreal Engine's software architecture. You can organize your code into modules to create more efficient and maintainable projects.
docs.unrealengine.com
WeaponAssetFactory 생성
언리얼에서는 모든 에셋을 생성할 때 Factory Pattern을 사용한다(=Factory 클래스에서 상속받아 구현한다).
새 C++ 클래스 - Factory - WeaponAssetFactory 생성

WeaponAssetFactory.h
#pragma once #include "CoreMinimal.h" #include "Factories/Factory.h" #include "WeaponAssetFactory.generated.h" UCLASS() class WEAPON_API UWeaponAssetFactory : public UFactory { GENERATED_BODY() public: UWeaponAssetFactory(); //FactoryCreateFile 파일을 읽어들여 에셋을 직접 생성할 때 사용한다. //FactorCreateNew는 새로 에셋을 생성할 때 사용한다. UObject* FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn, FName CallingContext) override; };
WeaponAssetFactory.cpp
#include "WeaponAssetFactory.h" #include "Weapons/CWeaponAsset.h" UWeaponAssetFactory::UWeaponAssetFactory() { bCreateNew = true;//없으면 터질 수 있다. //Factory.h의 SupportedClass 사용. //Q.어떤 클래스 타입에 대한 factory냐? A.WeaponAsset의 StaticClass다. SupportedClass = UCWeaponAsset::StaticClass(); } UObject* UWeaponAssetFactory::FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn, FName CallingContext) { UCWeaponAsset* asset = NewObject<UCWeaponAsset>(InParent, InClass, InName, Flags); return nullptr; }
WeaponContextMenu
새 C++ 클래스 - 없음 - WeaponContextMenu 생성
WeaponContextMenu.h
#pragma once #include "CoreMinimal.h" #include "AssetTypeActions_Base.h" #include "AssetTypeCategories.h" //_Base 붙는것은 Abstract 지칭하는 네이밍컨벤션 class WEAPON_API FWeaponContextMenu : public FAssetTypeActions_Base { public: FWeaponContextMenu(EAssetTypeCategories::Type InCategory); public: virtual FText GetName() const override; virtual UClass* GetSupportedClass() const override; virtual FColor GetTypeColor() const override; uint32 GetCategories() override; private: EAssetTypeCategories::Type Category; };
_Base 붙는것은 Abstract 지칭하는 네이밍컨벤션
WeaponContextMenu.cpp
#include "WeaponContextMenu.h" #include "Weapons/CWeaponAsset.h" FWeaponContextMenu::FWeaponContextMenu(EAssetTypeCategories::Type InCategory) { Category = InCategory; } FText FWeaponContextMenu::GetName() const { return FText::FromString("DataAsset"); } UClass* FWeaponContextMenu::GetSupportedClass() const { return UCWeaponAsset::StaticClass();//factory가 동작할 클래스로 리턴. } FColor FWeaponContextMenu::GetTypeColor() const { return FColor::Blue; } uint32 FWeaponContextMenu::GetCategories() { return Category;//만든 것이 소속될 (우클릭해서 나오는)카테고리를 리턴. }
WeaponStyle
새 C++ 클래스 - 없음 - WeaponStyle 생성
WeaponStyle.h
#pragma once #include "CoreMinimal.h" class WEAPON_API FWeaponStyle { public: static TSharedRef<FWeaponStyle> Get(); static void Shutdown(); private: static TSharedPtr<FWeaponStyle> Instance; public: FWeaponStyle(); ~FWeaponStyle(); private: void RegisterIcon(const FString& InName, const FString& InPath, const FVector2D& InIconSize, FSlateIcon& OutSlateIcon); private: static const FName StyleSetName; private: TSharedPtr<class FSlateStyleSet> StyleSet; public: FSlateIcon ToolBar_Icon; };
WeaponStyle.cpp
#include "WeaponStyle.h" #include "Styling/SlateStyle.h" #include "Styling/SlateStyleRegistry.h" const FName FWeaponStyle::StyleSetName = "WeaponStyle"; TSharedPtr<FWeaponStyle> FWeaponStyle::Instance = nullptr; TSharedRef<FWeaponStyle> FWeaponStyle::Get() { if (Instance == nullptr) Instance = MakeShareable(new FWeaponStyle()); return Instance.ToSharedRef(); } void FWeaponStyle::Shutdown() { if (Instance.IsValid()) Instance.Reset(); } FWeaponStyle::FWeaponStyle() { StyleSet = MakeShareable(new FSlateStyleSet(StyleSetName)); FString path = ""; path = FPaths::ProjectPluginsDir() / "Weapon" / "Resources"; RegisterIcon("ToolBar_Icon", path / "weapon_thumnail_icon.png", FVector2D(40, 40), ToolBar_Icon); FSlateStyleRegistry::RegisterSlateStyle(*StyleSet.Get()); } FWeaponStyle::~FWeaponStyle() { if (StyleSet.IsValid() == false) return; FSlateStyleRegistry::UnRegisterSlateStyle(StyleSetName); StyleSet.Reset(); } void FWeaponStyle::RegisterIcon(const FString& InName, const FString& InPath, const FVector2D& InIconSize, FSlateIcon& OutSlateIcon) { FSlateImageBrush* brush = new FSlateImageBrush(InPath, InIconSize); FString name = StyleSetName.ToString() + "." + InName; StyleSet->Set(FName(name), brush); OutSlateIcon = FSlateIcon(FName(StyleSetName), FName(name)); }
'⭐ Unreal Engine > UE Plugin - Slate UI' 카테고리의 다른 글
[UE] Weapon Plugin 6: 체크박스 만들기 (0) | 2023.06.08 |
---|---|
[UE] Weapon Plugin 5: 창 내부 Header, Child 구분하기 (0) | 2023.06.07 |
[UE] Weapon Plugin 4: 창 내에 데이터 넣어주기, 검색 기능 넣기 (0) | 2023.06.01 |
[UE] Weapon Plugin 3: 창 내부 영역 구분하기(SWeaponLeftArea, WeaponAssetEditor) (0) | 2023.05.31 |
[UE] Weapon Plugin 2: 버튼 만들기, 창 띄우기 (0) | 2023.05.30 |
댓글
이 글 공유하기
다른 글
-
[UE] Weapon Plugin 5: 창 내부 Header, Child 구분하기
[UE] Weapon Plugin 5: 창 내부 Header, Child 구분하기
2023.06.07목차 Plugins Weapon Resource Icon128.pngweapon_thumbnail_icon.png Source Weapon SWeaponDetailsView.h .cpp 생성SWeaponEquipmentData.h .cpp 생성SWeaponLeftArea.h .cppWeapon.Build.csWeaponAssetEditor.h .cppWeaponAssetFactory.h .cppWeaponCommand.h .cpp WeaponContextMenu.h .cppWeaponModule.h .cppWeaponStyle.h .cpp Weapon Plugin 5 WeaponAssetEditor WeaponAssetEditor.h더보기#pragma … -
[UE] Weapon Plugin 4: 창 내에 데이터 넣어주기, 검색 기능 넣기
[UE] Weapon Plugin 4: 창 내에 데이터 넣어주기, 검색 기능 넣기
2023.06.01 -
[UE] Weapon Plugin 3: 창 내부 영역 구분하기(SWeaponLeftArea, WeaponAssetEditor)
[UE] Weapon Plugin 3: 창 내부 영역 구분하기(SWeaponLeftArea, WeaponAssetEditor)
2023.05.31 -
[UE] Weapon Plugin 2: 버튼 만들기, 창 띄우기
[UE] Weapon Plugin 2: 버튼 만들기, 창 띄우기
2023.05.30
댓글을 사용할 수 없습니다.