lua 在unity 中的协程使用
2014-04-14 15:43
666 查看
最近尝试在unity中用上lua。
而其中会遇到的一个问题就是unity中普遍使用的协程在lua中如何实现。
最终经过考虑之后决定用lua的coroutine来实现。最终的使用与unity的协程类似。
下面是实现代码:
因为我没找到可以在lua中定时执行任务的方法,所以我在unity中定时会去调用lua的check方法
在unity c#中调用方式:
在update中调用lua的CheckCoroutine函数
void Update()
{
if(Time.frameCount%5== 0)
{
//Debug.Log(Time.realtimeSinceStartup+", "+Time.deltaTime);
CallMethond("CheckCoroutine");
}
//CallMethond("Update");
}
在lua中实际使用:
lua中例子函数定义:
co2 = coroutine.create(
function ()
local a= 0;
while true
do
if a>3 then
break
end
a=a+1;
Print("co2: "..a.." "..Time.realtimeSinceStartup);
WaitSeconds(co2, 1);
end
WaitSeconds(co2, 1);
Print("after wait: "..a.." "..Time.realtimeSinceStartup);
for i=1, 3 do
WaitSeconds(co2, 1);
Print("for: "..a.." "..Time.realtimeSinceStartup);
end
end
)
lua中函数调用:
在需要调用的地方启动第一次函数,例如在Start函数调用:
function Start()
coroutine.resume(co2);
end
之后co2就会像在c#里面一样自动执行下去了。
这样就可以像c#一样在lua中使用协程了:)
而其中会遇到的一个问题就是unity中普遍使用的协程在lua中如何实现。
最终经过考虑之后决定用lua的coroutine来实现。最终的使用与unity的协程类似。
下面是实现代码:
--[[ use to stop the coroutine for a while. should be call once a while to check if need to resume the coroutine. ]]-- coroutine_table= {} function CheckCoroutine() for k,v in pairs(coroutine_table) do if v[1] ~= nil and v[2] ~= nil then if (Time.realtimeSinceStartup-v[1])> v[2] then --v[1]= Time.realtimeSinceStartup; local ret= coroutine.resume(k); if not ret then --set table value to nil. then the key will be delete. coroutine_table[k]= nil; Print("[remove coroutine.]"); end end end end end function WaitSeconds(corout, time) if coroutine_table[corout] ~= nil then coroutine_table[corout][1]= Time.realtimeSinceStartup; coroutine_table[corout][2]= time; --Print("[exist---] "..coroutine_table[corout][1].." "..coroutine_table[corout][2]); else -- coroutine_value [1]: last update time [2]:interval local coroutine_value= {Time.realtimeSinceStartup, time}; coroutine_table[corout]= coroutine_value; --Print("[not exist---] "..coroutine_table[corout][1].." "..coroutine_table[corout][2]); Print("[add coroutine.]"); end --pause the function coroutine.yield(); end
因为我没找到可以在lua中定时执行任务的方法,所以我在unity中定时会去调用lua的check方法
在unity c#中调用方式:
在update中调用lua的CheckCoroutine函数
void Update()
{
if(Time.frameCount%5== 0)
{
//Debug.Log(Time.realtimeSinceStartup+", "+Time.deltaTime);
CallMethond("CheckCoroutine");
}
//CallMethond("Update");
}
在lua中实际使用:
lua中例子函数定义:
co2 = coroutine.create(
function ()
local a= 0;
while true
do
if a>3 then
break
end
a=a+1;
Print("co2: "..a.." "..Time.realtimeSinceStartup);
WaitSeconds(co2, 1);
end
WaitSeconds(co2, 1);
Print("after wait: "..a.." "..Time.realtimeSinceStartup);
for i=1, 3 do
WaitSeconds(co2, 1);
Print("for: "..a.." "..Time.realtimeSinceStartup);
end
end
)
lua中函数调用:
在需要调用的地方启动第一次函数,例如在Start函数调用:
function Start()
coroutine.resume(co2);
end
之后co2就会像在c#里面一样自动执行下去了。
这样就可以像c#一样在lua中使用协程了:)
相关文章推荐
- 项目记录28--unity-tolua框架 lua使用协程
- Tolua使用笔记六:在lua中操作C#的委托事件与在lua中对Unity的GameObject的操作
- Unity中另类的使用Lua的一种方式
- 在Unity中使用Lua脚本
- Unity中协程方法使用
- unity和lua的交互使用之tolua环境搭建过程
- Lua------------------unity关于lua的使用
- 在Unity中使用Lua脚本:语言层和游戏逻辑粘合层处理
- 在Unity中使用Lua脚本:语言层和游戏逻辑粘合层处理
- 如何使用LuaStudio调试Unity
- 「Unity」使用协程延时执行代码
- Unity如何使用WWW类和协程完成图片、视频下载播放
- Unity中使用协程实现倒计时功能
- 关于Unity中协程、多线程、线程锁、www网络类的使用
- [Unity] Unity的lua项目中模拟每帧运行一次的协程
- unity之使用协程异步加载场景
- Lua的系统学习(杂)_使用uLua在Unity中创建一个Sphere小球
- unity使用协程实现打字效果
- Unity中协程(IEnumerator)的使用方法介绍
- Unity 协程使用指南