[UE] 打包后,调用蓝图函数库的函数时,没有走到TS内的逻辑
FacelessXcy opened this issue · comments
LogTemp: Warning: ClassName:BPHatredLibrary_C FuncName:IsEnableEnemyAttack !Function->HasAllFunctionFlags(FUNC_Static):1
这个是资源Cook后,刚启动DS时,在TryBindJs中的log,这个IsEnableEnemyAttack 函数是BPHatredLibrary内的static函数,BPHatredLibrary是个TS写的继承引擎BPFL的类,但是这里从log来看,这个函数没有Static的标记,导致没有挂上execLazyLoadCallJS,之后在蓝图内调用这个方法时,走不到TS内的逻辑。
在进入战斗场景后,我在一个蓝图的BeginPlay中按硬引用的方式调用了一个函数CheckClassFunctionFlag,这个函数会去遍历这个函数库内的所有函数,并输出函数的flag,这个时候,方法的flag是有static的(ClassName:BPHatredLibrary_C FuncName:IsEnableEnemyAttack Function->HasAllFunctionFlags(FUNC_Static):1。
查到这里之后我就没有思路了,请问有没有遇到过类似的情况,可以给一点后续debug的思路?
有可能非编辑器状态下,在这个时候还没正确设置flags。
要不你试试去掉那判断好了。
要不你试试去掉那判断好了。
去掉判断之后还是不行。
断点看的,if去掉之后,确实走了挂execLazyLoadCallJS的逻辑。
但是实际进入场景后时,execLazyLoadCallJS里加断点断不到东西
补充信息:现在项目PuertTS插件的加载时机是PreDefault,不是插件默认的PostEngineInit。 如果改成PostEngineInit,调用就没问题了,但是由于目前项目有些ts逻辑依赖引擎的LocalPlayerAdded,而LocalPlayerAdded是早于PostEngineInit的,所以还是要把插件的加载时机提前。
加载时机是PreDefault的话,蓝图函数库不会直接Bind到TS上,只会在生成CDO的时候,触发TryBindJs,遍历里面的每个方法,如果是static的话,会挂一个execLazyLoadCallJS的方法上去,后续如果触发调用的话,会在execLazyLoadCallJS里去Bind到TS上
加载时机改成PostEngine后,在Puerts启动后,调用RebindJs,获取当前所有已经加载的UClass,包括蓝图函数库 ,直接BindModule,并且这个里面最终会走到这里
直接把execCallJS挂在对应的函数上,后续调用的时候就能转发到ts了。
相比解决改成PreDefault导致的问题,我觉得想想办法解决PostEngineInit你业务特有的问题还经济一些。
PreDefault除了你这反馈的问题,还有可能碰到访问某些模块还没初始化的问题,这也是为啥后续改为PostEngineInit的主要原因。
相比解决改成PreDefault导致的问题,我觉得想想办法解决PostEngineInit你业务特有的问题还经济一些。 PreDefault除了你这反馈的问题,还有可能碰到访问某些模块还没初始化的问题,这也是为啥后续改为PostEngineInit的主要原因。
确实。改业务更方便一些。
不过我还是想问一下,之前写这部分逻辑的时候,是不是有一个预期:触发NotifyUObjectCreated的时候,这个Object里的所有函数的Flag,一定都已经反序列化完成了?
去年把加载时机延后是不是也有一部分原因,是因为这个预期有问题?这个在引擎侧有什么好办法处理吗?
延后到PostEngineInit的原因不是说了么?PreDefault一些模块还没初始化完毕呢,理论上这时访问是有风险的。