UH2S2L19——Lua调用协程

本章代码关键字

1
2
"xlua.util"                --xlua提供的一个工具表,协程相关的内容就在里面
util.cs_generator --将函数转化为MonoBehaviour可用的协程

调用协程

Lua中调用MonoBehaviour​的协程分三个部分

  • 首先需要获取一个继承MonoBehaviour​的类,通过它来调用StartCoroutine​方法来启动协程
  • 作为协程的函数,使用coroutine.yield​可挂起协程,返回的内容还是Unity挂起协程需要返回的内容
  • 作为协程的Lua函数不能直接传入到StartCoroutine​,需要加载 "xlua.util" 并调用cs_generator来将协程函数转化为可用的协程

在C#中协程启动都是通过继承了MonoBehaviour​的类,通过里面的启动函数StartCoroutine​来启动协程
但是,我们不能直接将lua函数传入到开启协程中!!!!

xlua提供了一个工具表,一定是要通过require​调用之后,才能用
如果要把lua函数当做协程函数传入,必须先调用xlua.util​中的cs_generator(lua函数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- C#中协程启动都是通过继承了Mono的类 通过里面的启动函数StartCoroutine
GameObject = CS.UnityEngine.GameObject
WaitForSeconds = CS.UnityEngine.WaitForSeconds
-- 在场景中新建一个空物体,然后挂一个脚本上去,脚本继承MonoBehaviour,使用它开启协程
local obj = GameObject("Coroutine")
local mono = obj:AddComponent(typeof(CS.LuaCallCSharp))

-- 协程的声明
fun = function()
local a = 1
while true do
-- lua中 不能直接使用 C#中的yield return
-- 不过我们可以使用lua中的协程返回
coroutine.yield(WaitForSeconds(1))
print(a)
a = a + 1
end
end

-- xlua提供的一个工具表
-- 一定是要通过require调用之后 才能用
util = require("xlua.util")
-- 必须 先调用 xlua.util中的cs_generator(lua函数)
local c = mono:StartCoroutine(util.cs_generator(fun))

关闭协程

使用StopCoroutine​即可,需要传入协程变量

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
26
util = require("xlua.util")

-- C#中协程启动都是通过继承了Mono的类 通过里面的启动函数StartCoroutine

GameObject = CS.UnityEngine.GameObject
WaitForSeconds = CS.UnityEngine.WaitForSeconds
-- 在场景中新建一个空物体,然后挂一个脚本上去,脚本继承MonoBehaviour,使用它开启协程
local obj = GameObject("Coroutine")
local mono = obj:AddComponent(typeof(CS.LuaCallCSharp))

fun = function()
local a = 1
while true do
-- lua中 不能直接使用 C#中的yield return
-- 不过我们可以使用lua中的协程返回
coroutine.yield(WaitForSeconds(1))
print(a)
a = a + 1
if a > 10 then
mono:StopCoroutine(c) --停止协程
end
end
end

-- 必须 先调用 xlua.util中的cs_generator(lua函数)
c = mono:StartCoroutine(util.cs_generator(fun))