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