版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/NippyLi/article/details/79394528
xlua入门(3)c#调用Lua脚本
using UnityEngine;
using System.Collections;
using XLua;
public class InvokeLua : MonoBehaviour
{
//创建一个接口用于映射lua里的table
//也可以用clas或者struct, Dictionary<>, List<>
//各个映射的优劣可以看下XLUA教程文档
[CSharpCallLua]
public interface ICalc
{
int Add(int a, int b);
int Mult { get; set; }
}
//映射Lua中的方法
[CSharpCallLua]
public delegate ICalc CalcNew(int mult, params string[] args);
private string script = @"
local calc_mt = {
__index = {
Add = function(self, a, b)
return (a + b) * self.Mult
end
}
}
Calc = {
New = function (mult, ...)
print(...)
return setmetatable({Mult = mult}, calc_mt)
end
}
";
// Use this for initialization
void Start()
{
LuaEnv luaenv = new LuaEnv();
Test(luaenv);//调用了带可变参数的delegate,函数结束都不会释放delegate,即使置空并调用GC
luaenv.Dispose();
}
void Test(LuaEnv luaenv)
{
luaenv.DoString(script);
//获得Calc表中的New方法,映射到委托
CalcNew calc_new = luaenv.Global.GetInPath<CalcNew>("Calc.New");
//运行委托获得设置元表过后的table,映射到接口,对应Add方法和Mult属性,设置Mult为10
ICalc calc = calc_new(10, "hi", "john"); //constructor
Debug.Log("sum(*10) =" + calc.Add(1, 2));
//修改Mult
calc.Mult = 100;
Debug.Log("sum(*100)=" + calc.Add(1, 2));
}
// Update is called once per frame
void Update()
{
}
}