xLua C#访问lua,获取lua全局变量,获取table并调用lua内函数(四)

lua文件放在Resources目录下CShapeCallLua.lua.txt

a=10
b="stringTest"
c=true

Unity中这样去获取这三个全局变量

using UnityEngine;
using XLua;

public class CShapeCallLua : MonoBehaviour {

    LuaEnv luaEnv;
	// Use this for initialization
	void Start () {
        luaEnv = new LuaEnv();

        luaEnv.DoString("require 'CShapeCallLua'");

        var a= luaEnv.Global.Get<int>("a");
        var b= luaEnv.Global.Get<string>("b");
        var c = luaEnv.Global.Get<bool>("c");
        print(a);
        print(b);
        print(c);

        luaEnv.Dispose();
    }
}

控制台也是正常输出了三个值
在这里插入图片描述

上面的三个值都是类型比较简单的值,那怎么取出table的值呢

先在lua中定义一个table

student={
	name="fluency",
	age=21
}

1. 第一种方法使用 Class 或 struct
这种方法虽然简单,但是开销比较大,而且在C#或者Lua中修改了table的值,互相都不传递这个值
C#中定义一个相同的class或struct

public struct Student
{
    public string name;
    public int age;
}
using UnityEngine;
using XLua;

public class CShapeCallLua : MonoBehaviour
{

    LuaEnv luaEnv;
    // Use this for initialization
    void Start()
    {
        luaEnv = new LuaEnv();

        luaEnv.DoString("require 'CShapeCallLua'");
        
        var student = luaEnv.Global.Get<Student>("student");

        print(student.name + " " + student.age);
        luaEnv.Dispose();
    }
}

在这里插入图片描述
2. 使用Interface
需要给接口添加特性[CSharpCallLua]
可以通过接口修改Table内的属性
可以通过接口访问Table中的函数

给table添加了一个带参数的函数

student={
	name="fluency",
	age=21,
	skill=function(self,a,b)
	print(a+b)
	print("我会飞")
	end
}

定义接口,这次使用接口访问

[CSharpCallLua]//需要拥有这个特性才可以访问lua
interface IStudent
{
    string name { get; set; }
    int age { get; set; }
    void skill(int a,int b);
}
using UnityEngine;
using XLua;

public class CShapeCallLua : MonoBehaviour
{

    LuaEnv luaEnv;
    // Use this for initialization
    void Start()
    {
        luaEnv = new LuaEnv();

        luaEnv.DoString("require 'CShapeCallLua'");
        var student = luaEnv.Global.Get<IStudent>("student");

        print(student.name + " " + student.age);
        student.skill(1,2);//调用table的函数
        student.name = "LiuChang";//修改lua内table的值
        luaEnv.DoString("print(student.name)");//查看修改后的值
        luaEnv.Dispose();
    }
}

在这里插入图片描述
3. 使用Dictionary和List
局限性比较大,Dictionary只能取出带有key的值,List只能取出没有key的值
如果表内数据比较符合这个需求,就可以使用Dictionary和List

DIctionary表

dic={
	a=1,b=2,c=3,d=true,e="dicstr"
	}
 var dic = luaEnv.Global.Get<Dictionary<string,object>>("dic");
        foreach (var item in dic)
        {
            print(item.Key + " - " + item.Value);
        }

在这里插入图片描述
List表

listtable={
		1,3,4,false,"liststr",0.1
	}
var list = luaEnv.Global.Get<List<object>>("listtable");
        foreach (var item in list)
        {
            print(item);
        }

在这里插入图片描述
4. 通过XLua内置的方法LuaTable来获取
这个方法不常用,虽然可以不用生成代码,但是在速度上和interface不在一个级别

var tab = luaEnv.Global.Get<LuaTable>("student");
        print(tab.Get<string>("name"));
        print(tab.Get<int>("age"));

在这里插入图片描述
最后还是推荐使用第二种方式来读取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贪小心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值