xlua食用手册

加载lua脚本的方法
方法一

		LuaEnv env = new LuaEnv();
        env.DoString("require('Welcome')");

调用env.DoString(),就可以执行lua语法了,这里建议通过lua中require的方法调用另一个脚本,避免了大量字符串的产生
xlua中使用require时,会默认查找Resources文件夹下的文件,如果查找不到会报错 并且在Resouces文件夹中的只能命名为.txt后缀或其他,不能使用lua后缀,这可能由于xlua使用了Resources.Load来加载文件 所以这种方式不是很方便
方法二
注意AddLoader要写在DoString前面

		LuaEnv env = new LuaEnv();
        env.AddLoader(Test);
        env.DoString("require('Welcome')");

添加一行AddLoader(),其中参数如下
在这里插入图片描述
AddLoader参数为一个委托,委托参数是文件的名字,返回byte数组是代码的具体内容
Test具体内容为

    /// <summary>
    /// 重定向lua脚本路径
    /// </summary>
    /// <param name="filePath">文件的名字</param>
    /// <returns>返回的是脚本中的具体代码</returns>
    private byte[] Test(ref string filePath)
    {
        string myPath = Application.dataPath + "/LuaScripts/" + filePath + ".lua";
        byte[] codes = null;
        if(File.Exists(myPath))
        {
            codes = File.ReadAllBytes(myPath);
            Debug.Log("代码加载成功");
        }
        else
        {
            Debug.LogError("查找不到路径!--" + myPath);
        }
        
        return codes;
    }

使用IO流读取路径下的代码,并返回
这样就可以实现任意路径下的加载lua脚本
小结:xlua脚本路径查询规则:先通过AddLoader查找自定义路径,如果自定义路径查询不到,那么会回到Resources文件夹中查找,如果还是查找不到,就会报错

C#调用Lua

C#方接收Lua的表时,可以有三种方法:
1.使用Class或Struct接收:这种方法不需要生成代码,采用值拷贝,不推荐
2.使用Interface接收:这种方法需要生成代码,采用地址拷贝,推荐
3.使用LuaTable接收:不需要生成代码,性能消耗大,不推荐

C#方接收Lua函数时,可以有两种方法:
1.使用委托接收:需要生成代码(给Aciton添加CSharpCallLua)
2.使用LuaFunction接收:不需要生成代码,不推荐

C#接收有多返回值的Lua函数时,以下以通过委托接收为例,接收规则如下:
1.参数需要使用out 或者 ref来接收作为返回值。
2.如果Lua函数带参数,则C#委托的第一个参数就是Lua的参数。
3.如果C#委托是有返回值的,那么返回值为lua函数里返回的第一个参数,C#委托后面的参数依次为Lua函数的返回值。
4.如果C#委托没有返回值的,那么委托的参数从前往后,依次作为Lua函数的返回值。
在这里插入图片描述

Lua调用C#

1.Lua层拿到的是引用
有一点需要明确的是,Lua拿到的C#的对象是通过引用传递的,也就是说改变了lua端的数据,C#端会一起跟着改变
在这里插入图片描述
[图3]
如图3,StaticTest类里有一个t1对象,t1对象有SayHello委托,为这个委托添加一个函数,在C#层调用这个t1对象的SayHello委托,是可以调用到的

2.Lua调用C#List
在这里插入图片描述
[图4]
如图4,lua调用C#的列表时,只需要像正常lua数组一样使用就可以,但是记住因为是C#的列表,所以索引是从0开始的

3.Lua调用C#Dictionary
Lua没办法直接用key索引C#字典,但是xlua提供了get_Item和set_Item方法可以拿到字典的value
Lua端可以直接遍历这个字典
在这里插入图片描述
[图5]
如图5,使用pairs可以正确打印k v; 43行直接用key索引结果为nil; 44行使用get_Item可以获取value; 47行使用TryGetValue可以正确获取value,这里注意C#的TryGetValue第二个参数为out类型,lua中没有out类型,无法传入引用,而是作为返回值返回。 所以int为nil

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值