puerts
puerts copied to clipboard
[UE] Bug: 带数组参数的动态多播代理绑定JS函数后,无法转发数组参数到本类中生成为蓝图接口的函数里面。
前置阅读 | 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 { //这里无法访问传进来的参数 }
https://github.com/Tencent/puerts/issues/554 跟这个没关系,只是因为一开始怀疑绑定姿势不正确。所以引用下帮助记忆。
TArray在UE有特殊处理,你翻翻之前的issue
TArray在UE有特殊处理,你翻翻之前的issue
是这个吗?https://github.com/Tencent/puerts/issues/626
按照 #626 里面的 添加$InRef 依然获取不到数据,目前只能通过no_blueprint使之不要生成为蓝图函数来解决这个问题。
按照 #626 里面的 添加$InRef 依然获取不到数据,目前只能通过no_blueprint使之不要生成为蓝图函数来解决这个问题。
加no_blueprint后可以了就是那问题。你是怎么加$InRef ?然后相关的调用和读取参数的代码是怎样的?
这个问题十分确定。比如不加 no_blueprint,TS里声明函数 A(b:$InRef<UE.TArray<UE.MyArr>>, b:boolean)void{}。那么这个函数在蓝图子类里可以正常访问传递数组进去,但是这个函数我如果在ts访问,用$ref传递一个数组进去,函数里用$unref得不到数组里的数据
这个问题十分确定。比如不加 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通过反射调用一个代理蓝图才会有问题。
@terst6 你反馈的问题已经解决,合入这个commit:https://github.com/Tencent/puerts/commit/5eb678fbe32baed52457f4d97e1b1e03c0b73d61
@ljporljp 可能你的问题也是同样的问题,更新试试看。如果没解决,可以附个重现的例子。