使用官方 Python 插件,像这样调用 参数带有 FEventReply 的函数,
handled = unreal.WidgetLibrary.handled()
unreal.WidgetLibrary.unlock_mouse(handled)
FEventReply UWidgetBlueprintLibrary::UnlockMouse( UPARAM( ref ) FEventReply& Reply )
C++ 收到的这个参数 Reply 仍然是 Unhandled 的,处于一个初始化但是没有赋值的状态。
查了一下,是因为python插件在传递 Struct 参数时,会调用 Identical 对参数的Struct与刚分配好内存初始的Struct进行比较,如果比较相同就不会走到 887 行 CopyScriptStruct 的逻辑,导致参数没有被赋值
[Image Removed]
而 Struct 比较使用的是这个 CompareScriptStruct 函数
[Image Removed]
由于 FEventReply 结构体并没有任何 UPROPERTY,且不支持 STRUCT_IdenticalNative 这个Flag。因此无论如何都会比较为相等。
我使用的是 UE426 的引擎,但查看 UE5.4 和 UE5.6 的代码,相关路径上的代码都没有任何改动,看上去是一个一直存在的问题。
目前我本地的处理方法是给 FEventReply 加上 WithIdenticalViaEquality 及对应的比较函数。但是 FReply 本身是不支持比较的,因此不确定这种处理方式是否存在问题,希望得到官方的修复方法