XLua 入门之 C# 访问 Lua

Posted Unity程序猿的学习日常

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XLua 入门之 C# 访问 Lua相关的知识,希望对你有一定的参考价值。


一、获取全局基本数据类型


C# 获取 Lua 中的全局基本数据类型,主要通过 LuaEnv.Global 就可以了。


首先创建 Lua 脚本,内容如下:


print('test lua')-- 全局变量声明a = 1b = '2'c = true


在 C# 中可以这样获取到 Lua 全局变量:


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


二、获取到全局的 Table


在 C# 中要获取 Lua 中的全局 Table 的方式有很多种,不同的获取方式应对不同的情况。


首先使用 Class 或者 Struct 来映射 Lua 中的全局 Table。


Lua 文件中的代码如下:


-- 全局 tabled = { a1 = 1, b1 = '2', c1 = true, d1 = 123, 11, 22, 33, add = function(self,a,b) return a + b end}


对应的 C# 代码中可以这样来获取:


/**必须和 lua 中的 table 变量名一一对应上,有无参构造函数,table 属性对于或者少于 class*/public class MyClass{ public int a1; public string b1; public bool c1; public float e;}
MyClass mc = luaEnv.Global.Get<MyClass>("d");Debug.Log(mc.a1);Debug.Log(mc.b1);Debug.Log(mc.c1);Debug.Log(mc.e);//不存在的属性就直接访问的默认值 mc.a1 = 111; // 不会互相修改Debug.Log(luaEnv.Global.Get<MyClass>("d").a1);


这里定义的 MyClass 是一个无参构造函数的类,且类的 public 属性对应着 table 的字段,在 XLua 中会 new 一个实例出来,并将 Lua 中的 Table 属性值赋值到 MyClass 中,但是这个过程只是值拷贝,也就是说在 C# 中操作 MyClass 的属性不会影响到 Lua 的 Table。在 Table 中的属性可以多于或者少于 MyClass 中的属性。


值拷贝的方式除了上面的 Class ,也可以通过 Dictionary<>,List<> 来实现(比较偷懒):


Dictionary<string, int> dic = luaEnv.Global.Get<Dictionary<string, int>>("d");Debug.Log(dic["a1"]);Debug.Log(dic["b1"]);//找不到 ,lua 中 b1 的值是 stringDebug.Log(dic["d1"]);
List<int> lst = luaEnv.Global.Get<List<int>>("d");// 过滤只剩 数字的属性数据Debug.Log(lst.Count);//3 个Debug.Log(lst[0]);Debug.Log(lst[1]);


如上的字典和列表可以说是对 Lua 中的 Table 数据的过滤,如果 Table 中的数据比较复杂,那么它们就只能起到过滤的作用了(前提是 Table 下的 Key 和 value 类型相同)。


在 XLua 中除了值拷贝的方式还存在其它方式获取 Table,也就是我们常说的引用,采取引用的方式就可以获取和更改 Lua 中 Table 的数据了。


XLua 中的引用也存在两种路径实现:a、使用 Interface  b、使用 LuaTable

使用 C# 中的 Interface 实现的方式如下:


[CSharpCallLua]public interface MyInterface{ int a1 { get; set; } string b1 { get; set; } int add(int a, int b);}
MyInterface mi = luaEnv.Global.Get<MyInterface>("d");Debug.Log(mi.a1);Debug.Log(mi.b1);int res = mi.add(1,1);Debug.Log(res);mi.a1 = 100;Debug.Log(luaEnv.Global.Get<MyInterface>("d").a1);//可以修改,访问 lua 函数


要使用 Interface 的话,先创建 MyInterface,这里跟 Class 差不多,添加了跟 Table 中相同的变量 a1 和 b1,另外增添了 Add 方法也是对应 Table 中的 Add 函数。这里需要注意的是使用 Interface 映射 Table 需要添加 [CSharpCallLua] 标签,这个标签用作 XLua 构建代码用的,XLua 会根据这个标签构建中间层代码来实现 Interface 和 Table 的映射。(带有标签之后就需要在 Unity 编辑器上进行代码构建了)



在 C# 代码中也是使用了 LuaEnv.Global 来访问的,MyInterface 声明属性都是可以 set 和 get 的,这也就可以在 C# 中修改 Lua 中 Table 属性了。


引用的另外一种途径就是使用 LuaTable,具体实现方式如下:


LuaTable table = luaEnv.Global.Get<LuaTable>("d");Debug.Log(table.Get<int>("a1"));Debug.Log(table.Get<string>("b1"));


使用 LuaTable 的方式就是不需要构建代码,因为没有用到标签,但是访问比较慢,而且没有类型检查。

以上是关于XLua 入门之 C# 访问 Lua的主要内容,如果未能解决你的问题,请参考以下文章

XLua 入门之 C# 访问 Lua

深入xLua实现原理之C#如何调用Lua

XLua系列讲解_XLua调用C#

lua热更框架之XLua

[Unity XLua]热更新XLua入门-俄罗斯方块实例篇

[xlua]探索笔记之协程