热更新_ToLua学习示例 05_LuaCoroutine

2023-11-07

    //Lua文件名字 这个是个.bytes后缀的文本 跟xlu里面用txt文件放lua代码一样外面拖拽赋值
    public TextAsset luaFile = null;
    //Lua状态
    private LuaState lua = null;
    //这个类继承MonoBehaviour里面装的是一堆事件在Start里面获取事件
    private LuaLooper looper = null;
    void Awake () 
    {       
        lua  = new LuaState();
        lua.Start();
        //绑定操作绑定lua状态
        //Unity里面的协程是要在脚本里面游戏对象身上进行调用的
        //协程类似于生命周期里面的一个回调函数 执行的时间点是在Update之后LateUpdate之前
        //所以如果要执行协程就要绑定在对象身上
        LuaBinder.Bind(lua);

        //给自己添加上LuaLooper这个脚本 然后把这个脚本组件赋值给looper对象
        looper = gameObject.AddComponent<LuaLooper>();
        looper.luaState = lua;//设置looper对象的状态为lua

        //执行lua脚本   代码块       文件名字
        lua.DoString(luaFile.text, "TestLuaCoroutine.lua");
        //获取方法
        LuaFunction f = lua.GetFunction("TestCortinue");
        f.Call();
        f.Dispose();
        f = null;        
    }

脚本功能,调用写在文本文件里面的lua协同程序

注:Lua 中的协程代表一个独立的执行线程,与多线程系统中的线程不同,协程仅通过显式调用 yield 函数来暂停其执行。

--对lua文件的说明
--斐波那契数列
function fib(n)
    local a, b = 0, 1
    while n > 0 do
        a, b = b, a + b
        n = n - 1
    end

    return a
end
--协程函数
function CoFunc()
    print('Coroutine started')    
    for i = 0, 10, 1 do
        print(fib(i))                    
        --等待0.1秒【这个是Tolua自己写的里面的具体实现方法下面有解释】
        coroutine.wait(0.1)						
    end	
	print("current frameCount: "..Time.frameCount)
	--等一帧之后执行
	coroutine.step()
	print("yield frameCount: "..Time.frameCount)
	--实例化一个WWW对象 网址是百度的官网【WWW目前在unity里面已经弃用了看看就行不用记】
	local www = UnityEngine.WWW("http://www.baidu.com")
	coroutine.www(www)
	local s = tolua.tolstring(www.bytes)
	print(s:sub(1, 128))
    print('Coroutine ended')
end

function TestCortinue()	
	--启动协程
    coroutine.start(CoFunc)
end

local coDelay = nil

--等待协程方法
function Delay()
	local c = 1

	while true do
		coroutine.wait(1) 
		print("Count: "..c)
		c = c + 1
	end
end
--开始等待协程
function StartDelay()
	coDelay = coroutine.start(Delay)
end

function StopDelay()
	--停止协程
	coroutine.stop(coDelay)
end

上面是ToLua作者调用自己重新封装的lua协程代码

--------------------------------------------------------------------------------
--      Copyright (c) 2015 - 2016 , 蒙占志(topameng) topameng@gmail.com
--      All rights reserved.
--      Use, modification and distribution are subject to the "MIT License"
--------------------------------------------------------------------------------
local create = coroutine.create
local running = coroutine.running
local resume = coroutine.resume
local yield = coroutine.yield
local error = error
local unpack = unpack
local debug = debug
local FrameTimer = FrameTimer
local CoTimer = CoTimer

local comap = {}
local pool = {}
setmetatable(comap, {__mode = "kv"})

function coroutine.start(f, ...)	
	local co = create(f)
	
	if running() == nil then
		local flag, msg = resume(co, ...)
		if not flag then					
			error(debug.traceback(co, msg))
		end					
	else
		local args = {...}
		local timer = nil		
		
		local action = function()												
			comap[co] = nil
			timer.func = nil
			local flag, msg = resume(co, unpack(args))						
			table.insert(pool, timer)
	
			if not flag then	
				timer:Stop()														
				error(debug.traceback(co, msg))						
			end		
		end
			
		if #pool > 0 then
			timer = table.remove(pool)
			timer:Reset(action, 0, 1)
		else
			timer = FrameTimer.New(action, 0, 1)
		end
		
		comap[co] = timer
		timer:Start()		
	end

	return co
end
--协程等待
function coroutine.wait(t, co, ...)
	local args = {...}
	co = co or running()		
	local timer = nil
		
	local action = function()		
		comap[co] = nil		
		timer.func = nil
		local flag, msg = resume(co, unpack(args))
		
		if not flag then	
			timer:Stop()						
			error(debug.traceback(co, msg))			
			return
		end
	end
	
	timer = CoTimer.New(action, t, 1)
	comap[co] = timer	
	timer:Start()
	return yield()
end
--协程步骤
function coroutine.step(t, co, ...)
	local args = {...}
	co = co or running()		
	local timer = nil
	
	local action = function()	
		comap[co] = nil					
		timer.func = nil
		local flag, msg = resume(co, unpack(args))
		table.insert(pool, timer)
	
		if not flag then	
			timer:Stop()																			
			error(debug.traceback(co, msg))
			return	
		end		
	end
				
	if #pool > 0 then
		timer = table.remove(pool)
		timer:Reset(action, t or 1, 1)
	else
		timer = FrameTimer.New(action, t or 1, 1)
	end

	comap[co] = timer
	timer:Start()
	return yield()
end

function coroutine.www(www, co)			
	co = co or running()			
	local timer = nil			
			
	local action = function()				
		if not www.isDone then		
			return		
		end		
				
		comap[co] = nil
		timer:Stop()		
		timer.func = nil
		local flag, msg = resume(co)			
		table.insert(pool, timer)	
			
		if not flag then												
			error(debug.traceback(co, msg))			
			return			
		end				
	end		
				
	if #pool > 0 then
		timer = table.remove(pool)
		timer:Reset(action, 1, -1)
	else	
		timer = FrameTimer.New(action, 1, -1)	
	end
	comap[co] = timer	
 	timer:Start()
 	return yield()
end
--协程暂停
function coroutine.stop(co)
 	local timer = comap[co] 	 	

 	if timer ~= nil then
 		comap[co] = nil
 		timer:Stop()  		
 	end
end

上述代码是ToLua作者自己封装协程的具体代码,此方法所有协程的代码都是放在lua语言里面,对性能消耗较小,建议使用此方法。如果阅读起来有难度,请先去Lua官网查看Lua中的协程是如何实现以及具体用法。官方文档地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

热更新_ToLua学习示例 05_LuaCoroutine 的相关文章

  • Lua 中的“加载”有什么作用?

    我试图解决我的理解问题loadLua 脚本中的函数 但没有该命令的任何示例或指南 它在他自己的 Lua 网站上讲述https www lua org manual 5 2 manual html pdf load https www lua
  • 如何在 Lua 中下载文件,但在运行时写入本地文件

    我正在尝试制作一个更新程序 以便当我的 Lua 应用程序过时时它将使用LuaSocket下载较新的 exe 文件 可以运行我的 Lua 代码 在这个更新程序中 我希望它显示到目前为止已下载的数量 但是 通过以下 HTTP 请求 它会阻止应用
  • lua检查多个值是否相等

    我喜欢用 Roblox 制作游戏 并用 lua 编写代码 在编写游戏时 我发现自己经常问一个值是否等于另一个值 这可能会产生很长的代码行 并且可能非常重复 例如 如果 x ClassName 衬衫 或x ClassName 附件 或x Cl
  • 错误 main.lua:23:尝试索引 upvalue 'Menu' (布尔值)

    我正在尝试用 lua 和 love2d 制作一个主菜单 这是我第一次这样做 遗憾的是没有关于此事的教程 所以我自己尝试了一下 我一直遇到这个错误 我不知道如何解决它 请帮助 完整错误消息 错误main lua 23 尝试索引upvalue
  • 覆盖 require 后调用 lua_getfield() 时崩溃

    这个问题与 Henri Menke 在这个问题中的回答相关 如何在 C 中获取预加载模块名称 https stackoverflow com questions 51510308 how to get preloaded module na
  • 如何使用Lua脚本语言打开Web套接字?

    作为初学者 我想在基于 Linux 的服务器上使用 Lua 打开一个 Web 套接字 该服务器应允许 Android 客户端连接到它 你能给我一些用Lua打开网络套接字的示例代码吗 您两周前已经问过同样的问题并得到了回答 LUA 脚本 We
  • 在 lua 中使用相等运算符比较数字有多安全?

    在我的引擎中 我有一个用于脚本编写的 Lua VM 在脚本中 我写了这样的内容 stage stage 1 if stage 5 then end and objnum tonumber 5 if stage objnum 根据 Lua 来
  • 如何更新lua中的时间以反映执行过程中系统时区的变化?

    Problem 我想修改awful widget textclockAwesome wm 中的小部件可以立即反映系统时区的更改 这个小部件和所有的 Awesome wm 配置都是用 lua 编写的 目前 如果系统时区发生更改 小部件将继续根
  • Lua中如何获取目录列表

    我需要 LUA 中的目录列表 假设我的目录路径为 C Program Files 我需要该特定路径中所有文件夹的列表以及如何搜索该列表中的任何特定文件夹 Example 需要路径 C Program Files 中所有文件夹的列表 以下是上
  • 使用 corona sdk 验证电子邮件地址

    在我的项目中 有一个供用户填写详细信息的表单 其中有一个文本字段用于输入用户的电子邮件 ID 所以我需要在 corona 项目中验证该文本字段中的电子邮件 试试这个正则表达式 local email email protected cdn
  • 为什么 LuaJIT 和 Lua 中的数字舍入格式不同?

    Using string format 据说遵循 Csprintf 在 LuaJIT 轮次中格式化数字与我尝试过的所有其他 Lua 解释器不同 lua v Lua 5 4 1 Copyright C 1994 2020 Lua org PU
  • 在lua中组合两个函数

    我刚开始学习lua 所以我的要求可能是不可能的 现在 我有一个接受函数的方法 function adjust focused window fn local win window focusedwindow local winframe w
  • Lua 从 5.1 更新 - LUA_GLOBALSINDEX 问题

    我最近将旧的 Lua 5 1 项目更新到了该库的最新版本 但遇到了问题LUA GLOBALSINDEX 它变得不确定 我只用过它lua getfield函数 像这样 void luastartgame void if startgamefu
  • 检查多个位置的值并仅在源唯一时返回匹配项

    假设我有一个清单Vendors 阿斯达 乐购 Spar 我有一个清单Sources 或者这个类比中的供应商 家乐氏 Kellogg 吉百利 Cadbury 雀巢 Nestle 强生 Johnsons 帮宝适 Pampers Simple 等
  • 如何使用 srlua 制作可执行的 Lua 脚本?

    我的主要目标是使我的 lua 文件成为可执行文件或使其成为咬代码 最好是两者皆有 我正在尝试 srlua 但在自述文件中它告诉我要做的事情 对于Windows 您需要首先创建srlua exe和glue exe 然后为每个 你想把Lua程序
  • Lua 访问表的键和值

    我想在关卡编辑器中读取 Lua 文件 这样我就可以以可视化格式显示其数据供用户编辑 如果我有一个像这样的 Lua 表 properties Speed 10 TurnSpeed 5 Speed显然是关键并且10价值 我知道如果我知道像这样的
  • 如何在lua中获取shell脚本的返回码?

    我正在lua中执行一个脚本 os execute sh manager scripts update system sh f 我想获得脚本的输出 如果退出状态为 7 则返回 7 I tried local output os execute
  • 在Luasocket中,在什么条件下,即使在select告诉它可以安全读取之后,accept调用也可以阻塞?

    卢阿索基特select http w3 impa br diego software luasocket socket html select函数应该告诉何时可以在不阻塞的情况下读取套接字 它显然也可以用来告诉服务器套接字何时准备好接受新连
  • 在 Awesome-wm 中为特定应用程序设置窗口布局

    如何配置很棒 以便它可以启动两个窗口对齐的新应用程序 如下所示 xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx 其中 x 是 pidgin 中的对话窗口 是好友列表窗口 一般来说 我想指定右窗口的宽度
  • Lua中有状态迭代器和无状态迭代器的区别

    Lua中无状态和有状态迭代器有什么区别 请详细解释一下 什么时候需要使用无状态 什么时候需要使用另一种 我需要例子来理解这个概念 首先让我们就一个定义达成一致 在 Lua 中 迭代器是function 类似对象 每次调用时都会返回序列中的下

随机推荐

  • Sublime Text 3 安装PackageControl

    操作步骤 1 复制安装信息 import urllib request os hashlib h 6f4c264a24d933ce70df5dedcf1dcaee ebe013ee18cced0ef93d5f746d80ef60 pf Pa
  • React16.3中的Refs和Forwarding Refs

    简要介绍 React16 3中修改了Refs的使用方法 并且提供了Forwarding Refs用于在父组件中操作子组件中的dom节点 本文介绍一下新的Refs表示方法以及Forwarding Refs Ref的功能就不具体说了 就是在父组
  • 如何成为更厉害的人

    01 读万卷书 行万里路 阅人无数 名师指路 自己去悟 人生每个阶段都需要找到一位认知高于自己导师 帮你指明前方道路 从而让自己少走弯路 02 融入一个高质量的圈子 一个人走的快 但一群人走的远 一个人容易放弃 但一群人更容易坚持 03 要
  • 3款最强的AI视频生成器,支持文生视频、图生视频

    当我们深入人工智能世界及其对视频创作的变革性影响时 发现人工智能视频生成器的强大功能 人工智能视频生成器正在彻底改变我们创建内容的方式 让我们比以往更轻松地以最少的努力制作高质量的视频 无论您是内容创作者 营销人员 还是只是一名人工智能爱好
  • 2020年全国高校计算机能力挑战赛C++初赛程序设计题2:九键拼音中数字与英文字母成对应关系:2--abc, 3-def, 4-ghi, 5--jkl, 6--mno, 7--pqrs, 8--tuv

    2020年全国高校计算机能力挑战赛C 初赛程序设计题2 九键拼音中数字与英文字母成对应关系 2 abc 3 def 4 ghi 5 jkl 6 mno 7 pqrs 8 tuv 9 wxyz 输入 输入一个由英文小写字母组成的字符串 长度
  • 两种方法在VMware中安装VMware Tools

    VMware Tools的主要作用是虚拟硬件的驱动 鼠标的无缝移出移入 剪贴板共享 共享主机上的文件夹等功能 方法一 1 打开 文件夹 Ubuntu 17 10 amd64 根据自己版本来看 2 在VMware Workstation主界面
  • Flume 数据流监控——Ganglia的安装与部署

    1 Ganglia的安装 1 安装 dhttpd 服务与 php yasin hadoop102 flume sudo yum y install httpd php 2 安装其他依赖 atguigu hadoop102 flume sud
  • 用Windbg解决一个Bug

    摘要 可以看到无论对于开发还是测试人员 windbg很多时候可以帮我们快速的定位问题 如果借助符号文件 Windbg完全可以实现比VC IDE更强大的调试供功能 并且有时候我们不需要源代码 不需要重新编译 直接就可以通过windbg调试和解
  • 对称加密和非对称加密

    对称加密 什么是对称加密 对称加密就是指 加密和解密使用同一个密钥的加密方式 对称加密的工作过程 发送方使用密钥将明文数据加密成密文 然后发送出去 接收方收到密文后 使用同一个密钥将密文解密成明文读取 对称加密的优点 加密计算量小 速度块
  • llinux 开发环境环境配置

    1 安装好Ubuntu后 关闭软件中的更新及检测 2 安装vmware tool 不用sudo mount t vmhgfs host mnt hgfs 不用vmhgfs fuse host mnt hgfs命令挂载 只要在安装VMware
  • C++常用函数之sort函数,头文件 algorithm

    1 sort 函数是C 标准库中的排序函数 头文件为algorithm 2 sort 函数时间复杂度 我们最熟悉的冒泡排序和选择排序的时间复杂度过高o nn 不能满足我们写题的需要 sort函数的排序方法类似于快排方法 时间复杂度为nlog
  • 图示电路中的等效电阻rab_可调电阻即电位器,各种敏感电阻的介绍和使用(电阻二)...

    上一篇讲了固定阻值电阻器 这一篇主要讲可变电阻 和敏感电阻器 电位器是一种阻值可以通过调节而变化的电阻器 又称可变电阻器 电位器和图形符号 电位器结构示意图 电位器有A C B三个引出极 在A B极之间连接着一段电阻体 该电阻体的阻值用RA
  • ctfshow-网络迷踪-密集恐惧( 世界上最大的飞机墓地)

    ctf show 网络迷踪模块 密集恐惧关卡 这一关的图片给了一个很荒凉的地方 里面有很多飞机 看样子是荒废很久了 推荐使用百度识图获取具体的地点 在通过百度搜索得到具体的经纬度 将图片下载到本地 像是一个荒凉的农场 里面有很多飞机 很明显
  • 人脸识别引擎SeetaFaceEngine中Alignment模块使用的测试代码

    人脸识别引擎SeetaFaceEngine中Alignment模块用于检测人脸关键点 包括5个点 两个眼的中心 鼻尖 两个嘴角 以下是测试代码 int test alignment std vector
  • QT关闭标题栏setWindowFlags不生效问题

    QT关闭标题栏setWindowFlags不生效问题 setWindowFlags不生效原因 主窗口使用该函数时可以正常关闭标题栏 但是当子窗口MyQDialog新建中使用到this时 并使用这个函数并不能正常闭关标题栏 问题在于这个thi
  • 常用的 c++ 函数汇总(持续更新)

    1 数组 列表类 1 列表初始化 vector
  • 2022年蓝队初级护网总结

    1 设备误报如何处理 答 来自外网的误报说明安全设备需要进行策略升级 不需要处置 如果是来自内网的误报可以和负责人协商一下看能不能解决 有必要的话添加白名单处理 2 如何区分扫描流量和手工流量 答 1 扫描流量数据量大 请求流量有规律可循且
  • 秒杀超卖 解决方案(史上最全)

    文章很长 建议收藏起来慢慢读 疯狂创客圈总目录 语雀版 总目录 码云版 总目录 博客园版 为您奉上珍贵的学习资源 免费赠送 经典图书 Java高并发核心编程 卷1 面试必备 大厂必备 涨薪必备 加尼恩免费领 免费赠送 经典图书 Java高并
  • mysql连接

    package com bochy jdbc import java sql Connection import java sql DriverManager author zhaoYuguang version 1 0 链接Mysql数据
  • 热更新_ToLua学习示例 05_LuaCoroutine

    Lua文件名字 这个是个 bytes后缀的文本 跟xlu里面用txt文件放lua代码一样外面拖拽赋值 public TextAsset luaFile null Lua状态 private LuaState lua null 这个类继承Mo