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

Unreal Engine 5.3测试类重写方法失效:GetAspectRatio返回基类值

Unreal 5.3单元测试虚函数重写失效问题修复

问题根源

你写的MapViewerTestHelper没加UCLASS()宏,也没放GENERATED_BODY(),这直接导致Unreal的UObject反射系统不认这个派生类的虚函数重写。NewObject创建对象时,底层还是按基类的虚函数表调用,所以返回的是基类的10.0,不是你预期的5.0。

Unreal的UObject体系全靠反射管动态多态,只要是继承UObject(包括UUserWidget)的自定义类,必须用UCLASS()标记,还要加GENERATED_BODY()生成反射代码,不然虚函数重写根本不生效。

修正后的完整代码

UCLASS()
class VORONOIMAP_API UMapViewer : public UUserWidget {
    GENERATED_BODY()
public:
    explicit UMapViewer(const FObjectInitializer& ObjectInitializer);
    virtual void NativeConstruct() override;
    virtual float GetAspectRatio() const {
        return 10.0;
    }
};

// 给测试类加上UCLASS宏和GENERATED_BODY
UCLASS()
class MapViewerTestHelper : public UMapViewer {
    GENERATED_BODY()
public:
    MapViewerTestHelper(const FObjectInitializer& ObjectInitializer) : UMapViewer(ObjectInitializer) {}
    virtual float GetAspectRatio() const override {
        return 5.0;
    }
};

It("should correctly calculate the aspect ratio", [this]() {
    MapViewerTestHelper* TestViewer = NewObject<MapViewerTestHelper>();
    const float CalculatedAspectRatio = TestViewer->GetAspectRatio(); 
    TestEqual("This Should return 5.0", CalculatedAspectRatio, 5.0);
});

额外提醒

  • 别漏了GENERATED_BODY(),它和UCLASS()是绑定的,负责生成Unreal反射需要的底层代码。
  • 测试断言里的retunr是拼写错误,改成return更规范,虽然不影响测试结果,但代码整洁很重要。

内容的提问来源于stack exchange,提问作者Timberghost_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:14:56