ToLua学习笔记(四) Example 04 AccessingLuaVariables

22 篇文章 0 订阅
11 篇文章 1 订阅

ToLua学习笔记(四) Example 04 AccessingLuaVariables

转载请注明出处四川包邮

顾名思义,Example 04将会告诉我们如何访问Lua代码中的变量

代码

using UnityEngine;
using System.Collections.Generic;
using LuaInterface;

public class AccessingLuaVariables : MonoBehaviour 
{
    private string script =
        @"
            Objs2Spawn = 10
            print('Objs2Spawn is: '..Objs2Spawn)
            var2read = 42
            varTable = {1,2,3,4,5}
            varTable.default = 1
            varTable.map = {}
            varTable.map.name = 'ma12p'

            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["Objs2Spawn"] = 5;
        lua.DoString(script);

        //通过LuaState访问
        Debugger.Log("Read var from lua: {0}", lua["var2read"]);
        lua["var2read"] = 1;
        Debugger.Log("Read var from lua: {0}", lua["var2read"]);
        Debugger.Log("Read table var from lua: {0}", lua["varTable.default"]);

        // 测试获取map.name
        Debugger.Log("Get varTable.map.name: {0}", lua["varTable.map.name"]);

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

        table.Dispose();                        
        lua.CheckTop();
        lua.Dispose();
    }
}

c#传递给lua

    -lua代码
    -..lua中的字符串连接变量
    print('Objs2Spawn is: '..Objs2Spawn)
     // c#代码
     LuaState lua = new LuaState();
     lua.Start();

     // 在Lua中定义一个变量Objs2Spawn,同时赋值5
     lua["Objs2Spawn"] = 5;
     lua.DoString(script);

执行后的结果会打印出
[string “LuaState.DoString”]:2: Objs2Spawn is: 5

如果我们在lua中添加一句
Objs2Spawn = 10
会怎么样??

答案就是会打印出
[string “LuaState.DoString”]:2: Objs2Spawn is: 10

原因是我们在执行c#语句DoString(script);前传递给lua中的值5已经被lua代码中的Objs2Spawn = 10重新赋值了.

通过LuaState访问

    Debugger.Log("Read var from lua: {0}", lua["var2read"]);
    // 重新赋值
    lua["var2read"] = 1;
    Debugger.Log("Read var from lua: {0}", lua["var2read"]);
    Debugger.Log("Read table var from lua: {0}", lua["varTable.default"]);

直接和我们的Dictionary或者Table用法一样

cache成LuaTable进行访问

直接获取一个Table然后就和c#中用法一样即可.

    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

    table.AddTable("newmap");
    LuaTable table1 = (LuaTable)table["newmap"];
    table1["name"] = "table1";
    Debugger.Log("varTable.newmap name: {0}", table1["name"]);
    table1.Dispose();

获取数组

想要获取varTable = {1,2,3,4,5}

直接使用object[] list = table.ToArray();即可

获取元表(关于元表的用法请自行百度)

    table.GetMetaTable();

最后一定要记得Dispose.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值