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语法有帮助