C#中调用Lua

//test.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
using System;
using System.IO;

class TableToClass
{
    public int a;
    public int b;
}

[CSharpCallLua]
interface TableToInterface
{
    int A { get; set; }

    int B { get; set; }

    int Sum(int a, int b);
}

[CSharpCallLua]
delegate int Func(int a, int b);
[CSharpCallLua]
delegate int FuncToDeleWithResult(int a, int b, out int A, out int B);

public class Test : MonoBehaviour
{

    void Start()
    {
        //创建lua虚拟机
        LuaEnv env = new LuaEnv();
        //为当前虚拟机创建自定义的loader方法
        env.AddLoader(LoaderBySelf);

        //将lua文件转换成字符串
        //通过虚拟机运行字符串
        //当虚拟机执行require函数时,会调用Xlua中的loader(CustomLoader)函数,包含默认的,程序员也可以自定义
        //当虚拟机执行require函数时会执行当前的所有loader,只要其中一个loader返回值不为空,其余的loader不执行
        //如果所有loader都为空,报错
        env.DoString("require 'XLuaReadTest.lua'");

        //在C#中使用Lua虚拟机访问Lua脚本中的全局变量
        //如果变量类型不匹配 赋值会失败
        //lua中的字段 number(int  double float)  sring  boolen
        int a = env.Global.Get<int>("a");
        print(a);

        //关于lua中表的映射
        //1、将table映射成类,需要访问table中的函数要使用interface来映射
        TableToClass toClass = env.Global.Get<TableToClass>("TableToClass");
        print("将table映射成类   ");
        print(toClass.a + " " + toClass.b);

        //2、将table映射成interface
        TableToInterface toInterface = env.Global.Get<TableToInterface>("TableToInterface");
        print(toInterface.A + " " + toInterface.B);
        print("将table映射成interface   " + toInterface.Sum(toInterface.A, toInterface.B));

        //3、将table映射成List或Dictionary
        //将table转换成list :只能够获取table中没有指定键的元素
        List<int> toList = env.Global.Get<List<int>>("TableToListOrDict");
        print("table映射到list");
        foreach (int ele in toList)
        {
            print(ele);
        }
        //将table转换成Dictionary:只能够获取到table中具有指定键,并且值的类型一致的元素
        Dictionary<string, string> toDict = env.Global.Get<Dictionary<string, string>>("TableToListOrDict");
        print("table映射到dictionary");
        foreach (KeyValuePair<string, string> ele in toDict)
        {
            print(ele);
        }

        //4、将lua中的table映射成委托(获取lua中全局函数)
        //需要添加 CSharpCallLua特性
        //当使用结束后,需要将委托对象置空,才能够正常关闭虚拟机
        //当Lua中的函数包含多个返回值时,可以使用out 来接收剩下的返回值
        //Lua函数中第一个返回值对应C#函数中的返回值,其他的返回值依次对应C#参数列表中的out参数
        Func sum = env.Global.Get<Func>("sum");
        print("调用lua全局函数    " + sum(1, 2));
        sum = null;

        FuncToDeleWithResult toDeleResult = env.Global.Get<FuncToDeleWithResult>("FuncToDeleWithResult");
        int m, n, s;
        s = toDeleResult(1, 2, out m, out n);
        print("多返回值使用out参数接收    " + m + "+"+ n + "=" + s);
        toDeleResult = null;

        env.Dispose();
    }

    //自定义loader,直接加载lua文件
    public byte[] LoaderBySelf(ref string filepath)
    {
        //创建路径
        string path = Application.dataPath + "/" + filepath;

        //判断文件是否存在
        if (File.Exists(path))
        {
            //将文件按照UTF-8格式解析成byte[]
            return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));
        }
        else
        {
            //文件不存在返回null
            return null;
        }
    }
}
--XLuaReadTest.lua

a = 1

TableToClass = {a = 1, b = 2}

TableToInterface = {A = 3, B = 4}
function TableToInterface:Sum(a, b)
	return a + b
end

TableToListOrDict = {a=15,b=20,c="LKR",d=45.123 ,e=true,1,25,78,9,6,"WL"}

function sum(a,b)
	return a + b
end

function FuncToDeleWithResult(a,b)
	return a+b,a,b
end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值