NLua的基础使用方法

Lua 是一个小巧的脚本语言。

很多软件的脚本语言都是基于Lua实现的,但是Lua只能在C++中被使用。而NLua对与Lua进行了二次封装,使其可以在.Net环境下运行。

NLua 源码和示例 Github 地址:

GitHub - NLua/NLua: Bridge between Lua and the .NET.

一、环境部署

        如你现在使用的VS平台,使用Nuget进行安装是最高效快捷的方式。

二、调用方法

2.1 方法调用

Lua lua = new Lua(); //新建一个对象
double value =(double)lua.DoString("return 5.0+6.0")[0]; //返回计算的结果

此处的value 为11。

我们进步进一步查看一下DoString()的函数,返回的是object[]类型。

当有返回的时候,如上图,返回的是object[1],故需要索引【0】获取值,并转换成double格式。  注意:如果是5+6的话返回的是int格式。Lua语法同Python,类型结构是动态的。

若无返回类型,则返回的数据结构为object[0]。

/// <summary>
/// Executes a Lua chunk and returns all the chunk's return values in an array.
/// </summary>
/// <param name = "chunk">Chunk to execute</param>
/// <param name = "chunkName">Name to associate with the chunk. Defaults to "chunk".</param>
/// <returns></returns>
public object[] DoString(string chunk, string chunkName = "chunk")

2.2 变量调用

1.给动态变量"x"赋值3.0

最终返回结果value为9

Lua lua = new Lua();
lua["x"] = 3.0;
double value =(double)lua.DoString("return x+6.0")[0];

2.给动态变量"x"赋值3.0,并将结果给y,无返回值

最终得到y的结果为9

Lua lua = new Lua();
lua["x"] = 3.0;
lua.DoString("y = x + 6.0");
double value = (double)lua["y"];

2.3 函数调用

如下图说所示,编写了一个Add的函数体

1.在C#代码中获取得到整个函数体addFunc,并使用call的方式进行方法调用,最终得到value1 = 9

2.在C#使用lua的DoString语法进行调用,得到value2 = 9

Lua lua = new Lua();
lua.DoString(@"
function Add (val1, val2)
   return val1 + val2
end
");

//在C#中进行调用
var addFunc = lua["Add"] as LuaFunction;
var value1 = addFunc.Call(3, 6).First();

//在lua语句中进行调用
lua.DoString("y = Add(3,6)");
var value2 = lua["y"];

2.4 函数绑定

如何绑定C#中的函数到lua中呢?

先声明一个测试类,里面包含静态函数和普通函数

public class TestClass
{
    public static double Add(double x, double y)
    {
        return x + y;
    }

    public double Sub(double x,double y) 
    {
        return x - y;
    }
}

静态函数调用,将Lua函数的AddMethod与TestClass类的静态函数Add进行绑定,此处RegisterFunction函数的第二个参数可为null,也可为TestClass的对象。

调用结果value = 3

Lua lua = new Lua();
lua.RegisterFunction("AddMethod", null, typeof(TestClass).GetMethod("Add"));  //静态,第二个参数可为null
lua.DoString("y = AddMethod(2,1)");
var value = lua["y"];

普通函数调用,将Lua函数的SubMethod与TestClass类的Sub函数进行绑定,此处RegisterFunction函数的第二个参数需为TestClass的对象

调用结果value = 1

Lua lua = new Lua();
TestClass test = new TestClass(); //创建TestClass对象
lua.RegisterFunction("SubMethod", test, typeof(TestClass).GetMethod("Sub"));  
lua.DoString("y = SubMethod(2,1)");
var value = lua["y"];

2.5 对象调用

如下图,新建一个TestClass的类,里面包含一个变量、一个属性和一个函数

public class TestClass
{
    public double X = 3;

    private double _Y = 4;
    public double Y
    {
        get { return _Y; }
        set { _Y = value; }
    }

    public double GetZ()
    {
        return 5;
    }
}

调用对象的变量,由下图可看出,调用对象的变量和属性使用"."的方式进行引出,调用对象的函数则使用":"进行引出

TestClass test = new TestClass(); //创建test对象
           
Lua lua = new Lua();
lua["test"] = test;
          
//获取变量X
lua.DoString("y1 = test.X + 3");
var value1 = lua["y1"];

//获取属性Y
lua.DoString("y2 = test.Y + 3");
var value2 = lua["y2"];

//获取方法Z
lua.DoString("y3 = test:GetZ() + 3");
var value3 = lua["y3"];

三、结束

希望本文能对你学习Lua语法有帮助

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值