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


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

1
2
3
a=10
b="stringTest"
c=true

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

1
2
3
4
student={
    name="fluency",
    age=21
}

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

1
2
3
4
5
public struct Student
{
    public string name;
    public int age;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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添加了一个带参数的函数

1
2
3
4
5
6
7
8
student={
    name="fluency",
    age=21,
    skill=function(self,a,b)
    print(a+b)
    print("我会飞")
    end
}

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

1
2
3
4
5
6
7
[CSharpCallLua]//需要拥有这个特性才可以访问lua
interface IStudent
{
    string name { get; set; }
    int age { get; set; }
    void skill(int a,int b);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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表

1
2
3
dic={
    a=1,b=2,c=3,d=true,e="dicstr"
    }

1
2
3
4
5
 var dic = luaEnv.Global.Get<Dictionary<string,object>>("dic");
        foreach (var item in dic)
        {
            print(item.Key + " - " + item.Value);
        }

在这里插入图片描述
List表

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

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

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

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