最近换了工作,有更多的时间可以扩充自己的知识库,不过我发现,看了很多代码和分析还是记不住,很多东西只是大概知道,一定要带着问题去看代码,才能真正有所收获~
这次我们就先来看下unlua中最基本的绑定脚本问题
在Github里的Unlua接口文档里我们可以找到,如果想把C++和对应的Lua脚本绑定起来,需要在C++类上继承IULuaInterface,并且需要重载对应的虚函数GetModuleName(),返回对应Lua脚本路径下的文件名。那我们肯定就要从这个函数入口。
在LuaContext.cpp里我们可以发现这么一个函数用到了GetModuleName。
看起来就是我们要找的函数,函数中的其他分支逻辑我们先暂时不管,继续往下跟
通过UObject::ProcessEvent得到脚本文件名ModuleName,最终会调用UUnluaManeger::Bind这个函数里面的BindInternal这个函数,这个函数值得关注的有下面几个地方
这里是根据ModuleName找到的LuaModule注册到Lua全局的package.loaded域下面。然后在Unlua中记录UE类和LuaModule的对应关系。
接下来就是把这两者中重复的Function来做一次重载,这样在C++中声明了的函数,就可以直接转到Lua中实现完成调用。中间调用步骤比较简单,我们就省略了,直接跳到OverrideUFunction这个函数是怎么做的。
OverrideUFunction这个函数可以看到就是把UFunction 的Native函数指针设置成了FLuaInvoker::execCallLua,然后给Function的Script加了一些标记枚举。关键就在FLuaInvoker::execCallLua,这个函数才是真正执行C++调用lua的地方。
最终逻辑会执行到CallLuaInternal
GetValueInternal这个函数会把对应的UProperty push到堆栈上,在PropertyDesc.cpp里实现了各种UProperty的GetValueInternal。,如下图所示:
可以看下Bool的最简单的实现



