초보 코린이의 성장 일지

UE4 Weapon Plugin 본문

언리얼

UE4 Weapon Plugin

코오린이 2023. 5. 26. 18:01

Weapon을 생성 및 기능들을 관리까지 할 수 있는 하나의 계층인 플러그인을 만들어 볼 것이다.

1. Weapon.Bulld.cs에 추가를 해주고 작업을 진행한다.


1. 에디터 안에서 마우스 우클릭을 누르면, 생성할 수 있는 기능들이 모여져있다.

2. 이안에 메뉴를 한개 추가하는 작업을 진행할 것이다.

 

언리얼에서는 모든 에셋을 생성할 때는 팩토리패턴을 사용하기 때문에 팩토리를 상속받아서 만들어줘야한다.

 


 

1. 플러그인이지만 에디터안에서 통신을 해야하므로 직렬화를 시켜줘야한다.2

2. 최상의 부모인 Factory를 선택.

3. 클래스를 생성해 준다.

 

1. 상위 헤더로 들어가서 기능을 살펴보며 사용할 함수를 override해서 가져올 것이다.

2. 파일을 읽어들여서 에셋을 직접 생성하는 가상 함수를 선택. 

 

1. 만들어지게 될 Class Type가 WeaponAsset이기 때문에 게임쪽 프로젝트 이므로, Build.cs로 가서 추가해준다.

2. Add ("U2212_06") 추가

 

더보기
#pragma once

#include "CoreMinimal.h"
#include "Factories/Factory.h"
#include "WeaponAssetFactory.generated.h"

UCLASS()
class WEAPON_API UWeaponAssetFactory : public UFactory
{
	GENERATED_BODY()

public:
	UWeaponAssetFactory();

	virtual UObject* FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn, FName CallingContext) override;
};
#include "WeaponAssetFactory.h"
#include "Weapons/CWeaponAsset.h"

UWeaponAssetFactory::UWeaponAssetFactory()
{
	bCreateNew = true; // true를 해줘야 생성, 새로 추가해주기.

	SupportedClass = UCWeaponAsset::StaticClass(); // 클래스 지정

}

UObject* UWeaponAssetFactory::FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn, FName CallingContext)
{
	// 객체 생성 return
	return NewObject<UCWeaponAsset>(InParent, InClass, InName, Flags);
}

1. 클래스를 지정해주고, 생성해준다.


1. 컴파일을 해보면 모듈 오류가 뜬다.

2. 모듈 정의가 안되어있으므로, 넣어주면된다.


1. 에디터안에 생성되어 있는 메뉴들이 전부 FAssetTypeAction로 부터 상속되어 구현된 것이다.

2. 이 메뉴들을 ContextMenu라고 부른다.

1. 위에 언급한 ContextMenu로 클래스를 생성해준다.

더보기
#pragma once

#include "CoreMinimal.h"
#include "AssetTypeActions_Base.h"
#include "AssetTypeCategories.h"

class WEAPON_API FWeaponContextMenu
	// 에디터 메뉴 부모헤더, Base가 붙으면 이걸 Base로 선택해서 구현하라는 의미
	: 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;

};
#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
{
	// 어떤 Class를 생성할지, Factory가 동작하게 만들어준다..
	return UCWeaponAsset::StaticClass();
}

FColor FWeaponContextMenu::GetTypeColor() const
{
	// 자료형마다 색상을 나타낸다.
	return FColor::Blue;
}

uint32 FWeaponContextMenu::GetCategories()
{
	// 소속될 카테고리
	return Category;
}

1. 에디터 카테고리에 등록하기 위한 세팅.


카테고리 이름이 원래 에디터상에 있는 이름과 중복된다면 그 안으로 생성이 되고, 존재하지 않으면 정해진 이름으로 생성되어 카테고리 안으로 들어가게된다.

더보기
#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;

};
#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

1. 카테고리 생성 및 이름 지정.

2. 메뉴안에 들어갈 수 있도록 등록해준다.

1. 에디터 카테고리에 등록한 메뉴 생성.

2. 클릭하면 생성되며, 기존에 만들어 놓은 DA_Sword와 새로만들어준 DA 색상도 지정해준 Blue로 변화

3. 생성해 놓은 DA를 클릭해보면 원래 사용하던 Asset 기능들을 설정할 수 있게 된다.


 1. 에티더 상단에 버튼을 추가해주기 위해 사전작업을해 줄 것이다.

 

1. 에디터안에 사용하고 있는 버튼 Icon들은 전부 Engine 폴던 안에 Slate에 있다.

 

1. Style 클래스를 생성해준다.

더보기
#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;
};
#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));
}

1. Style 설정

2. 메뉴바에 들어갈 아이콘 설정 및 이름


사전 작업이 끝이났으므로, 다음에 메뉴바에 버튼을 만들게 될 것이다.

'언리얼' 카테고리의 다른 글

UE4 Weapon Plugin (3)  (0) 2023.05.31
UE4 Weapon Plugin (2)  (0) 2023.05.30
UE4 Fist, Camera Shake  (0) 2023.05.11
UE4 Hit Effect, Status Component, Hammer  (2) 2023.05.10
UE4 HitData, Effect, Sound, HitStop  (0) 2023.05.09
Comments