当前位置:网站首页>lua 如何 实现一个unity协程的工具
lua 如何 实现一个unity协程的工具
2022-08-04 23:59:00 【接啊是哦ida】
Mcourtinue 是基于 延时回调 和 lua 协同程序 制作的类似unity协程的工具
- 支持异步将函数挂起 支持函数中添加等待时间 支持等待一个异步函数
- 在控制界面一些播放顺序的时候非常好用
首先 有做一个功能 就能 在unity中 做一个能能够延时回调的 工具
--暂且这个能够计时器回调的工具 就 叫 Delay(delayTime,callBack)
Delay(1,function()
print(“ok”)
end )
--意思就是1 秒钟之后 打印ok
好,现在假设 我们已经有了一个这样的函数
然后上代码
local Mcourtinue ={
}
--重置
function Mcourtinue:Rest()
self.ForcePass = false
end
--检查是否强制跳过
function Mcourtinue:CheckForcePass()
if self.ForcePass or self.Destoryed then
return true
end
return false
end
--开启一个协同程序
function Mcourtinue:Start(view, func)
self.view = view
self.m_start = func
self:Rest()
self.co =
coroutine.create(
function()
self.m_start(view, self)
end
)
self:Resume()
end
--唤醒
function Mcourtinue:Resume()
self:Next()
end
--下一步
function Mcourtinue:Next()
local result, params = coroutine.resume(self.co)
if not result then
error("协同运行过程中出错拉" .. coroutine.status(self.co))
end
return result, params
end
--delay= nil : 挂起等待
--delay= 数字 : 等待时间
--delay= 函数 : 等待一个
function Mcourtinue:Wait(delay, param)
if not self.co then
error("co 是 null")
end
if self:CheckForcePass() then --如果跳过就强制把携程走完 - 销毁的时候用
return
end
if not delay then
coroutine.yield(self.co)
return
end
if type(delay) == "function" then
return delay(self.view, self, param)
end
if type(delay) ~= "number" then
error("不支持的类型")
end
self.WatiTimeId =
LuaTimerManager:Delay(
delay,
function()
self:Next()
end
)
coroutine.yield(self.co)
end
-- 销毁界面的时候 记得调用destory
function Mcourtinue:OnDestory()
self.Destoryed = true
while self.co and coroutine.status(self.co) ~= "dead" do
local result = self:Next()
if not result then
break
end
end
for k, v in pairs(self) do
self[k] = nil
end
end
return Mcourtinue
下面展示一下使用范例
--Mcourtinue 是基于 延迟函数 和 lua 协同程序 制作的类似unity协程的工具
--支持异步将函数挂起 支持函数中添加等待时间 支持等待一个异步函数
--例子 创建一个协同程序 先播放A特效 然后等待3s 再每隔0.1s播放B特效10次 等待按钮点击确认之后 播放C特效
local TempView={
} --模拟窗口
function TempView:ctor()
--创建一个携程控制器
self.co = require("......./Mcourtinue") --获取那个控制器
--self.TmpPlay为要启动的协同函数
self.co:Start(self, self.TempPlay)
self.continueBtn:addOnClick(
function ()
self.McourtinueCtrl:Next() --点击 btn就可以从上次挂起的地方往下继续了
end
)
end
--co:Wait() 不加参数 就是挂起函数 , 填数字是等待时间, 填函数 是等待这个函数执行完再走下面
--协同函数 默认第一个参数为co
function TempView:TempPlay(co) --这里的co就是那个协同程序
self:play_A_Effect_1() --播放A特效
co:Wait(3)
-- local M= co:Wait(self:play_A_Effect_2) --与上面两行等效 ,可以接收等待函数的返回值
-- print(M) ->1111
for i=1,10 do
self:play_B_Effect() --播放B特效
co:Wait(0.1)
end
co:Wait() --这里会一直等待 直到 有地方执行co:Next()
self:play_C_Effect()
end
function TempView:play_B_Effect()
print("播放了特效B")
end
function TempView:play_A_Effect_1()
print("播放了特效A")
end
--Wait接受的函数 第一个参数为co
function TempView:play_A_Effect_2(co)
print("播放了特效A")
co:Wait(3)
return 1111
end
function TempView:Destory()
self.co:Destory() --销毁的时候 也要执行一下
end
欢迎大家指出问题
边栏推荐
- 测试经理要不要做测试执行?
- [CVA Valuation Training Camp] Financial Modeling Guide - Lecture 1
- 2022牛客暑期多校训练营5(BCDFGHK)
- KT148A voice chip ic working principle and internal architecture description of the chip
- Laravel 实现redis分布式锁
- SQL association table update
- 【云原生--Kubernetes】Pod控制器
- Statistical words (DAY 101) Huazhong University of Science and Technology postgraduate examination questions
- 一、爬虫基本概念
- 什么是次世代建模(附学习资料)
猜你喜欢
NebulaGraph v3.2.0 Release Note,对查询最短路径的性能等多处优化
3. Actual combat---crawl the result page corresponding to Baidu's specified entry (a simple page collector)
情侣牵手[贪心 & 抽象]
没有这些「伪需求」,产品经理的 KPI 怎么完成?
Flutter启动流程(Skia引擎)介绍与使用
Day118. Shangyitong: order list, details, payment
游戏3D建模入门,有哪些建模软件可以选择?
怎么将自己新文章自动推送给自己的粉丝(巨简单,学不会来打我)
【七夕快乐篇】Nacos是如何实现服务注册功能的?
如何写好测试用例
随机推荐
Implementing class target method exception using proxy object execution
The master teaches you the 3D real-time character production process, the game modeling process sharing
STC89C52RC的P4口的应用问题
2022年华数杯数学建模
从单体架构迁移到 CQRS 后,我觉得 DDD 并不可怕
The applicable scenarios and common product types of the KT148A electronic voice chip ic solution
软件质量评估的通用模型
.net(C#)获取两个日期间隔的年月日
对写作的一些感悟
【LeetCode】图解 904. 水果成篮
【LeetCode】Summary of Two Pointer Problems
typeScript - Partially apply a function
基于Appian低代码平台开发一个SpaceX网站
Metasploit-域名上线隐藏IP
leetcode经典例题——单词拆分
4-《PyTorch深度学习实践》-反向传播
【论文笔记】—低照度图像增强—Unsupervised—EnlightenGAN—2019-TIP
入门3D游戏建模师知识必备
Uniapp dynamic sliding navigation effect demo (finishing)
矩阵数学原理