Unlua源码解析(四) Lua怎么替换BlueprintImplementableEvent 或 BlueprintNativeEvent的方法实现的
供稿:hz-xin.com 日期:2025-01-15
在UUnLuaManager中,绑定UObject和Lua Object的关键步骤发生在BindInternal函数中。具体而言,当访问648-649行时,系统会收集所有Lua方法,将其存储到LuaFunctions中;紧接着,在650-651行,系统会获取所有UE中包含的BlueprintEvent和RepNotify方法,并进行相应存储。最重要的操作则集中在OverrideFunctions函数内,这也是解答本文问题的核心所在。在这个函数中,Lua的函数会被用来覆盖BlueprintImplementableEvent或BlueprintNativeEvent的方法。
对于每一个LuaFunc,系统会判断是否存在对应的UEFunction。如果找到匹配的UEFunction,系统会调用OverrideFunction进行方法覆盖。对于父类的方法,系统会在子类中添加覆盖函数;而对于自身的方法,系统则直接使用Lua方法进行覆盖,这正是本文所要解析的ReplaceFunction过程。
为了确保方法覆盖的正确性,系统首先对原始UFunction进行备份,并将其重命名为FunctionName+Copy。之后,Unlua全局数据结构GReflectionRegistry将原始UFunction与新方法的映射关系存储起来。如果UFunction绑定的是蓝图脚本,系统还会缓存字节码。然后,调用全局方法OverrideUFunction开始真正进行方法覆盖。
值得注意的是,UFunction的Script中存储的是蓝图字节码,当环境非SHIPPING时,系统会在此基础上添加EX_CallLua、EX_Return、EX_Nothing三个字节码;而在SHIPPING环境中,额外加入了一个Userdata,即Function的FunctionDesc数据。我们可以通过观察EX_CallLua的实现来深入理解这一过程,其实际上是一个宏实现。
整个过程与上篇讨论的Lua反射调用UFunction的操作正好形成逆向操作,其原理相同。在这个过程中,系统通过FunctionDesc调用CallLua,CallLua才是实现方法调用的核心代码。
综上所述,Unlua在覆盖UE方法时,通过一系列精心设计的步骤确保了Lua方法与UE方法的无缝集成。这一过程既体现了Lua与UE的深度融合,又展现了Unlua在方法调用和方法覆盖方面的高超技巧。
对于每一个LuaFunc,系统会判断是否存在对应的UEFunction。如果找到匹配的UEFunction,系统会调用OverrideFunction进行方法覆盖。对于父类的方法,系统会在子类中添加覆盖函数;而对于自身的方法,系统则直接使用Lua方法进行覆盖,这正是本文所要解析的ReplaceFunction过程。
为了确保方法覆盖的正确性,系统首先对原始UFunction进行备份,并将其重命名为FunctionName+Copy。之后,Unlua全局数据结构GReflectionRegistry将原始UFunction与新方法的映射关系存储起来。如果UFunction绑定的是蓝图脚本,系统还会缓存字节码。然后,调用全局方法OverrideUFunction开始真正进行方法覆盖。
值得注意的是,UFunction的Script中存储的是蓝图字节码,当环境非SHIPPING时,系统会在此基础上添加EX_CallLua、EX_Return、EX_Nothing三个字节码;而在SHIPPING环境中,额外加入了一个Userdata,即Function的FunctionDesc数据。我们可以通过观察EX_CallLua的实现来深入理解这一过程,其实际上是一个宏实现。
整个过程与上篇讨论的Lua反射调用UFunction的操作正好形成逆向操作,其原理相同。在这个过程中,系统通过FunctionDesc调用CallLua,CallLua才是实现方法调用的核心代码。
综上所述,Unlua在覆盖UE方法时,通过一系列精心设计的步骤确保了Lua方法与UE方法的无缝集成。这一过程既体现了Lua与UE的深度融合,又展现了Unlua在方法调用和方法覆盖方面的高超技巧。
slua,ulua,nlua,unilua这几种unity3d的lua插件各有什么优
ulua和nlua基于反射方案,虽然它们能减少静态代码,从而缩小app尺寸,但牺牲了速度,gc alloc频繁,并且不直接支持代理,存在一些需要修改的坑。它们在unity中作为lua的原生代码插件被调用。unilua是一个c#实现的lua虚拟机,虽然在效率上不如c代码,且需要考虑导出unity接口的问题,但它不是完整的unity+lua...
slua,ulua,nlua,unilua这几种unity3D的lua插件各有什么优劣
网上还有说nLua的。看看权威的解释。所以追求效率的、Slua,这个对于项目开发我认为暂时比性能重要,所以如果ulua支持WP需要第二种原生luavm的底层库,因而Lua能轻松实现“热更新”,像CToLua。Lua被看作一个资源么,它支持全,都是文件资源。但是ulua因为底层使用luajit,因此效率略低于ulua,而luajit目前...
如何评价腾讯在Unity下的xLua热更方案
看看权威的解释:ulua包含两种c模式(luajit版+原生luavm版),加之toluac#提供了直接访问渠道。所以追求效率的,请选用ulua。但是ulua因为底层使用luajit,而luajit目前不能在WP平台使用,所以如果ulua支持WP平台需要第二种原生luavm的底层库。nlua包含2种模式(KeraLuac版本)(KopiLuac#版本),它支持...