xLua(六)——C#访问Lua的function

首先在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();
    }
}

猜你喜欢

转载自blog.csdn.net/LLLLL__/article/details/89329717