Unreal Engine编辑器自定义继承资产类型替换原生资产类型问题
问题修复方案
核心原因
你的URecoilPattern未标记为UCLASS,且工厂逻辑未限制仅创建自身类型,导致Unreal将你的工厂视为UCurveFloat的候选创建工厂,覆盖了原生曲线的创建流程。
具体修改步骤
1. 修复RecoilPattern.h,添加UCLASS宏
必须将自定义资产类标记为UCLASS,Unreal才能正确识别其为独立资产类型,避免与父类UCurveFloat混淆:
#pragma once #include "CoreMinimal.h" #include "Curves/CurveFloat.h" #include "RecoilPattern.generated.h" UCLASS() class URecoilPattern : public UCurveFloat { GENERATED_BODY() };
注意:必须添加#include "RecoilPattern.generated.h",这是Unreal反射系统的强制要求。
2. 限制工厂仅创建URecoilPattern
修改RecoilPatternFactory.cpp,确保工厂只响应明确创建URecoilPattern的请求,拒绝处理父类UCurveFloat的创建:
#include "RecoilPatternFactory.h" #include "RecoilPattern.h" URecoilPatternFactory::URecoilPatternFactory(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { SupportedClass = URecoilPattern::StaticClass(); bCreateNew = true; // 禁止工厂处理导入操作,仅用于创建新资产 bEditorImport = false; } UObject* URecoilPatternFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) { // 仅当请求的类是URecoilPattern或其子类时才创建,否则返回空让原生工厂处理 if (!Class->IsChildOf(URecoilPattern::StaticClass())) { return nullptr; } return NewObject<URecoilPattern>(InParent, Class, Name, Flags, Context); }
3. 修正AssetTypeActions中的文本错误
你的RecoilPatternActions.cpp中使用了错误的INVTEXT宏,替换为Unreal标准的本地化宏LOCTEXT:
#include "RecoilPatternActions.h" #include "RecoilPattern.h" #define LOCTEXT_NAMESPACE "RecoilPatternActions" UClass* FRecoilPatternAssetTypeActions::GetSupportedClass() const { return URecoilPattern::StaticClass(); } FText FRecoilPatternAssetTypeActions::GetName() const { return LOCTEXT("RecoilPatternAssetName", "Recoil Pattern"); } FColor FRecoilPatternAssetTypeActions::GetTypeColor() const { return FColor(78, 40, 165); } uint32 FRecoilPatternAssetTypeActions::GetCategories() { return EAssetTypeCategories::Misc; } #undef LOCTEXT_NAMESPACE
4. 补充模块依赖(可选但推荐)
在RecoilPattern.uplugin文件中明确添加AssetTools依赖,确保模块加载顺序正确:
{ "Modules": [ { "Name": "RecoilPattern", "Type": "Editor", "LoadingPhase": "PostEngineInit", "Dependencies": [ "Core", "CoreUObject", "Engine", "AssetTools" ] } ] }
修复原理
- 给
URecoilPattern添加UCLASS宏后,Unreal会将其识别为独立资产类,不再与UCurveFloat共享创建逻辑。 - 工厂中添加类检查,确保只处理自身类型的创建请求,让原生
UCurveFloat的工厂正常工作。 - 修正本地化宏,保证右键菜单中的资产名称正确显示。
内容的提问来源于stack exchange,提问作者charan vendra
相关产品推荐
相关产品推荐

