게임 개발/Unreal Engine

[UE4] Custom Asset Type 구현 - Asset 구현 & 등록

지노윈 2022. 2. 1. 21:03
반응형

이 글이전에 Plugin 모듈을 먼저 만들어야 하며 다음 글을 참고해 주세요.

[게임 개발/Unreal Engine] - [UE4] Asset Type추가 - Plugin 모듈 만들기

 

커스텀 어셋 만들기

먼저 UObject를 상속받아 자신의 커스텀 어셋을 만듭니다.

<MyCustomAsset.h 파일>

#pragma once

#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "MyCustomAsset.generated.h"

UCLASS()
class TESTPLUGIN_API UMyCustomAsset : public UObject
{
	GENERATED_UCLASS_BODY()

	UPROPERTY(EditAnywhere)
	int32 Value;
	UPROPERTY(EditAnywhere)
	FName Name;
};

<MyCustomAsset.cpp 파일>

#include "MyCustomAsset.h"

UMyCustomAsset::UMyCustomAsset(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
{}

다음과 같이 MyCustomAsset을 확인 할 수 있으며 아직은 Asset Type으로서 에셋을 만들 수 없습니다.

 

Asset Factory 구현하기

이를 위해서 AssetFactory를 구현해 주어야 합니다.

Factory 패턴은 인스턴스 생성 방법을 정의하여 유연하게 클래스 정의가 가능하도록 하는 디자인 패턴 기법입니다.

 

[프로그래밍 일반/디자인 패턴] - 팩토리 패턴(Factory pattern)

 

팩토리 패턴(Factory pattern)

객체 생성을 대리하여 처리하는 것을 통칭하는 관용어로 팩토리라 부릅니다. 이것을 팩토리 패턴으로 부르는 사람도 있지만 엄밀히는 아닙니다. 팩터리는 두 가지중 하나입니다. 객체를 어떻게

devjino.tistory.com

 

UFactor를 부모로 하여 MyCustomAssetFactory 클래스를 Editor 모듈에 생성합니다.

<MyCustomAssetFactory.h>

#pragma once

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

UCLASS()
class TESTPLUGINEDITOR_API UMyCustomAssetFactory : public UFactory
{
	GENERATED_UCLASS_BODY()

	virtual UObject* FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName, 
		EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override;
	virtual bool ShouldShowInNewMenu() const override;
};

 

<MyCustomAssetFactory.cpp>

#include "MyCustomAssetFactory.h"
#include "MyCustomAsset.h"

UMyCustomAssetFactory::UMyCustomAssetFactory(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
{
	SupportedClass = UMyCustomAsset::StaticClass();
	bCreateNew = true;
	bEditAfterNew = true;
}

UObject* UMyCustomAssetFactory::FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName,
	EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn)
{
	return NewObject<UMyCustomAsset>(InParent, InClass, InName, Flags);	
}

bool UMyCustomAssetFactory::ShouldShowInNewMenu() const
{
	return true;
}

SupportedClass에 이전에 만들었던 UMyCustomAsset 클래스를 할당합니다.

FactoryCreateNew 함수를 재정의하여 UMyCustomAsset 클래스를 생성하여 반환하도록 합니다.

ShouldShowInNewMenu 함수를 재정의하여 에셋 추가 메뉴에 보이도록 합니다.

 

Asset Type Actions 구현

이제 Asset Type Actions 구현합니다.

FAssetTypeActions_Base를 부모로 하여 구현하며 에디터에서 에셋이 생성될 때의 구동을 구체적으로 정의 할 수 있습니다. 인스턴스 아이콘, 색상, 자산 유형 카테고리 등을 지정할 수 있습니다.

 

<MyCustomAssetActions.h>

#pragma once

#include "AssetTypeActions_Base.h"

class FMyCustomAssetActions : public FAssetTypeActions_Base
{
public:

    virtual FText GetName() const override;
    virtual UClass* GetSupportedClass() const override;
    virtual uint32 GetCategories() override;
    virtual FColor GetTypeColor() const override;
};

<MyCustomAssetActions.cpp>

#include "MyCustomAssetActions.h"
#include "MyCustomAsset.h"

FText FMyCustomAssetActions::GetName() const
{
    return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_TestPlugin", "My Custom Asset");
}

UClass* FMyCustomAssetActions::GetSupportedClass() const
{
    return UMyCustomAsset::StaticClass();
}

uint32 FMyCustomAssetActions::GetCategories()
{
    return EAssetTypeCategories::Misc;
}

FColor FMyCustomAssetActions::GetTypeColor() const
{
    return FColor::White;
}

 

Asset Type Actions 등록

이제 마지막으로 AssetTools에 FMyCustomAssetActions를 등록합니다.

#include "AssetToolsModule.h"
#include "IAssetTools.h"
#include "MyCustomAssetActions.h"

#define LOCTEXT_NAMESPACE "FTestPluginEditorModule"

void FTestPluginEditorModule::StartupModule()
{
	IAssetTools& AssetTools = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools").Get();
	AssetTools.RegisterAssetTypeActions(MakeShareable(new FMyCustomAssetActions()));
}

void FTestPluginEditorModule::ShutdownModule()
{}

#undef LOCTEXT_NAMESPACE
	
IMPLEMENT_MODULE(FTestPluginEditorModule, TestPluginEditor)

최종적으로 다음과 같이 Miscellaneous 메뉴의 My Custom Asset을 선택하여 자신의 어셋을 생성 할 수 있습니다.

(Advanced) Asset Category 추가하기

MyCustomAssetActions.h 파일을 다음과 같이 수정합니다.

#pragma once

#include "AssetTypeActions_Base.h"

class FMyCustomAssetActions : public FAssetTypeActions_Base
{
public:
    FMyCustomAssetActions(EAssetTypeCategories::Type AssetCategory);

    virtual FText GetName() const override;
    virtual UClass* GetSupportedClass() const override;
    virtual uint32 GetCategories() override;
    virtual FColor GetTypeColor() const override;

private:
    EAssetTypeCategories::Type AssetCategory = EAssetTypeCategories::Misc;
};

MyCustomAssetActions.cpp 파일을 다음과 같이 수정합니다.

#include "MyCustomAssetActions.h"
#include "MyCustomAsset.h"

FMyCustomAssetActions::FMyCustomAssetActions(EAssetTypeCategories::Type assetCategory)
	: AssetCategory(assetCategory)
{
}

FText FMyCustomAssetActions::GetName() const
{
    return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_TestPlugin", "My Custom Asset");
}

UClass* FMyCustomAssetActions::GetSupportedClass() const
{
    return UMyCustomAsset::StaticClass();
}

uint32 FMyCustomAssetActions::GetCategories()
{
    return AssetCategory;
}

FColor FMyCustomAssetActions::GetTypeColor() const
{
    return FColor::White;
}

그리고 TestPluginEditor.cpp 파일도 다음과 같이 수정합니다.

// Copyright Epic Games, Inc. All Rights Reserved.

#include "TestPluginEditor.h"

#include "AssetToolsModule.h"
#include "IAssetTools.h"
#include "MyCustomAssetActions.h"

#define LOCTEXT_NAMESPACE "FTestPluginEditorModule"

void FTestPluginEditorModule::StartupModule()
{
	IAssetTools& AssetTools = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools").Get();

	const auto AssetCategory = AssetTools.RegisterAdvancedAssetCategory(
		FName(TEXT("Test Plugin")), LOCTEXT("NewAssetCategory", "Test Plugin"));

	AssetTools.RegisterAssetTypeActions(MakeShareable(new FMyCustomAssetActions(AssetCategory)));
}

void FTestPluginEditorModule::ShutdownModule()
{}

#undef LOCTEXT_NAMESPACE
	
IMPLEMENT_MODULE(FTestPluginEditorModule, TestPluginEditor)

AssetTools.RegisterAdvancedAssetCategory 호출을 하여 새로운 Asset Category를 추가하고 이를 사용하도록 하였습니다.

 

다음과 같이 새로운 카테고리가 추가 된 것을 확인 할 수 있습니다.

 

관련 글 링크

[게임 개발/Unreal Engine] - [UE4] Custom Asset Type 구현 - Plugin 모듈 만들기

[게임 개발/Unreal Engine] - [UE4] C++ Module Generator 소개

[게임 개발/Unreal Engine] - [UE4] Custom Asset Type 구현 - Asset 구현 & 등록

[게임 개발/Unreal Engine] - [UE4] Custom Asset Type 구현 - Import 하기