You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UE5 C++声明返回TFuture的函数触发UHT解析错误如何解决

报错根因

UnrealHeaderTool(简称UHT)在解析UFUNCTION标记的函数时,仅能识别被反射系统注册的类型:即UCLASS、USTRUCT、UENUM、声明过的全局动态委托四类。代码中使用的TFuture<UTexture2D*>返回值、TFunction<void()>参数都不属于上述UHT可识别的反射类型,因此会直接抛出类型不识别的解析错误。

修复方案

根据是否需要将该函数暴露给蓝图调用,分两种情况处理:

  • 仅C内部调用:直接删除函数上方的UFUNCTION宏即可。移除宏后UHT不会解析该函数签名,TFuture、TFunction都可以正常使用,不影响C侧调用逻辑。
  • 需要暴露给蓝图调用:UHT本身不支持TFuture、TFunction的反射绑定,需要拆分函数适配反射规则:
    1. 先声明蓝图可识别的动态委托,用于异步返回加载结果
    2. 写一个符合UHT类型规则的UFUNCTION版本给蓝图调用,内部复用C++实现逻辑
    3. 保留原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 02:46:01