当我在使用UObject的ProcessEvent函数来进行UFunction的调用时,我发现只有TWeakObjectPtr类型是无法正确传递的,其他类型都可以,进一步的调试后确定我传入的Parms一定是正确的,那么问题就出现在ProcessEvent后续的代码上,进一步的调试后,发现在Gen.cpp的代码里面是这样的P_GET_WEAKOBJECT(TWeakObjectPtr<AMessageInfo>,Z_Param_WeakPtr);,继续后发现最后调用到了FWeakObjectProperty::CopyCompleteValueToScriptVM_InContainer函数里面,这个函数也简单,只调用了一个接口GetWrappedUObjectPtrValues,那么很显然是这个接口并不能正确的进行数据的复制,我尝试改了一下,调用Super::CopyCompleteValue,发现这样是能正确的进行数据复制的。接着翻了一下文件的提交记录,发现FWeakObjectProperty::CopyCompleteValueToScriptVM_InContainer函数的重载是为了修复另外一个Crash的Bug [Image Removed]
,希望可以修复这个bug。
void FWeakObjectProperty::CopyCompleteValueToScriptVM_InContainer(void* OutValue, void const* InContainer) const
{
GetWrappedUObjectPtrValues<FWeakObjectPtr>((UObject**)OutValue, InContainer, EPropertyMemoryAccess::InContainer, 0, ArrayDim);
}
Liu.Wei
(Liu.Wei)
2
Hi,
感谢提供线索,抱歉回复的完了,你方便提供一个简单的复现工程吗?我验证后,会把问题反馈给开发的同学,让他尽快修复,感谢。
[Image Removed]使用UE5.6版本制作的Demo已经做好了,在TestMap会有一个AWeakObjectPtrTest的Actor,在这个Actor的BeginPlay会调用ReflectCall::CallFunction函数,这个函数内进行了反射,然后用TTuple包装了TWeakObjectPtr的参数,使用Object->ProcessEvent调用到AAWeakObjectPtrTest::TestFunction函数,这时候收到的TWeakObjectPtr<AActor>变量就是无效的。
Liu.Wei
(Liu.Wei)
4
Hi,
感谢提供工程,我看了一下代码,我感觉这种用法有点特殊,我搜了一下引擎的代码,没有发现有UFunction的函数,参数里有TWeakObjPtr,所以我觉得这应该引擎不考虑支持的用法。我估计开发的同学不会去修复这个问题。
建议把UFunction的参数都改成常规引用或者softReference。
可以再看下主贴的内容,是因为修改一个BP相关TWeakObjectPtr的崩溃bug引起的这个bug,回滚那个提交后是能正确的传递TWeakObjectPtr类型的参数的,按理来说Object->ProcessEvent的定位就是可以传递任何参数的,不应该有参数类型的要求。
Liu.Wei
(Liu.Wei)
6
TWeakObjectPtrl类型应该不支持作为BP UFunction的参数,所以应该不是同一个问题。 [Image Removed]
跟BP的UFunction支不支持TWeakObjectPtr没关系啊,看提交记录,是他在修一个BP里面TWeakObejectPtr的属性引起的这个问题。
Liu.Wei
(Liu.Wei)
8
好的,我去跟修复的同学反馈一下,如果他有回复,我再跟你说。
Liu.Wei
(Liu.Wei)
10
Hi,
抱歉回复的比较晚,我刚得到反馈,同事看过后,他应该会考虑修复这个问题。不过暂时还没有修复。等他修复好了,我会在这里回复。
Liu.Wei
(Liu.Wei)
11
Hi,同事近期就会修复这个问题(虽然跟你之前理解的不太一样,他试过还原之前的改动,并不能修复复现工程里说的问题,不过他还是找到了问题的原因,并修复了,目前在一个shelf里)等他提交了代码,我再回复。
我在我们项目的引擎中还原过他的修改后明确是可以修复这个问题的,但是在官方的5.6版本倒是没有尝试,不过无论如何,能修复就行。
Liu.Wei
(Liu.Wei)
13