游戏中,我们经常需要把一些大量计算或一些需要持续逐帧运算的步骤交给协程处理,习惯了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())