- Published on
自定义资源
- Authors

- Name
- 东哥
自定义资源
新建插件StateMachine,然后手动拷贝一份StateMachineEditor用于编辑器模块 ,把里面的所有名称改为后缀为Editor版本
然后在Editor版本的Build.cs 的Private部分中加入如下模块 "UnrealEd", "AssetTools",Public部分加入 "StateMachine"模块
资源类
创建随意UObject 资源,可以保持默认,本例中为UStateMachineAsset
行为类
创建FAssetTypeActions_StateMachine类继承自FAssetTypeActions_Base,此类可以接管资源双击打开编辑器的动作,这个类需要在模块启动时注册,稍微会讲
此类建议创建在Editor模块
代码如下
#pragma once
#include "Developer/AssetTools/Public/AssetTypeActions_Base.h"
class FAssetTypeActions_StateMachine: public FAssetTypeActions_Base
{
public:
FAssetTypeActions_StateMachine(EAssetTypeCategories::Type AsstCategory);
~FAssetTypeActions_StateMachine();
// IAssetTypeActions Implementation
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 UThumbnailInfo* GetThumbnailInfo(UObject* Asset)const override;
virtual uint32 GetCategories()override { return m_AssetCategory; }//自定义的标签,可以用系统自带的EAssetTypeCategories::Type
private:
EAssetTypeCategories::Type m_AssetCategory;
};
#include "AssetTypeActions_StateMachine.h"
#include "BlueprintEditorUtils.h"
#include "AssetRegistryModule.h"
#include "StateMachineAsset.h"
#include "ThumbnailRendering/SceneThumbnailInfo.h"
#define LOCTEXT_NAMESPACE "AssetTypeActions"
FAssetTypeActions_StateMachine::FAssetTypeActions_StateMachine(EAssetTypeCategories::Type AssetCategory)
:m_AssetCategory(AssetCategory)
{
}
FAssetTypeActions_StateMachine::~FAssetTypeActions_StateMachine()
{
}
FText FAssetTypeActions_StateMachine::GetName()const
{
// Content里右键菜单创建的显示的可创建类型的名字
return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_StateMachine", "StateMachine Blueprint");
}
FColor FAssetTypeActions_StateMachine::GetTypeColor()const
{
return FColor::Emerald;
}
UClass* FAssetTypeActions_StateMachine::GetSupportedClass()const
{
return UStateMachineAsset::StaticClass();//创建的资源,即之前定义的UObject
}
//打开资源行为,通过这个方法可以打开其他视图
void FAssetTypeActions_StateMachine::OpenAssetEditor(const `TArray<UObject*>`& InObjects, `TSharedPtr<class IToolkitHost>` EditWithInLevelEditor)
{
UE_LOG(LogTemp, Log, TEXT("FAssetTypeActions_StateMachine::OpenAssetEditor"));
//内容暂无
}
UThumbnailInfo* FAssetTypeActions_StateMachine::GetThumbnailInfo(UObject* Asset)const
{
return NULL;
}
#undef LOCTEXT_NAMESPACE
工厂类
此类最好创建在Editor模块
此类是让引擎认识我们创建的这个资源和自定义标签,似乎定义了以后引擎就自动会识别,即上述两个类的功能
不创建的话连对应的自定义的标签也无法显示
#pragma once
#include "StateMachineAsset.h"
#include "Engine/Blueprint.h"
#include "Factories/Factory.h"
#include "UObject/Object.h"
#include "UObject/ObjectMacros.h"
#include "UObject/ScriptMacros.h"
#include "StateMachineFactory.generated.h"
UCLASS(HideCategories = Object,MinimalAPI)
class UStateMachineFactory : public UFactory
{
GENERATED_BODY()
public:
UStateMachineFactory(const FObjectInitializer& ObjectInitializer);
virtual ~UStateMachineFactory();
public:
UPROPERTY(EditAnywhere, Category = "StateMachineFactory")
`TEnumAsByte<EBlueprintType>` mBlueprintType;
UPROPERTY(EditAnywhere, Category = "StateMachineFactory")
`TSubclassOf<UStateMachineAsset>` mSupportedClass;
public:
// override UFactory function
virtual bool ConfigureProperties()override;
virtual UObject* FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName, EObjectFlags InFlags, UObject* InContext, FFeedbackContext* InWarn,FName InCallingContext)override;
virtual UObject* FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName, EObjectFlags InFlags, UObject* InContext, FFeedbackContext* InWarn);
};
#include "StateMachineFactory.h"
#include "StateMachineAsset.h"
UStateMachineFactory::UStateMachineFactory(const FObjectInitializer& ObjectInitializer)
:Super(ObjectInitializer), mSupportedClass(UStateMachineAsset::StaticClass())
{
bCreateNew = true;
bEditAfterNew = true;
// 这个Factory托管的类型
SupportedClass = mSupportedClass;
}
UStateMachineFactory::~UStateMachineFactory()
{
}
bool UStateMachineFactory::ConfigureProperties()
{
return true;
}
UObject* UStateMachineFactory::FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName, EObjectFlags InFlags, UObject* InContext, FFeedbackContext* InWarn,FName InCallingContext)
{
return FactoryCreateNew(InClass, InParent, InName, InFlags, InContext, InWarn);
}
UObject* UStateMachineFactory::FactoryCreateNew(UClass* InClass,UObject* InParent,FName InName,EObjectFlags InFlags,UObject* InContext,FFeedbackContext* InWarn)
{
UStateMachineAsset* NewStateMachineAssetItem = `NewObject<UStateMachineAsset>`(InParent, InClass, InName, InFlags);
return NewStateMachineAssetItem;
}
模块
用于注册自定义标签以及我们之前创建的FAssetTypeActions_StateMachine类
// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "AssetTypeCategories.h"
#include "AssetToolsModule.h"
#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"
class FStateMachineEditorModule : public IModuleInterface
{
public:
/** IModuleInterface implementation */
virtual void StartupModule() override;
virtual void ShutdownModule() override;
void RegisterAssetType(IAssetTools& AssetTools);
void RegisterSetting();
void UnRegisterSetting();
private:
EAssetTypeCategories::Type m_StateMachineCategoryType;//自定义标签
TArray<`TSharedPtr<IAssetTypeActions>`> m_CreatedAssetTypeActions;//Action数组
};
// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
#include "StateMachineEditor.h"
#include "AssetTypeActions_StateMachine.h"
#include "ISettingsModule.h"
#define LOCTEXT_NAMESPACE "FStateMachineEditorModule"
void FStateMachineEditorModule::StartupModule()
{
// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module
IAssetTools& AssetToolsInstance = FModuleManager::`LoadModuleChecked<FAssetToolsModule>`("AssetTools").Get();
//创建自定义标签,可以本地化翻译
m_StateMachineCategoryType= AssetToolsInstance.RegisterAdvancedAssetCategory(TEXT("StateMachine"), LOCTEXT("StateMachineAssetCategory", "StateMachine"));
RegisterAssetType(AssetToolsInstance);
RegisterSetting();
}
void FStateMachineEditorModule::ShutdownModule()
{
// This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,
// we call this function before unloading the module.
UnRegisterSetting();
}
void FStateMachineEditorModule::RegisterAssetType(IAssetTools& AssetTools)
{
`TSharedRef<IAssetTypeActions>` StateMachineBlueprint = MakeShareable(new FAssetTypeActions_StateMachine(m_StateMachineCategoryType));
//注册资源行为类
AssetTools.RegisterAssetTypeActions(StateMachineBlueprint);
m_CreatedAssetTypeActions.Add(StateMachineBlueprint);
}
void FStateMachineEditorModule::RegisterSetting()
{
//暂时为空
}
void FStateMachineEditorModule::UnRegisterSetting()
{
//暂时为空
}
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(FStateMachineEditorModule, StateMachineEditor)
然后我们在引擎Content目录下右键点击就出现我们要的效果
