您的位置:首页 > 编程语言 > Lua

ToLua学习笔记(四) Example 04 AccessingLuaVariables

2016-07-06 12:33 316 查看

ToLua学习笔记(四) Example 04 AccessingLuaVariables

转载请注明出处四川包邮

ToLua学习笔记四 Example 04 AccessingLuaVariables
代码

c传递给lua

通过LuaState访问

cache成LuaTable进行访问
直接获取一个Table然后就和c中用法一样即可

添加Table

获取数组

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

最后一定要记得Dispose

顾名思义,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.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lua c# unity