XLua 入门之 C# 访问 Lua
Posted Unity程序猿的学习日常
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XLua 入门之 C# 访问 Lua相关的知识,希望对你有一定的参考价值。
一、获取全局基本数据类型
C# 获取 Lua 中的全局基本数据类型,主要通过 LuaEnv.Global 就可以了。
首先创建 Lua 脚本,内容如下:
print('test lua')
-- 全局变量声明
a = 1
b = '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 文件中的代码如下:
全局 table
d = {
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 的值是 string
Debug.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 实现的方式如下:
[ ]
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的主要内容,如果未能解决你的问题,请参考以下文章