Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[UE] 偶现蓝图调用 ts写的蓝图函数库的函数 无效的问题 #1964

Open
FacelessXcy opened this issue Jan 10, 2025 · 12 comments
Open

Comments

@FacelessXcy
Copy link

Editor下完全正常。

但是打出来的包(无论是Client还是DS),有时候会出现 蓝图内 调用ts写的蓝图函数库的静态函数 无效 的问题。
表现为:没有报错,没有输出调用的函数内写的log,就是返回一个默认值。

之前可以通过重新保存一下生成的蓝图,或者修改一下函数名去修复这个问题。
但是这次遇到的问题,通过前面两个方法都无法修复。最后是把打包配置的bUseIoStore改为false解决了上述问题。

请问有没有碰到过类似的问题?有没有什么定位问题的思路?

UE版本为5.5.1。
puerts版本更新到 e0a0271
image

@morirain
Copy link
Contributor

#1567 是不是这个原因

@FacelessXcy
Copy link
Author

#1567 是不是这个原因

看起来是。
我现在准备在项目内把这次修改先去掉,因为目前项目内可以保证不用ts侧的Constructor
image

不过除此之外,还有什么比较好的解决方法吗?
用ts写Library感觉也是个比较常见的用法,不支持CDO感觉影响比较大

@FacelessXcy
Copy link
Author

#1567 是不是这个原因

把上面截图的那里注释掉之后,打了很多log看了一下,可能不是这个原因。

那个问题是个普通类的CDO。我这边出问题的是个BlueprintFunctionLibrary。TryBindJs的时候BlueprintFunctionLibrary会直接遍历所有的Function直接去劫持方法。

Image

但是出问题的library,在遍历Function的时候输出FunctionFlags,所有函数的FunctionFlags全都是0。看起来是FunctionFlags还没反序列化出来的时候就走到TryBindJs了。

之前出过类似的问题,不过当时是开了异步加载线程,现在已经关了。而且只有那一个Library出问题。编辑器下正常,只有打出来的客户端包才有问题。

请问还有什么别的思路么?

@morirain
Copy link
Contributor

不知道,不过应该在RebindJs里面吧

@morirain
Copy link
Contributor

不过你不改这段的话,打包后还是不会绑定上,除非你动态加载了这个对象,这样会走到动态绑定那段

@FacelessXcy
Copy link
Author

不过你不改这段的话,打包后还是不会绑定上,除非你动态加载了这个对象,这样会走到动态绑定那段

其实上面那段改不改,对于我这个问题来说没区别。不改bind不上,改了也bind不上。

主要问题就是FunctionFlags全为0。所以即使后面能触发动态绑定,puerts绑定函数的时候也会有判断FunctionFlag的逻辑,也会有问题。
FunctionFlags如果值是正确的话,整个流程就是通的。

@FacelessXcy
Copy link
Author

不知道,不过应该在RebindJs里面吧

打出来的包,在RebindJs里遍历UClass的时候遍历不到TS生成类,Editor下才能遍历到。

@morirain
Copy link
Contributor

你看跟这两个commit有关系吗 2c47137 b2bfcf0

@FacelessXcy
Copy link
Author

看起来都没关系。

第一个commit是对BPFL做了特殊处理,遍历每个函数,判断Flag,是static的话直接劫持函数。但是我这边的问题就是 “函数的flag都是0”,导致判断不通过.

第二个commit的话,主要是处理“非GameThread加载代理蓝图”,但是目前我们项目是直接关了异步加载线程的( 之前出过问题#1818 (comment) )。按我的理解,这个时候的加载应该是完全走游戏线程的。还是说,即使关了异步加载线程,假如ts生成的蓝图,被地图里的某个被UE序列化的东西触发加载了,也会走非游戏线程吗?( #1851 (comment)

@FacelessXcy
Copy link
Author

FacelessXcy commented Jan 17, 2025

Bind成功的static UFunction ObjectFlag:
FunctionObjectFlags:Public | NeedPostLoad | NeedPostLoadSubobjects | WasLoaded | LoadCompleted

Bind失败的static UFunction ObjectFlag:
FunctionObjectFlags:Public | NeedLoad | NeedPostLoad | NeedPostLoadSubobjects | WasLoaded

看起来是绑定失败的UFunction还没Load

@FacelessXcy
Copy link
Author

我在引擎测加了个PostLoad的Event,Puerts里去监听这个Event。触发的时候,如果PostLoad的是个BPFL会再尝试走一次Bind流程,这个时候的flag是100%正确的。
似乎跟资源加载的流程有关系。

@morirain
Copy link
Contributor

那你看看加载的栈就知道原因了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants