最近游戏框架需要支持webgl,tolua不支持webgl,一开始的想法是把自己把tolua修改支持webgl,想法是好的,但是现实是赤果果的打脸啊,要搞定的地方还是太多,工作量也是挺大的,于是MoonSharp方案进入考虑范围(MoonSharp)。
MoonSharp是C#实现的lua解释器,部分借鉴NLua,网上说的性能堪忧,我试了下,效果满足基本需求,可能数据量不大。重要的是支持webgl,支持webgl,支持webgl,重要的事情说3遍。
一、 MoonSharp支持属性标签[MoonSharpUserData]或者UserData.RegisterType()注册一个C#类,这样就可以愉快的在lua中调用了,类似tolua中的_GT(MyClass)。
[MoonSharpUserData]
class MyClassStatic
{
public static double calcHypotenuse(double a, double b)
{
return Math.Sqrt(a * a + b * b);
}
}
double MyClassStaticThroughInstance()
{
string scriptCode = @"
return obj.calcHypotenuse(3, 4);
";
// Automatically register all MoonSharpUserData types
UserData.RegisterAssembly();
Script script = new Script();
script.Globals["obj"] = new MyClassStatic();
DynValue res = script.DoString(scriptCode);
return res.Number;
}
或者
class MyClass
{
public double CalcHypotenuse(double a, double b)
{
return Math.Sqrt(a * a + b * b);
}
}
static double CallMyClass2()
{
string scriptCode = @"
return obj.calcHypotenuse(3, 4);
";
// Register just MyClass, explicitely.
UserData.RegisterType<MyClass>();
Script script = new Script();
// create a userdata, again, explicitely.
DynValue obj = UserData.Create(new MyClass());
script.Globals.Set("obj", obj);
DynValue res = script.DoString(scriptCode);
return res.Number;
}
二、 MoonSharp中“:”和“.”的使用是真心方便,官网说99.999%概率它俩是一样的,赞赞赞,tolua中的”:”和“.”的使用就有点蛋疼洛,经验如下:
1.C#中静态方法,还是按照静态方法调用(也就是“.”调用)
2.C#中的public方法,按照域名的方式调用(类似C++的域)(也就是“:”调用)
3.Lua中的全局方法,直接“.”调用
4.lua中调用C#的构造函数直接使用就行,如TestClass(参数1,参数2...)
三、 MoonSharp没有现成的框架,得自己一点点造轮子了。。。
四、其它的跟后续使用再加。。。