@daaoling
2017-02-01T15:53:35.000000Z
字数 1532
阅读 7217
Xlua 热更新
tolua:c# 代码静态注册到lua代码中
xlua:在编辑器模式下使用TypeBuilder,IlEmit,动态生成接口的C#代码,避免了每次新注册或者改变导入类时,都需要生成代码并加载。最后在实际发布中需要生成代码
但是需要加XLua.LuaCallCSharp or XLua.ReflectionUse(如果发布的时候没有生成代码的话)
建议所有要在Lua访问的类型,要么加LuaCallCSharp,要么加上ReflectionUse,这才能够保证在各平台都能正常运行。
在实际项目中,确实经常由于未运行代码生成菜单,导致一些编译或运行错误。如果项目逻辑主要使用lua开发,并不设计到频繁的互操作的话,此问题有所缓解
热补丁的基本原理其实非常简单,了解后任何程序员都很容易分析出开销,比如对于这个类
[hotfix]public class Calc{int Add(int a, int b){return a + b}}
打了hotfix标签后,xLua会在il层面注入代码(触发编译后),注入之后这个类会类似这样:
public class Calc{static Func<object, int, int, int> hotfix_Add = null;int Add(int a, int b){if (hotfix_Add != null) return hotfix_Add(this, a, b);return a + b}}
如果lua中执行了hotfix调用,hotfix_Add会指向一个lua的适配函数。
xlua.hotfix(CS.Calc, 'Add', function(a, b)print('Update in lua')end)
父类中有个 :public virtual void Awake(){Debug.Log("name" + gameObject.name);}子类中重载:public override void Awake(){base.Awake();Debug.Log("testpanel awake===");}我在hotfix 这个子类的Awake时:xlua.hotfix(CS.TestPanel, 'Awake', function()print('<<<<<<<<Awake in lua')end)这里,有什么办法还可以执行到父类的Awake。目前没提供。。hotfix的话,你把父类逻辑也在lua实现就可以了。就是在hotfix的时候把父类的这个方法里面的逻辑也写到Lua里面?以后会有提供么?想了下,貌似很难用很常规的办法提供。
tolua 因为早期的沉淀如Luaframework这种框架 所以开发起来可以直接用而不用自己再从头弄一些轮子, 相比之下xlua精简了不少, 需要自己花费一定的时间造轮子
xlua github
知乎 如何评价腾讯在Unity下的xLua(开源)热更方案?
Gad 腾讯开源手游热更新方案:Unity3D下的XLua方案介绍
Gad 腾讯开源手游热更新方案:Unity3D下的XLua技术内幕(一)