[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
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 -
[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