[Unity] Unity的lua项目中模拟每帧运行一次的协程

2 篇文章 0 订阅
1 篇文章 0 订阅

游戏中,我们经常需要把一些大量计算或一些需要持续逐帧运算的步骤交给协程处理,习惯了Monobehaviour中使用协程来完成这类操作的我们。然而,很多Unity项目在选择热更新方案的时候,基本都会选择使用slua,ulua等lua解决方案,编写的lua代码运行在C#搭建的解释器上,两者之间可以相互调用,但是性能消耗也是极大的,为了减少C#和lua之间的相互调用,逻辑尽量都放在lua这边编写,这时候也难免会有需要用到协程的尴尬。

lua本身不支持多线程,但其支持协程。用法也颇为简单,不熟悉的可以先在网上了解一下lua协程的基本用法。

这里,我定义了一个非常简单的lua协程的静态管理类,有一个Update方法,每帧都会被调用。这是有不少不足的,但对于自己来说已经够用了,这个类可以很方便地添加终止协程等操作。

---------------------------------------
-- @Author: zhiheng.shao
-- @Date:   2017-06-14T15:40:25+08:00
-- @Filename: CoroutineManager.lua
-- @Description: lua协程管理类
---------------------------------------
local CoroutineManager = static_class("CoroutineManager")
local coroutines = {}
-- 协程状态
local CoroutineStatus = {
    Runnable = "runnable",
    Running = "running",
    Suspended = "suspended",
    Dead = "dead",
}

-- 
function CoroutineManager.StartCoroutine(co)
    coroutines[co] = CoroutineStatus.Runnable
end

function CoroutineManager.Update(deltaTime)
    for co, status in pairs(coroutines) do
        coroutine.resume(co)
        if coroutine.status(co) == CoroutineStatus.Dead then
            coroutines[co] = nil
        end
    end
end

function CoroutineManager.Init()
    coroutines = {}
end

使用示例

require "CoroutineManager"
function testLuaCoroutine()
    local count = 0
    local co = coroutine.create(function(deltaTime)
        while(count < 10) do
            count = count + 1
            print("test coroutine")
            coroutine.yield()
         end
    end)
    return co
end

CoroutineManager.StartCoroutine(testLuaCoroutine())
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值