欢迎光临散文网 会员登陆 & 注册

【UE4】【UnLua】4.27/UE5不会导出有默认值的参数给Lua - Lua调用时必须传完整的参数

2022-04-01 16:01 作者:天空游荡的鱼  | 我要投稿

    Lua的提示为XXX函数需要int()型的参数,但获得的参数为nil。检查错误代码,发现UFUNCTION中参数为2个,第二个参数的默认值为0. Lua调用的时候代码为self:Trigger(100), 只传入一个参数。

错误提示

    疑问:难道新版的UnLua不会填充参数默认值吗?是不是做了什么优化?没有默认值填充,写代码的时候得多蛋疼。。。

    带着执着的2B精神(研究学术、刨根问底),我们试着去看看UFUNCTIN与Lua Function之间的桥梁代码FFunctionDesc。发现上图出现的错误提示,好像出现了。

    仔细看看该类,可以发现Lua调用UFUNCTION其实是FFunctionDesc::CallUE。


    第二参数为调用的UFUNCTION参数个数,第三个参数Userdata为参数值,统一保存在该指针中。 除了上面参数不足会输出错误log外,在下面代码也会输出同样的log

    

    该代码是在DefaultParams == nullptr时,会输出log。但按UFUNCTION的定义,会有DefaultParams才对吧?所以我们将重点放在啥时候给DefaultParams赋值的。此时,找到了ClassDesc的RegisterField,在这里是从FunctionCollection中查找对应方法的默认值,只有第一次在Lua端调用指定的函数时,才会调用RegisterField。

    那么,我们的任务变成了找FunctionCollection从哪里来?不难找到就是在FClassDesc初始化时从下面代码中获得FunctionCollection = GDefaultParamCollection.Find(*ClassName);。

    如果你看到这里,肯定懵逼了,GDefaultParamCollection全文搜索,只有定义的地方,没有初始化的地方呢?

    你肯定找不到,因为他在这里

GDefaultParamCollection初始化的文件路径


在该文件中,我们找到了自己定义的部分UFUNCTION。

    通过对比发现,其实是Int64类型的参数类型函数没导出。找的过程就不赘述了。直接把关键代码贴出来。在UnLua插件目录的UnLuaDefaultParamCollector模块中的UnLuaDefaultParamCollector.cpp,UBT在编译的时候会触发里面的ExportClass函数执行。在遍历所有函数默认参数的循环中,找到Int类型的参数,增加int64类型的判断。如下面代码:

自此,默认参数值的问题搞定。 点赞吧


【UE4】【UnLua】4.27/UE5不会导出有默认值的参数给Lua - Lua调用时必须传完整的参数的评论 (共 条)

分享到微博请遵守国家法律