MoonSharp调研使用

本文介绍使用MoonSharp Lua解释器支持WebGL的过程与心得。包括如何通过[MoonSharpUserData]或UserData.RegisterType()注册C#类供Lua调用,以及在MoonSharp中使用“:”和“.”操作符的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近游戏框架需要支持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没有现成的框架,得自己一点点造轮子了。。。

四、其它的跟后续使用再加。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值