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_
相关产品推荐
相关产品推荐

