ToLua学习笔记(七) Example 07 LuaThread
转载请注明出处四川包邮
本篇会讲述LuaThread用法
代码
using UnityEngine;
using System.Collections;
using LuaInterface;
public class TestLuaThread : MonoBehaviour
{
string script =
@"
-- function fib(n)
-- local a, b = 0, 1
-- while n > 0 do
-- --a = b, b = a + b
-- a, b = b, a + b
-- n = n - 1
-- end
-- return a
-- end
--简化一下方便理解
function fib(n)
a = n - 1
return a
end
function CoFunc(len)
print('Coroutine started')
local i = 0
for i = 0, len, 1 do
local flag = coroutine.yield(fib(i))
--没有就结束
if not flag then
break
end
end
print('Coroutine ended')
end
function Test()
local co = coroutine.create(CoFunc)
return co
end
";
LuaState state = null;
LuaThread thread = null;
void Start ()
{
state = new LuaState();
state.Start();
state.LogGC = true;
state.DoString(script);
LuaFunction func = state.GetFunction("Test");
func.BeginPCall();
func.PCall();
thread = func.CheckLuaThread();
thread.name = "LuaThread";
func.EndPCall();
func.Dispose();
func = null;
// 传参
thread.Resume(10);
}
void OnDestroy()
{
if (thread != null)
{
thread.Dispose();
thread = null;
}
state.Dispose();
state = null;
}
void Update()
{
state.CheckTop();
state.Collect();
// 每帧调用
if (thread != null && thread.Resume(true) == (int)LuaThreadStatus.LUA_YIELD)
{
object[] objs = thread.GetResult();
Debugger.Log("lua yield: " + objs[0]);
}
}
void OnGUI()
{
if (GUI.Button(new Rect(10, 10, 120, 40), "Resume Thead"))
{
if (thread != null && thread.Resume(true) == (int)LuaThreadStatus.LUA_YIELD)
{
object[] objs = thread.GetResult();
Debugger.Log("lua yield: " + objs[0]);
}
}
else if (GUI.Button(new Rect(10, 60, 120, 40), "Close Thread"))
{
if (thread != null)
{
thread.Dispose();
thread = null;
}
}
}
}
LuaThread用法
我将例子中的代码简化了一下,方便我们理解后面的.因为我在第一次看这个Example的时候也是一头雾水
-- function fib(n)
-- local a, b = 0, 1
-- while n > 0 do
-- --a = b, b = a + b
-- a, b = b, a + b
-- n = n - 1
-- end
-- return a
-- end
--简化一下方便理解
function fib(n)
a = n - 1
return a
end
通过LuaFunction.CheckLuaThread();
我们可以获取LuaThread
调用LuaThread.Resume(10);
传参
之后在每次执行LuaThread.Resume(true)
就可以唤醒线程,让线程执行
之后可以看到按顺序输出了lua yield: 0-9
总结
创建线程LuaFunction.CheckLuaThread();
LuaThread.Resume(10);
传参给lua中的线程CoFunc
唤醒线程LuaThread.Resume(true)