@daaoling
2017-02-01T23:53:35.000000Z
字数 1532
阅读 6932
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技术内幕(一)