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 에 위치해있다.

에셋 생성(버튼)들은 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));
}