首先在Lua脚本中写一些function:
一:映射到委托(推荐使用)
在CS中:
1.访问无参函数:
using System;
using UnityEngine;
using XLua;
public class CallLua : MonoBehaviour
{
private void Start()
{
LuaEnv luaenv = new LuaEnv();
luaenv.DoString("require 'CsCallLua'");
Action act = luaenv.Global.Get<Action>("fun1");
act(); //输出:LUA:fun1
act = null;
luaenv.Dispose();
}
}
2.访问有参函数:
运行后会报错:这个类型必须添加[CSharpCallLua]的标识。
所以我们需要映射到委托中,之后添加[CSharpCallLua]的标识
正确的完整代码如下:
using UnityEngine;
using XLua;
using System;
public class CallLua: MonoBehaviour
{
private void Start()
{
LuaEnv luaenv = new LuaEnv();
luaenv.DoString("require 'CallLua'");
Add act = luaenv.Global.Get<Add>("fun2");
act(1, 2); //输出:LUA:3
act = null;
luaenv.Dispose();
}
[CSharpCallLua]
delegate void Add(int a, int b);
}
3.访问有多个返回值的函数:
Lua中的函数可以有多个返回值,而C#中的函数最多只能有一个返回值,那么如果Lua中的函数在有多个返回值的情况下,C#如何获取到值呢?
可以映射到out或者ref参数来获取:
using UnityEngine;
using XLua;
using System;
public class CallLua: MonoBehaviour
{
private void Start()
{
LuaEnv luaenv = new LuaEnv();
luaenv.DoString("require 'CsCallLua'");
Add act = luaenv.Global.Get<Add>("fun3");
int res;
int returnNum1, returnNum2;
res = act(1, 2, out returnNum1, out returnNum2);
print(res); //输出:3
print(returnNum1 + "-" + returnNum2); //输出:1-2
act = null;
luaenv.Dispose();
}
[CSharpCallLua]
delegate int Add(int a, int b, out int returnNum1, out int returnNum2);
}
注意映射之后的Action对象引用了Lua虚拟机,所以使用完需要将Action对象置为空,不然会报错:
二:映射到LuaFunction
与LuaTable相同,xLua也提供了一种直接访问Lua中函数的方法,但是性能低,不推荐使用
在CS中:
1.访问无参函数:
using UnityEngine;
using XLua;
using System;
public class CallLua: MonoBehaviour
{
private void Start()
{
LuaEnv luaenv = new LuaEnv();
luaenv.DoString("require 'CsCallLua'");
LuaFunction fun = luaenv.Global.Get<LuaFunction>("fun1");
fun.Call(); //输出:LUA:fun1
luaenv.Dispose();
}
}
2.访问有参函数
using UnityEngine;
using XLua;
using System;
public class CallLua: MonoBehaviour
{
private void Start()
{
LuaEnv luaenv = new LuaEnv();
luaenv.DoString("require 'CsCallLua'");
LuaFunction fun = luaenv.Global.Get<LuaFunction>("fun2");
fun.Call(1,2); //输出:LUA:3
luaenv.Dispose();
}
}
3.访问有返回值的函数
using UnityEngine;
using XLua;
using System;
public class CallLua: MonoBehaviour
{
private void Start()
{
LuaEnv luaenv = new LuaEnv();
luaenv.DoString("require 'CsCallLua'");
LuaFunction fun = luaenv.Global.Get<LuaFunction>("fun3");
object[] o = fun.Call(1, 2);
foreach (object item in o)
{
print(item); //输出:3
//输出:1
//输出:2
}
luaenv.Dispose();
}
}