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")); |

最后还是推荐使用第二种方式来读取