UE4新增Asset类型
30 May 2021 UE4
想要在编辑器里面添加新的Asset类型,算是比较常见又不是经常使用的需求。
当前UE4版本为4.26.2。
虽然本身并不复杂,但是每次添加的时候如果项目中没有相关的代码,就又要去查一次。不然总是会在一些奇怪的地方卡住导致在编辑器中无法使用的情况。因此在这里记录一下,方便下次查找。
UFactory继承
首先需要继承UFactory,直接用UE4添加类,或者自己写即可。
覆盖掉下面的函数:
virtual UObject* FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override;
virtual bool ShouldShowInNewMenu() const override;
ShouldShowInNewMenu直接返回True则可用在编辑器的右键新建的菜单中出现。
FactoryCreateNew则直接新建一个对应类型的Object即可:
return NewObject<UMyObjectType>(InParent, InClass, InName, Flags);
同时需要在构造函数中初始化一些设置
SupportedClass = UMyObjectType::StaticClass();
bCreateNew = true;
bEditAfterNew = true;
如果遇到了一些奇怪的链接问题,可以先检查下是否在模块的build.cs中包含了UnrealEd。
PrivateDependencyModuleNames.AddRange(
new string[]
{
"CoreUObject",
"Engine",
"UnrealEd",
}
);
AssetTypeActions
之前的版本有上面的操作就可以了,但是目前4.26的版本需要额外的操作才能在编辑器中看到新建按钮。
定义一个新的类继承自FAssetTypeActions_Base
,一个比较好的参考是FAssetTypeActions_DataAsset
。
class FAssetTypeActions_DataAsset : public FAssetTypeActions_Base
{
public:
// IAssetTypeActions Implementation
virtual FText GetName() const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_DataAsset", "Data Asset"); }
virtual FColor GetTypeColor() const override { return FColor(201, 29, 85); }
virtual UClass* GetSupportedClass() const override { return UDataAsset::StaticClass(); }
virtual uint32 GetCategories() override { return EAssetTypeCategories::Misc; }
};
无需额外的定义,之后在Module的Start的地方进行注册即可
void FAwesomeEdModule::StartupModule()
{
IAssetTools& AssetTools = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools").Get();
AssetTools.RegisterAssetTypeActions(MakeShareable(new FAwesomeAssetAction));
}
其中FAwesomeAssetAction就是新定义的AssetTypeAction。
总结
由于这种功能一般加一次就会不管了,下一次在别的地方要用到的时候才发现API已经变了。由于本身操作不是很熟悉,很难把握是自己操作有误还是其他因素引起的。
总之这边记录的是当前版本的可行操作,之后的版本不行的话就可以判断可能是API有改变。