목차

     

     


     

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