最近腾讯开源了旗下Unity手游热更新方案xlua到GitHub,引发了手游圈不小的关注。Unity热更一直是一个令开发者头疼的问题,ios的限制,效率问题等等。xlua提出了一个非常好的解决方案:
1、平时用C#开发;
2、运行也是C#,性能秒杀Lua;
3、有bug的地方下发个Lua脚本fix了,下次整体更新时可以把Lua的实现换回正确的C#实现,更新时甚至可以做到不重启游戏;
哇,这个思路是不是很棒,听着是不是很心动,一起来试验一下吧。
下载源码(https://github.com/Tencent/xLua),新建一个unity project,将源码的Assets下的文件拷贝到project的Assets目录下
这样在菜单栏会生成一个XLua菜单,有Generate Code和Clear Generate Code两个选项。Generate Code生成C#与Lua之间桥接的一些代码,生成的位置就在上图的Assets/XLua/Gen,Clear Generate Code可以删除这些代码。
然后新建一个test.cs挂在main camera上
using UnityEngine;
using System.Collections;
using XLua;
[Hotfix]
public class test : MonoBehaviour {
LuaEnv luaenv = new LuaEnv();
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (luaenv != null)
{
luaenv.Tick();
}
}
public int Add(int a, int b)
{
return a - b;
}
void OnGUI()
{
if (GUI.Button(new Rect(10, 100, 300, 150), "Hotfix"))
{
luaenv.DoString("require 'hotfix'");
//luaenv.DoString(@"
// xlua.hotfix(CS.test, 'Add', function(self, a, b)
// return a + b
// end)
//");
int num = Add (2,1);
print (num);
}
}
void OnDestroy()
{
luaenv.Dispose();
}
}
特别注意[Hotfix]标签,它声明了test类可以通过xlua.hotfix方法来修改test类下的函数和属性,原理后面说。
xlua.hotfix(CS.test, 'Add', function(self, a, b)
return a + b
end)
这样我们在点击Button后,xlua加载了这个hotfix.lua,将Add方法重写了!
xlua.hotfix(CS.test, {
Start = function(self)
end;
Add = function(self, a, b)
return a + b
end;
Minus = function(self, a, b)
return a - b
end;
})
如果你仅仅希望用热更新来fix bug,是不是再方便不过了。
public int Add(int a, int b)
{
return a + b;
}
加了il指令:
static Func
判断一个delegate是否为空(没用过C#的童鞋可以理解为函数指针),如果不为空就调用这个delegate,而这个delegate指向的是一个把调用转发给lua的函数。