当前位置:   article > 正文

lua协程 unity_XLua里使用协程

xlua ienumerator

在XLua里如何使用协程?有两种方式

使用Unity协程

要想通过unity的StartCoroutine使用协程,需要传入IEnumerator参数

Xlua提供了util.cs_generator来生成IEnumerator

util是xlua的一个工具,require即可local util = require 'xlua.util'

这样我们可以用StartCoroutine开启,StopCoroutine停止协程,协程内部使用coroutine.yield

local util = require 'xlua.util'

local co

local t_fun = util.cs_generator(function()

print("StartCoroutine ")

for i = 1, 10 do

coroutine.yield(CS.UnityEngine.WaitForSeconds(1))

print('Wait for 1 seconds')

if i == 3 then

print("StopCoroutine")

print(co)

self:StopCoroutine(co)

end

end

end)

co = CS.XLua.Cast.IEnumerator(t_fun)

self:StartCoroutine(co)

测试后发现,util.cs_generator生成的其实也是一个table,并不是IEnumerator,解决办法是转换成原生对象RawObject,RawObject是XLua.Cast命名空间下的一个类,作用是保存为C#的对象,而不是变成lua对象

public class IEnumerator : Any

{

public IEnumerator(System.Collections.IEnumerator i) : base(i)

{

}

}

使用Lua协程

lua协程通过coroutine.create创建,assert(coroutine.resume(co))开启,内部使用yield_return

也可以使用util.coroutine_call,coroutine_call是xlua封装了的调用方法,实际是

local function coroutine_call(func)

return function(...)

local co = coroutine.create(func)

assert(coroutine.resume(co, ...))

end

可以省去创建步骤

local util = require 'xlua.util'

local yield_return = (require 'cs_coroutine').yield_return

local co

local coroutineFun = function()

print("StartCoroutine ")

for i = 1, 10 do

yield_return(CS.UnityEngine.WaitForSeconds(1))

print('Wait for 1 seconds')

if i == 3 then

print("StopCoroutine")

print(co)

end

end

end

-- co = coroutine.create(coroutineFun)

-- assert(coroutine.resume(co))

local coroutineCall = util.coroutine_call(coroutineFun)

coroutineCall()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/95835
推荐阅读
相关标签
  

闽ICP备14008679号