ToLua学习笔记(五) Example 05 LuaCoroutine
转载请注明出处四川包邮
这一篇文章主要是通过Example讲解searchpath,require,dofile.
代码
using UnityEngine;
using System;
using System.Collections;
using LuaInterface;
//例子5和6展示的两套协同系统勿交叉使用,此为推荐方案
public class TestCoroutine : MonoBehaviour
{
public TextAsset luaFile = null;
private LuaState lua = null;
private LuaLooper looper = null;
void Awake ()
{
lua = new LuaState();
lua.Start();
// 不执行绑定无法使用Wrap的函数
LuaBinder.Bind(lua);
// 添加了这个组件后,它会在c#每一帧驱动lua的协同完成所有的协同功能,这里的协同已经不单单是lua自身功能,而是tolua#模拟unity的所有的功能.
looper = gameObject.AddComponent<LuaLooper>();
looper.luaState = lua;
lua.DoString(luaFile.text, "TestCoroutine.cs");
LuaFunction f = lua.GetFunction("TestCortinue");
f.Call();
f.Dispose();
f = null;
}
void OnDestroy()
{
// 记得执行销毁
looper.Destroy();
lua.Dispose();
lua = null;
}
void OnGUI()
{
if (GUI.Button(new Rect(50, 50, 120, 45), "Start Counter"))
{
LuaFunction func = lua.GetFunction("StartDelay");
func.Call();
func.Dispose();
}
else if (GUI.Button(new Rect(50, 150, 120, 45), "Stop Counter"))
{
LuaFunction func = lua.GetFunction("StopDelay");
func.Call();
func.Dispose();
}
}
}
lua脚本
function fib(n)
local a, b = 0, 1
while n > 0 do
a, b = b, a + b
n = n - 1
end
return a
end
function CoFunc()
print('Coroutine started')
local i = 0
for i = 0, 10, 1 do
print(fib(i))
coroutine.wait(0.1)
end
print("current frameCount: "..Time.frameCount)
coroutine.step()
print("yield frameCount: "..Time.frameCount)
local www = UnityEngine.WWW("http://www.baidu.com")
coroutine.www(www)
local s = tolua.tolstring(www.bytes)
print(s:sub(1, 128))
print('Coroutine ended')
end
function TestCortinue()
coroutine.start(CoFunc)
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
LuaBinder.Bind(LuaState);
如果使用Wrap的话必须要先Bind.
LuaLooper
添加了这个组件后,它会在c#每一帧驱动lua的协同完成所有的协同功能,这里的协同已经不单单是lua自身功能,而是tolua#模拟unity的所有的功能.
调用
用法参考Example 03
LuaFunction func = lua.GetFunction("FuncName");
func.Call();
func.Dispose();