- LuaState生命周期
- 获取使用lua方法
- 获取表和元表
- 使用协程
- 使用线程
- 使用lua创建C#对象
LuaState生命周期
LuaState lua = new LuaState();
lua.Start();
string hello =
@"
print('hello tolua#')
";
lua.DoString(hello, "HelloWorld.cs");
lua.CheckTop();
lua.Dispose();
lua = null;
获取使用lua方法
private string script =
@" function luaFunc(num)
return num + 1
end
test = {}
test.luaFunc = luaFunc
";
LuaFunction func = lua.GetFunction("test.luaFunc");
//LuaFunction func = lua["test.luaFunc"] as LuaFunction;
if (func != null)
{
//有gc alloc
object[] r = func.Call(123456);
Debugger.Log("generic call return: {0}", r[0]);
// no gc alloc
int num = CallFunc();
Debugger.Log("expansion call return: {0}", num);
}
int CallFunc()
{
func.BeginPCall();
func.Push(123456);
func.PCall();
int arg1 = func.CheckNumber();
func.EndPCall();
return arg1;
}
//1.通过“.” (点号)来使用非静态的变量以及静态的变量与方法
//2.通过'':“ (冒号)来使用非静态的方法
获取表和元表
private string script =
@"
varTable = {1,2,3,4,5}
varTable.map = {}
varTable.map.name = 'map1'
meta = {name = 'meta'}
setmetatable(varTable, meta)
";
LuaState lua = new LuaState();
lua.Start();
lua.DoString(script);
LuaTable table = lua.GetTable("varTable");
//不能使用table["map.name"]
Debug.log(((LuaTable)(table["map"]))["name"]);
table1 = table.GetMetaTable();
if (table1 != null)
{
Debugger.Log("varTable metatable name: {0}", table1["name"]);
}
使用协程
local coDelay = nil
function Delay()
local c = 1
while true do
coroutine.wait(1)
print("Count: "..c)
c = c + 1
end
end
function StartDelay()
coDelay = coroutine.start(Delay)
end
function StopDelay()
coroutine.stop(coDelay)
end
使用线程
local coDelay = nil
function Delay()
local c = 1
while true do
coroutine.wait(1)
print("Count: "..c)
c = c + 1
end
end
function StartDelay()
coDelay = coroutine.start(Delay)
end
function StopDelay()
coroutine.stop(coDelay)
end
使用lua创建C#对象
生成wrap文件,在C#脚本里bind到LuaState,
在lua中调用New方法
local newAccount = TestAccount.New(4,'艾弗',1)
//local newAccount = TestAccount(4,'艾弗',1)
LuaState.CheckTop()
LuaState.Collect()