UE5 C++声明返回TFuture的函数触发UHT解析错误如何解决
报错根因
UnrealHeaderTool(简称UHT)在解析UFUNCTION标记的函数时,仅能识别被反射系统注册的类型:即UCLASS、USTRUCT、UENUM、声明过的全局动态委托四类。代码中使用的TFuture<UTexture2D*>返回值、TFunction<void()>参数都不属于上述UHT可识别的反射类型,因此会直接抛出类型不识别的解析错误。
修复方案
根据是否需要将该函数暴露给蓝图调用,分两种情况处理:
- 仅C内部调用:直接删除函数上方的
UFUNCTION宏即可。移除宏后UHT不会解析该函数签名,TFuture、TFunction都可以正常使用,不影响C侧调用逻辑。 - 需要暴露给蓝图调用:UHT本身不支持
TFuture、TFunction的反射绑定,需要拆分函数适配反射规则:- 先声明蓝图可识别的动态委托,用于异步返回加载结果
- 写一个符合UHT类型规则的
UFUNCTION版本给蓝图调用,内部复用C++实现逻辑 - 保留原
TFuture签名的C版本,不添加UFUNCTION宏,供C侧调用
修正后的最小可运行代码如下:
#include "CoreMinimal.h" #include "PixelFormat.h" #include "UObject/NoExportTypes.h" #include "Async/Future.h" #include "TSImageLoader.generated.h" // 前置声明 class UTexture2D; DECLARE_LOG_CATEGORY_EXTERN(LogTextureSerializeImageLoading, Log, All); // 声明蓝图可绑定的动态委托,加载完成后传回UTexture2D对象 DECLARE_DYNAMIC_DELEGATE_OneParam(FOnImageLoadDone, UTexture2D*, LoadedTexture); UCLASS(BlueprintType) class TEXTURESERIALIZEIO_API UTSImageLoader : public UObject { GENERATED_BODY() public: // 蓝图调用版本:签名符合UHT反射规则 UFUNCTION(BlueprintCallable, meta = (HidePin = "Outer", DefaultToSelf = "Outer")) static void ImportImageFromDiskAsync(UObject* Outer, const FString& ImagePath, FOnImageLoadDone CompletionCallback); // C++专用版本:保留原TFuture、TFunction签名,不添加UFUNCTION宏 static TFuture<UTexture2D*> ImportImageFromDiskAsync(UObject* Outer, const FString& ImagePath, TFunction<void()> CompletionCallback); };
两个同名函数可以通过函数重载共存,蓝图版本内部直接调用C++版本的实现,异步任务完成后触发传入的动态委托即可,不会产生额外的逻辑冗余。
内容的提问来源于stack exchange,提问作者Faith254
相关产品推荐
相关产品推荐

