展示了如何使用lua协同。
「1」代码
操作代码如下:
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')
for i = 1, 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
c#代码如下:
new LuaResLoader();
lua = new LuaState();
lua.Start();
LuaBinder.Bind(lua);
DelegateFactory.Init();
looper = gameObject.AddComponent<LuaLooper>();
looper.luaState = lua;
lua.DoString(luaFile.text, "TestLuaCoroutine.lua");
LuaFunction f = lua.GetFunction("TestCortinue");
f.Call();
f.Dispose();
f = null;
「2」需要了解的部分
- 首先,用到了
LuaBinder.Bind(lua);
,再给gameObject加上一个LuaLooper脚本组件用于驱动协同,最后将虚拟机lua赋值给脚本组件中的luaState变量即可。
- 必须启动LuaLooper驱动协同,这里将一个lua的半双工协同装换为类似unity的全双工协同
- fib函数负责计算一个斐那波契n
「3」值得注意的方法
-
coroutine.start(Func)
启动一个lua协同,返回一个coroutine对象
-
coroutine.wait
协同中等待一段时间,单位:秒
-
coroutine.step
协同中等待一帧.
-
coroutine.www
等待一个WWW完成.
-
tolua.tolstring
转换byte数组为lua字符串缓冲
-
coroutine.stop(coroutine对象)
停止一个正在lua将要执行的协同
网友评论