自定义类型插件的创建

除了虚幻4官方为我们提供的几种创建插件的模板类型,我们还可以根据自己的需要来定制化一些插件类型,这里介绍的就是一种自定义资源类型的插件的创建方法。

基本的插件类型

  • Blank:原始的插件,只提供最基础的目录与文件创建,可以是任何内容插件。
  • Content Ony :只能在Content目录的插件,通常是给美术资源之类做的插件。
  • Blueprint Library:蓝图库,如其名,就是一些比较独立蓝图库,封装好给不同游戏用,比如A星寻路算法
  • Editor Toolbar Button:创建一个在编辑器上面的按钮插件,创建在如下图位置。

toolbar

  • Editor Standalone Window:独立窗体,创建一个独立界面的编辑器,通常和Slate搭配使用。
  • Editor Mode:创建一个在下面位置的插件

mark

除了上面的官方自定义的插件类型,我还可以自定义一些其他的类型,我就来介绍一种自定义插件类型

自定义资源类型插件创建过程

要在虚幻4创建一个自定义的编辑器资源类型,其中创建的过程:

  • 声明资源类型的C++类

    虚幻4中有很多的资源类型,例如材质,贴图,蓝图,数据,纹理等,我们可以根据自己的需要继承相对应资源的类

数据类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
UCLASS()
class CUSTOMASSET_API UMyDataAsset : public UDataAsset
{
GENERATED_BODY()

UPROPERTY(EditAnywhere, Category = "MyDataAsset")
FString StrProperty;

UPROPERTY(EditAnywhere, Category = "MyDataAsset")
float NumProperty;

UPROPERTY(EditAnywhere,meta = (DisplayName = "IsActive?"), Category = "MyDataAsset")
bool bIsActive;

};
原始类
1
2
3
4
5
6
7
8
9
UCLASS()
class MYTEST_API UMyObject : public UObject
{
GENERATED_BODY()

public:
UPROPERTY(EditAnywhere)
int A;
};
  • 实现资源创建工厂

    即让用户可以创建这个资源的实例(让它出现在Content Browser)

1
2
3
4
5
6
7
8
9
10
11
UCLASS()
class GENERICGRAPHEDITOR_API UGenericGraphFactory : public UFactory
{
GENERATED_BODY()

public:
UGenericGraphFactory();
virtual ~UGenericGraphFactory();

virtual UObject* FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override;
};

实现两个方法:

  1. 构造函数指定当前工厂类创建的实例是是什么类型
1
2
3
4
5
6
UGenericGraphFactory::UGenericGraphFactory()
{
bCreateNew = true;
bEditAfterNew = true;
SupportedClass = UGenericGraph::StaticClass();
}
  1. 重载工厂类的创建函数
1
2
3
4
UObject* UGenericGraphFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn)
{
return NewObject<UObject>(InParent, Class, Name, Flags | RF_Transactional);
}

创建了工厂类之后,UE4就会自动去识别这个资源类了,但是这个资源类还有很多的细节没有实现。

mark

注意:继承的Factory类是UnrealEd模块的,所以在.cs配置文件要添加UnreaEd模块
  • 绑定资源响应事件

    Asset文件需要绑定一个FAssetTypeActions_ClassTypeBase类, 作为一些基本操作的响应, 例如打开、合并和差异化比较等

创建Actions操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class FAssetTypeActions_GenericGraph : public FAssetTypeActions_Base
{
public:
FAssetTypeActions_GenericGraph(EAssetTypeCategories::Type InAssetCategory);

virtual FText GetName() const override;
virtual FColor GetTypeColor() const override;
virtual UClass* GetSupportedClass() const override;
virtual void OpenAssetEditor(const TArray<UObject*>& InObjects, TSharedPtr<class IToolkitHost> EditWithinLevelEditor = TSharedPtr<IToolkitHost>()) override;
virtual uint32 GetCategories() override;

private:
EAssetTypeCategories::Type MyAssetCategory;
};
//////////////
FText FMyObjectTypeAction::GetName() const
{
return FText::FromString("MyObject");
}

uint32 FMyObjectTypeAction::GetCategories()
{
return MyCustomCategory;
}

FColor FMyObjectTypeAction::GetTypeColor() const
{
return FColor(255, 0, 0, 255);
}

FText FMyObjectTypeAction::GetAssetDescription(const FAssetData& AssetData) const
{
return FText::FromString("MyObjectDes");
}

UClass* FMyObjectTypeAction::GetSupportedClass() const
{
return UMyObject::StaticClass();
注册资源文件进行注册
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* 模块开始时调用 */
void FGenericGraphEditor::StartupModule()
{
// 获取资产管理工具
IAssetTools& AssetTools = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools").Get();
// 初始化一种资源类型
GenericGraphAssetCategoryBit = AssetTools.RegisterAdvancedAssetCategory(FName(TEXT("GenericGraph")), LOCTEXT("GenericGraphAssetCategory", "GenericGraph"));
// 向注册这种资源类型
RegisterAssetTypeAction(AssetTools, MakeShareable(new FAssetTypeActions_GenericGraph(GenericGraphAssetCategoryBit)));
}
// 向资源工具绑定创建事件
void FGenericGraphEditor::RegisterAssetTypeAction(IAssetTools& AssetTools, TSharedRef<IAssetTypeActions> Action)
{
AssetTools.RegisterAssetTypeActions(Action);
CreatedAssetTypeActions.Add(Action);
}
  • 自定义资源在编辑器中的样式

    我们可以自定义调整缩略图,颜色,细节自定义,过滤器,分类等。

设置缩略图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void FOrfeasPluginModule::StartupModule()
{
TSharedPtr StyleSet;
StyleSet = MakeShareable(new FSlateStyleSet("OrfeasStyle"));

// 这个插件的内容路径
FString ContentDir = IPluginManager::Get().FindPlugin("OrfeasPlugin")->GetBaseDir();
StyleSet->SetContentRoot(ContentDir);
//从图标创建一个笔刷
FSlateImageBrush* ThumbnailBrush = new FSlateImageBrush(StyleSet->RootToContentDir(TEXT("Resources/Icon128"), TEXT(".png")), FVector2D(128.f, 128.f));
if (ThumbnailBrush)
{
StyleSet->Set("ClassThumbnail.OrfeasCustomAsset", ThumbnailBrush);
//注册类型
FSlateStyleRegistry::RegisterSlateStyle(*StyleSet);
}
}

使用IPluginManager.h头文件你需要在你的插件的依赖中添加 “Projects” 依赖

设置过滤器与分类

在注册资源类型的时候就设置了

1
2
3
4
// 初始化一种资源类型
GenericGraphAssetCategoryBit = AssetTools.RegisterAdvancedAssetCategory(FName(TEXT("GenericGraph")), LOCTEXT("GenericGraphAssetCategory", "GenericGraph"));
// 注册这种资源类型,设置分类与过滤类型
RegisterAssetTypeAction(AssetTools, MakeShareable(new FAssetTypeActions_GenericGraph(GenericGraphAssetCategoryBit)));
  • 高级部分:自定义资源编辑器UI

    适用于复杂的资源类型

在打开资源的事件中,我们可以给打开事件绑定一个自定义的资源编辑器

mark

绑定了一个自定义的编辑器类型,你需要什么样的编辑器就需要你自己去自定义了,这里主要针对自定义资源插件,就不详细解释自定义编辑器的实现了

自定义编辑器界面

mark