tolua#的Examples-04_AccessingLuaVariables

关键代码:

    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 ()
     {        
        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"]);

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

代码贴的有点多了,这个例子主要是教用户如何在c#与lua直接传递变量数据, lua["Objs2Spawn"] = 5;直接设置lua里面一个全局变量Objs2Spawn并且给它赋值5,然后加载lua代码lua.DoString(script);并且直接打印print('Objs2Spawn is: '..Objs2Spawn)结果。

//通过LuaState访问
         Debugger.Log("Read var from lua: {0}", lua["var2read"]);
         Debugger.Log("Read table var from lua: {0}", lua["varTable.default"]);
其实就是直接通过luastate["varName"] 进行set/get操作,非常方便了。

LuaTable table = lua.GetTable("varTable"); 直接获取到lua中的一个table,然后直接访问里面的变量:
        Debugger.Log(".... default: {0} name: {1}", table["default"], table["map.name"]);
        table["map.name"] = "new";
        Debugger.Log("Modify varTable name: {0}", table["map.name"]);

还可以在c#这边添加一个新的table,然后进行设置访问即可。记得不用了dispose掉。
        table.AddTable("newmap");
        LuaTable table1 = (LuaTable)table["newmap"];
        table1["name"] = "table1";
        Debugger.Log("varTable.newmap name: {0}", table1["name"]);
        table1.Dispose();

还可以直接获取元表数据,并且打印出来table1 = table.GetMetaTable();

上一篇: tolua#的Examples-03_CallLuaFunction
下一篇: tolua#的Examples-05_LuaCoroutine
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 2 | 引用: 0 | 查看次数: -
狗头猫[2016-12-06 06:02 PM | | | 183.63.119.35 | del | 回复回复]
引用来自 oliver 引用来自 oliver
table["map.name"]貌似不是引用的table.map.name,因为Debugger.Log("Read varTable from lua, default: {0} name: {1}", table["default"], table["map.name"]);这句table["map.name"]打印出来的是空值

“map.name”被视为表名了,并没有这个表,而且__index也没有设置,改成(table["map"] as LuaTable)["name"]就行了
oliver[2016-06-08 06:37 PM | | | 119.37.12.100 | del | 回复回复]
table["map.name"]貌似不是引用的table.map.name,因为Debugger.Log("Read varTable from lua, default: {0} name: {1}", table["default"], table["map.name"]);这句table["map.name"]打印出来的是空值
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭