美文网首页
ToLua的Example示例学习笔记04_AccessingL

ToLua的Example示例学习笔记04_AccessingL

作者: 凌枫望星月 | 来源:发表于2020-05-11 11:36 被阅读0次

    展示了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' -

    相关文章

      网友评论

          本文标题:ToLua的Example示例学习笔记04_AccessingL

          本文链接:https://www.haomeiwen.com/subject/tdwynhtx.html