UH2S3L9——使用toLua提供的协程

本章代码关键字

1
2
LuaLooper                //toLua在使用协程前,必须要在场景上的某个游戏对象上挂载该脚本,并关联当前正在运行的解析器
luaLooper.luaState //如果要让lua解析器的可以执行协程,就必须要先将解析器与关联到luaLooper.luaState上
1
2
3
4
-- 以下是toLua为我们提供的协程方法,原本的Lua里不存在这些方法
coroutine.start() --将某个函数作为协程开启,返回协程变量
coroutine.wait() --挂起协程,输入秒数可以将协程挂起指定的一段时间
coroutine.stop() --传入协程,停止某个协程

toLua提供的协程

toLua为Lua的协程添加了start​,wait​,stop​函数,使得协程的开启、挂起、停止更加方便了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-- tolua协程相关的代码
local coDelay = nil

-- 协程 相关的lua逻辑 这些内容都是toLua帮助我们实现的
StartDelay = function()
coDelay = coroutine.start(Delay)
end

Delay = function()
local c = 1
while true do
--等待1s 执行一次逻辑(toLua提供方法)
coroutine.wait(1)
print("Count: " .. c)
c = c + 1
if c >= 5 then
StopDelay()
break
end
end
end

StopDelay = function()
coroutine.stop(coDelay)
end

在Lua中声明完毕后,就可以在C#中调用函数开启协程,前提是完成了toLua协程相关的初始化

1
2
3
LuaFunction luaFunction = LuaManager.Instance.LuaState.GetFunction("StartDelay")
luaFunction.Call();
luaFunction.Dispose();

ToLua使用协程初始化

注意!toLua在使用协程前,必须要在场景上的某个GameObject上加上LuaLooper脚本,并且将目前正在运行的Lua解析器关联起来!

1
2
3
4
5
6
7
luaState = new LuaState();
luaState.Start();
DelegateFactory.Init(); //委托初始化相关
//协程相关
LuaLooper looper = this.gameObject.AddComponent<LuaLooper>();
//将我们自己申明的解析器和lualooper绑定起来,这样就可以让协程跑起来了
looper.luaState = luaState;