数据读取 修改参数
一些lua属性的调用 修改
——————————————————————————————————————————————————————
原文:
using UnityEngine;
using System.Collections.Generic;
using LuaInterface;
public class AccessingLuaVariables : MonoBehaviour
{
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 ()
{
#if UNITY_5 || UNITY_2017 || UNITY_2018
Application.logMessageReceived += ShowTips;
#else
Application.RegisterLogCallback(ShowTips);
#endif
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();
}
private void OnApplicationQuit()
{
#if UNITY_5 || UNITY_2017 || UNITY_2018
Application.logMessageReceived -= ShowTips;
#else
Application.RegisterLogCallback(null);
#endif
}
string tips = null;
void ShowTips(string msg, string stackTrace, LogType type)
{
tips += msg;
tips += "\r\n";
}
void OnGUI()
{
GUI.Label(new Rect(Screen.width / 2 - 300, Screen.height / 2 - 200, 600, 400), tips);
}
}
————————————————————————————————————————————————————————
首先我尝试了一下var2read 的修改 也就是变量的修改方式
尝试如下(注:为了不影响其他内容,在上一脚本进行修改尝试)
private string script =
@" function luaFunc(num)
return num+1
end
test={}
test.luaFunc=luaFunc
var2read = 1 //初次定义
var2read2 = ‘hi’ //初次定义
";
LuaFunction luaFunc = null;
LuaState lua = null;
string tips = null;
void Start()
{
#if UNITY_5 || UNITY_2017 || UNITY_2018
Application.logMessageReceived += ShowTips;
#else
Application.RegisterLogCallback(ShowTips);
#endif
new LuaResLoader();
lua = new LuaState();
Debugger.Log("textxxxxxxxxxxxx: {0}", lua["var2read"]); //查看原值
lua["var2read"] = 11;
Debugger.Log("textxxxxxxxxxxxx: {0}", lua["var2read"]); //查看赋值是否成功
Debugger.Log("textxxxxxxxxxxxx: {0}", lua["var2read"].GetType()); //查看属性类型
Debugger.Log("textxxxxxxxxxxxx: {0}", lua["var2read2"]); //查看原值
lua["var2read2"] = "haha";
Debugger.Log("textxxxxxxxxxxxx: {0}", lua["var2read2"]); //查看赋值是否成功
Debugger.Log("textxxxxxxxxxxxx: {0}", lua["var2read2"].GetType()); //查看属性类型
输出内容
结果是读取原值为空,赋值后正常显示,类型非全部字符串类型
查看了下原输出结果, 发现原来项目可以输出Lua定义的内容,
输出的内容是在 lua.DoString(script);后面进行输出,推断开始的时候空间为自行开辟的,读取信息后才为指定的空间
void Start()
{
#if UNITY_5 || UNITY_2017 || UNITY_2018
Application.logMessageReceived += ShowTips;
#else
Application.RegisterLogCallback(ShowTips);
#endif
new LuaResLoader();
lua = new LuaState();
Debugger.Log("textxxxxxxxxxxxx: {0}", lua["var2read3"]);
Debugger.Log("textxxxxxxxxxxxx: {0}", lua["var2read"]); //查看原值
lua["var2read"] = 11;
Debugger.Log("textxxxxxxxxxxxx: {0}", lua["var2read"]); //查看赋值是否成功
Debugger.Log("textxxxxxxxxxxxx: {0}", lua["var2read"].GetType()); //查看属性类型
Debugger.Log("textxxxxxxxxxxxx: {0}", lua["var2read2"]); //查看原值
lua["var2read2"] = "haha";
Debugger.Log("textxxxxxxxxxxxx: {0}", lua["var2read2"]); //查看赋值是否成功
Debugger.Log("textxxxxxxxxxxxx: {0}", lua["var2read2"].GetType()); //查看属性类型
lua.Start();
DelegateFactory.Init();
lua.DoString(script);
Debugger.Log("textxxxxxxxxxxxxvar2read: {0}", lua["var2read"]); //查看原值
Debugger.Log("textxxxxxxxxxxxxvar2read2: {0}", lua["var2read2"]); //查看原值
结果为
做的时候遇到一个小BUG:var2read2 输出为空 var2read正常,查看了下lua定义区域,发现字符串少了单引号
语法错误,导致无法识取到赋值。
————————————————————————————————————————————————————————
LuaFunction func = lua["TestFunc"] as LuaFunction;将lua方法转换成C#,之后通过LuaFunction.Call进行调用
LuaFunction.Call方法有多种重载方式
尝试给方法进行赋值,但无效,因方法未调用传入的参数。 进行修改lua结构,及代码模块,进行传参尝试具体如下:
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
function TestFunc2(num)
if(num<10)then
print('get func by variable')
else
print('get func by variable big number')
end
end
";
LuaFunction func = lua["TestFunc2"] as LuaFunction;
func.Call<int>(5);
func.Dispose();
LuaFunction func2 = lua["TestFunc2"] as LuaFunction;
func2.Call<int>(20);
func2.Dispose();
结果第一次输出原文,第二次输出big number
————————————————————————————————————————————————————————
表
对于源码进行一些修改尝试
private string script =
@"
print('Objs2Spawn is: '..Objs2Spawn)
var2read = 42
varTable = {1,2,3}
varTable.default = 2
varTable.map = {6,7}
varTable.map.default = 1
varTable.map.name = 'map'
meta = {name = 'meta'}
setmetatable(varTable, meta)
function TestFunc(strs)
print('get func by variable')
end
function TestFunc2(num)
if(num<10)then
print('get func by variable')
else
print('get func by variable big number')
end
end
";
for (int i = 1; i <= table.Length; i++)
{
Debugger.Log(" {0}----{1}", i, table[i]); //输出表内容
Debugger.Log(" {0}-type---{1}", i, table[i].GetType());//类型
}
Debugger.Log(" {0}----{1}", "xxx01----", table.name); //赋值前
table.name = "xxx";
Debugger.Log(" {0}----{1}", "xxx02----", table.name); //赋值后
Debugger.Log(" {0}----{1}", "xxx03----", table["default"]); //赋值前
table["default"] = 3;
Debugger.Log(" {0}----{1}", "xxx04----", table["default"]); //赋值后
Debugger.Log(" {0}----{1}", "xxx05----", table); //表
Debugger.Log(" {0}----{1}", "xxx06----", table["map"]); //表
LuaTable table2 = lua.GetTable("varTable.map"); //获取表
for (int i = 1; i <= table2.Length; i++)
{
Debugger.Log(" {0}----{1}", i, table2[i]); //输出表内容
Debugger.Log(" {0}-name---{1}", i, table[i].GetType());//类型
}
————————————————————————————————————————————————————————
table.AddTable("newmap");----------------------------------添加一个表名
LuaTable table1 = (LuaTable)table["newmap"];---------------创建一个表的实例
table1.Dispose();------------------------------------------表的数据清空
____________________________________________________________________________________________________
表信息的传递
lua
meta = {name = 'newName'}
setmetatable(varTable, meta)
c#
table1 = table.GetMetaTable();
————————————————————————————————————————————————————————