展示了C#如何访问Lua中的变量或table。
「1」代码
操作代码如下:
private string script =
@"
print('Objs2Spawn is: '..Objs2Spawn)
var2read = 42
varTable = {1,2,3,4,5}
varTable.default = 1
varTable.map = {}
varTable.map.name = 'map'
meta = {name = 'meta'}
setmetatable(varTable, meta)
function TestFunc(strs)
print('get func by variable')
end
";
void Start ()
{
new LuaResLoader();
LuaState lua = new LuaState();
lua.Start();
lua["Objs2Spawn"] = 5;
lua.DoString(script);
//通过LuaState访问
Debugger.Log("Read var from lua: {0}", lua["var2read"]);
Debugger.Log("Read table var from lua: {0}", lua["varTable.default"]); //LuaState 拆串式table
LuaFunction func = lua["TestFunc"] as LuaFunction;
func.Call();
func.Dispose();
//cache成LuaTable进行访问
LuaTable table = lua.GetTable("varTable");
Debugger.Log("Read varTable from lua, default: {0} name: {1}", table["default"], table["map.name"]);
table["map.name"] = "new"; //table 字符串只能是key
Debugger.Log("Modify varTable name: {0}", table["map.name"]);
table.AddTable("newmap");
LuaTable table1 = (LuaTable)table["newmap"];
table1["name"] = "table1";
Debugger.Log("varTable.newmap name: {0}", table1["name"]);
table1.Dispose();
table1 = table.GetMetaTable();
if (table1 != null)
{
Debugger.Log("varTable metatable name: {0}", table1["name"]);
}
object[] list = table.ToArray();
for (int i = 0; i < list.Length; i++)
{
Debugger.Log("varTable[{0}], is {1}", i, list[i]);
}
table.Dispose();
lua.CheckTop();
lua.Dispose();
}
「2」需要了解的部分
-
lua["Objs2Spawn"] = 5;
—— LuaState访问lua_G表中的变量Objs2Spawn。
_G表是保存了lua所用的所有全局函数和全局变量的一张表,详见lua _G 表。
「3」值得注意的方法
-
LuaState.GetTable
从lua中获取一个lua table, 可以串式访问比如lua.GetTable("varTable.map.name") 等于 varTable->map->name
-
LuaTable
支持this操作符,但此this不支持串式访问。比如table["map.name"] "map.name" 只是一个key,不是table->map->name
-
LuaTable.GetMetaTable()
可以获取当前table的metatable -
LuaTable.ToArray()
获取数组表中的所有对象存入到object[]表中 -
LuaTable.AddTable(name)
在当前的table表中添加一个名字为name的表 -
LuaTable.GetTable(key)
获取t[key]值到c#, 类似于 lua_gettable -
LuaTable.SetTable(key, value)
等价于t[k] = v的操作, 类似于lua_settable -
LuaTable.RawGet(key)
获取t[key]值到c#, 类似于 lua_rawget -
LuaTable.RawSet(key, value)
等价于t[k] = v的操作, 类似于lua_rawset
顺便一提,lua_rawget 这些都是 Lua C API,Lua 作为一门嵌入式语言,提供了完备的 C API 供 Lua 代码和宿主程序交互,我还没有用过,这里就不说了。
最后看一下varaTable的形态吧
key | Value | Value如果是Table的K-V |
---|---|---|
1 | 1 | - |
2 | 2 | - |
3 | 3 | - |
4 | 4 | - |
5 | 5 | - |
'deafult' | 1 | - |
'map' | table | 'name' - 'map'改为 'name' - 'new' |
(新增) 'newmap' | table | 'name' - 'table1' |
以下为元表meta | - | - |
'name' | 'meta' | - |
网友评论