puerts icon indicating copy to clipboard operation
puerts copied to clipboard

[UE] Bug: 带数组参数的动态多播代理绑定JS函数后,无法转发数组参数到本类中生成为蓝图接口的函数里面。

Open ljporljp opened this issue 1 year ago • 9 comments

前置阅读 | Pre-reading

Puer的版本 | Puer Version

1.0.3

UE的版本 | UE Version

5.1.1

发生在哪个平台 | Platform

Editor(win)

错误信息 | Error Message

在会生成蓝图接口的js函数内无法访问传递进来的数组参数

问题重现 | Bug reproduce

代码片段源自lyra但不失一般性 ga_test.ts: K2_ActivateAbility(): void { const LineTraceTask = UE.AbilityTask_WaitForInteractableTargets_SingleLineTrace.WaitForInteractableTargets_SingleLineTrace( this, Query, CollisionProfile, StartLocation, this.InteractionScanRange, this.InteractionScanRate, true); LineTraceTask.InteractableObjectsChanged.Add((InteractableOptions: UE.TArray<UE.InteractionOption>) => { this.test(InteractableOptions); }); }

private test(InteractableOptions: UE.TArray<UE.InteractionOption>) : void { //这里无法访问传进来的参数 }

ljporljp avatar Mar 27 '23 07:03 ljporljp

https://github.com/Tencent/puerts/issues/554 跟这个没关系,只是因为一开始怀疑绑定姿势不正确。所以引用下帮助记忆。

ljporljp avatar Mar 27 '23 07:03 ljporljp

TArray在UE有特殊处理,你翻翻之前的issue

chexiongsheng avatar Mar 27 '23 09:03 chexiongsheng

TArray在UE有特殊处理,你翻翻之前的issue

是这个吗?https://github.com/Tencent/puerts/issues/626

ljporljp avatar Mar 27 '23 11:03 ljporljp

按照 #626 里面的 添加$InRef 依然获取不到数据,目前只能通过no_blueprint使之不要生成为蓝图函数来解决这个问题。

ljporljp avatar Mar 27 '23 15:03 ljporljp

按照 #626 里面的 添加$InRef 依然获取不到数据,目前只能通过no_blueprint使之不要生成为蓝图函数来解决这个问题。

加no_blueprint后可以了就是那问题。你是怎么加$InRef ?然后相关的调用和读取参数的代码是怎样的?

chexiongsheng avatar Mar 30 '23 03:03 chexiongsheng

这个问题十分确定。比如不加 no_blueprint,TS里声明函数 A(b:$InRef<UE.TArray<UE.MyArr>>, b:boolean)void{}。那么这个函数在蓝图子类里可以正常访问传递数组进去,但是这个函数我如果在ts访问,用$ref传递一个数组进去,函数里用$unref得不到数组里的数据

terst6 avatar May 07 '23 05:05 terst6

这个问题十分确定。比如不加 no_blueprint,TS里声明函数 A(b:$InRef<UE.TArray<UE.MyArr>>, b:boolean)void{}。那么这个函数在蓝图子类里可以正常访问传递数组进去,但是这个函数我如果在ts访问,用$ref传递一个数组进去,函数里用$unref得不到数组里的数据

实测确实有问题,定位发现是这个优化引入:https://github.com/Tencent/puerts/commit/11d76bf83d828c9a5e98ea482c63340f7cc5ed20

这个优化反射在(js -> ue)调用时,对于引用参数只传地址,不值拷贝到栈上,而(ue -> js)那判断调用方不是蓝图就也不拷贝到栈,于是就出现这种情况。

不过如果js调用的是普通蓝图或c++,或者被蓝图调用代理蓝图,都不会有问题。只有js通过反射调用一个代理蓝图才会有问题。

chexiongsheng avatar May 08 '23 06:05 chexiongsheng

@terst6 你反馈的问题已经解决,合入这个commit:https://github.com/Tencent/puerts/commit/5eb678fbe32baed52457f4d97e1b1e03c0b73d61

@ljporljp 可能你的问题也是同样的问题,更新试试看。如果没解决,可以附个重现的例子。

chexiongsheng avatar May 08 '23 07:05 chexiongsheng

@terst6 你反馈的问题已经解决,合入这个commit:5eb678f

@ljporljp 可能你的问题也是同样的问题,更新试试看。如果没解决,可以附个重现的例子。

好的

ljporljp avatar May 08 '23 09:05 ljporljp