首先在Lua脚本中写一些function
xLua(六)——C#访问Lua的function_lua

一:映射到委托(推荐使用)

——访问无参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
xLua(六)——C#访问Lua的function_c#_02
运行后会报错:这个类型必须添加[CSharpCallLua]的标识
xLua(六)——C#访问Lua的function_c#_03
所以我们需要映射到委托中,添加[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对象置为空,不然会报错
xLua(六)——C#访问Lua的function_c#_04


二:映射到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();
    }
}