Unity XLua 协程封装

Unity XLua 协程封装

  • 依附Unity中的MonoBehaviour对象来开启协程
  • MonoBehaviour对象只需要是空的脚本,主要来进行协程的开启
  • 外界使用时只需要对该协程对象进行操作

1.封装cs_coroutine

local util = require("xlua.util")

local obj = CS.UnityEngine.GameObject("Coroutine")
CS.UnityEngine.Object.DontDestroyOnLoad(obj)
---@type UnityEngine.MonoBehaviour
local mono = obj:AddComponent(typeof(CS.TestMono))

return{
    
    
    start = function(...)
        return mono:StartCoroutine(util.cs_generator(...))
    end,
    stop = function(co)
        mono:StopCoroutine(co)
    end,
    stopAll = function()
        mono:StopAllCoroutines()
    end
}

2.使用cs_coroutine(1)

local cs_coroutine = require("Lesson23")

local co_a = cs_coroutine.start(function()
    print("coroutine a started")
    
    coroutine.yield(cs_coroutine.start(function()
        print("coroutine b stated inside coroutine a")
        coroutine.yield(CS.UnityEngine.WaitForSeconds(1))
        print("i am coroutine b")
    end))
    print("coroutine b finish")
    while true do
        coroutine.yield(CS.UnityEngine.WaitForSeconds(1))
        print("i am coroutine a")
    end
end)

cs_coroutine.start(function()
    print("stop coroutine a after 5 seconds")
    coroutine.yield(CS.UnityEngine.WaitForSeconds(5))
    cs_coroutine.stop(co_a)
    print("coroutine a stop")
end)

3.使用cs_coroutine(2)

  • 满足条件停止自身协程
local cs_coroutine = require("Lesson23")
co = cs_coroutine.start(function()
    local a = 0
    while true do
        print(a)
        a = a + 1
        if a >= 5 then
            cs_coroutine.stop(co)
            co = nil
            for i, v in pairs(_G) do
                print(i,v)
            end
        end
        coroutine.yield(CS.UnityEngine.WaitForSeconds(0.2))
    end
end)

猜你喜欢

转载自blog.csdn.net/zzzsss123333/article/details/125553677