Lua暖更新
lua函数运行时决定监听C#函数开始执行、监听C#函数return结束、替换整个C#函数实现的特性。
TestInjection样例
- 建立类ToLuaInjectionTest : BaseTest
- 暖更新的lua代码都要放到LuaInjectionBus.lua中统一require,这里是requre ToLuaInjectionTestInjector。
- lua中的注入格式,[]内是函数名+参数类型,后面可以选择注入类型
ToLuaInjectionTestInjector["TestOverload-bool-int"] = function()
return function (self, param1, param2)
print("Lua Inject TestOverload-bool-int " .. param2)
end, LuaInterface.InjectType.After
end
- InjectByModule(ToLuaInjectionTest, ToLuaInjectionTestInjector)
详细的具体内容可查阅作者的说明。 暖更新使用说明 暖更新特性简单说明
以下是一些使用摘要。
- InjectionBridgeInfo.lua是我们能替换的C#函数的LUT(look up table),我们Lua代码能替换的函数,都必须使用这个表里面的对应项。其根据InjectionBridgeEditorInfo.xml这个文件来实现自动"增量",即允许一定程度上的2份不同C#代码存运行于线上,并能被Lua替换监听(具体查看使用说明文档)。如果打包的之前,你修改了某一个函数的参数类型会导致不兼容历史记录,如果要兼容线上版的Inject代码,则最好新建一个不同名字的函数,内容拷过去,将老函数的引用重定向到新函数,而不是直接删除InjectionBridgeEditorInfo.xml这个文件(当然不考虑兼容线上版的Inject代码,则可以直接删掉这个文件,不管历史记录)。之所以提供这个增量的功能,是因为如果渠道多,打包环境会很复杂,容易遇到出多个包且包里面的C#函数有迭代的情况。
- 关于全Lua开发、全C#开发的问题。全Lua开发可能或多或少,会遇到lua的gc导致的性能问题。而且相对于C#这种强类型语言,Lua对于团队后期维护还是有一定的成本,不做好代码复审,相对容易变得不好维护。全C#开发配合上本方案做暖更新,修修BUG,容易遇到jit的限制,无法像全Lua或者全ILRuntime开发那么灵活的新增功能模块,不方便不换包迭代功能。故建议业务逻辑相关的都可以放可热更新的脚本层,比如角色养成,UI界面逻辑等。模块化高,重用率高,性能要求高,稳定性强的模块都可以封装到C#,比如战斗系统相关的模块,此时脚本层做好粘合剂的本职工作,搭搭积木就好。
- “重写”C#函数的Lua函数要访问C#类对象的没有wrap进Lua环境的私有数据成员、私有方法的时候,目前只能使用静态反射。