![bec057318ed64cca9613dea4c41d52f8.png](https://i-blog.csdnimg.cn/blog_migrate/9bfece1984759eb08d9a7e9178373e94.jpeg)
相关文章:
南京周润发:UnLua解析(一)Object绑定lua
南京周润发:UnLua解析(三)Lua访问Object的property和function
南京周润发:UnLua解析(四)数据在C++和lua间的相互传递
南京周润发:UnLua解析(五)Delegate实现
之前介绍了UnLua中UObject的绑定,简单提过UFunction绑定,在此介绍下其中细节。
使用lua的一个主要原因就是想替换蓝图,把一些本来在蓝图中实现的函数由lua实现,使游戏功能可以灵活修改。
UnLua支持BlueprintEvent和RepNotify类型函数的覆盖。
FFunctionDesc
被替换的UFunction会有一个对应的FFunctionDesc结构体,全局的GReflectionRegistry中有个叫做Functions的map容器,记录了UFunction和FFunctionDesc的对应关系。FFunctionDesc是UFunction与lua函数的桥梁,缓存了一些元信息,对提升效率有很大帮助。
Ufunction *Function:对应UFunction信息
FParameterCollection *DefaultParams:默认参数信息
int32 FunctionRef:lua中对应函数地址
TArray<FPropertyDesc*> Properties:函数的参数描述列表
FPropertyDesc
FFunctionDesc有一个属性为Properties,它是一个FPropertyDesc类型的数组,用于存储该Function的参数信息,而FPropertyDesc则用于描述每一个函数参数。FPropertyDesc不仅在FuncDesc中使用,在ClassDesc中也有,使用非常广泛。
FPropertyDesc只是一个基类,不同类型的属性会有不同的子类描述,比如int,float类型等等,它们通常会覆写GetValueInternal方法和SetValueInternal方法,这些方法用于和lua交互。
常用方法:
GetValueInternal():lua获取属性值的接口,根据属性类型使用不同的push方式。Integer等基本类型会直接push值,而像UObject类型会push一个UserData。
SetValueInternal():lua中给属性赋值接口,从lua栈中取出lua中设置的值,给属性设置上,因此自然也要根据不同类型区分。
调用覆盖的UFunction
被lua覆盖的UFunction,其字节码已经被替换,具体替换步骤如下:
/**
* 1. Replace thunk function
* 2. Insert special opcodes if necessary
*/
void OverrideUFunction(UFunction *Function, FNativeFuncPtr NativeFunc, void *Userdata, bool bI