找回密码
 立即注册
查看: 212|回复: 0

Tolua使用笔记三:Tolua协程用法

[复制链接]
发表于 2023-4-9 10:30 | 显示全部楼层 |阅读模式
案例5:
这一章讲的是lua中的协程

如果我没记错的话,lua中没有多线程,只有协程,lua的协程自带的用起来有点局限性,Tolua中协程由于重写了部分的方法,变得更加方便了
核心代码如下:
  1. function CoFunc()
  2.     print('Coroutine started')
  3.     local i = 0
  4.     for i = 0, 10, 1 do
  5.         print(fib(i))                    
  6.         coroutine.wait(0.1)                                               
  7.     end       
  8.         print("current frameCount: "..Time.frameCount)
  9.         coroutine.step()
  10.         print("yield frameCount: "..Time.frameCount)
  11.         local www = UnityEngine.WWW("http://www.baidu.com")
  12.         coroutine.www(www)
  13.         local s = tolua.tolstring(www.bytes)
  14.         print(s:sub(1, 128))
  15.     print('Coroutine ended')
  16. end
  17. function TestCortinue()       
  18.     coroutine.start(CoFunc)
  19. end
复制代码
效果图如下:  


对于lua中的协程:
主要的知识点如下:
1:注册C#中类型方法到lua中 :先在ToLua中的CustomSetting.cs 文件中添加需要注册的类型,然后按照C#中的那种方法直接用a.b就可以调用C#类型中的静态方法了,如果调用的是非静态方法,则是用a:b  , 具体为什么这么区别是因为lua中没有类的概念,只能用这种方法获取到具体对象
2:lua协程的准备工作
在 创建完lua虚拟机之后,一定要记得做以下几步:
  1. lua.Start();
  2. LuaBinder.Bind(lua);               
  3. looper = gameObject.AddComponent<LuaLooper>();
  4. looper.luaState = lua;
复制代码
首先调用虚拟机的 lua.Start 函数初始化,然后调用LuaBinder的静态方法  LuaBinder.Bind(lua);  参数就是你创建的虚拟机 , 然后为你的一个游戏对象添加组件 LuaLooper  ,并将该 LuaLooper 的内部虚拟机引用指定为我们创建的虚拟机 , 然后我们就可以正常的使用Lua中的协程了,它会在c#每一帧驱动lua的协同完成所有的协同功能,这里的协同已经不单单是lua自身功能,而是tolua#模拟unity的所有的功能。。

3:;lua中协程的使用:
协程函数的开启 : coroutine.start(协程函数)
协程函数的挂起:   coroutine.step()
协程函数的延时:   coroutine.wait(延时时间)    注意:时间的单位是秒   

协程函数的结束:   coroutine.stop(协程对象)   注意:协程函数关闭的协程对象是对应的协程开启函数的返回值
协程下载:               coroutine.www(网址)
其中,除了   coroutine.start(协程函数) 和  coroutine.stop(协程对象)  之外,其他的协程方法只允许在协程函数的内部使用
案例6:
这个是Tolua的第2套携程使用方法,作者说明不要2套协程方案交叉使用,且这一套协程方法使用效率低,第一套为Tolua的推荐协程使用方案
具体的核心代码如下:
  1.         function CoExample()            
  2.             WaitForSeconds(2)
  3.             print('WaitForSeconds end time: '.. UnityEngine.Time.time)
  4.             WaitForFixedUpdate()
  5.             print('WaitForFixedUpdate end frameCount: '..UnityEngine.Time.frameCount)
  6.             WaitForEndOfFrame()
  7.             print('WaitForEndOfFrame end frameCount: '..UnityEngine.Time.frameCount)
  8.             Yield(null)
  9.             print('yield null end frameCount: '..UnityEngine.Time.frameCount)
  10.             Yield(0)
  11.             print('yield(0) end frameCime: '..UnityEngine.Time.frameCount)
  12.             local www = UnityEngine.WWW('http://www.baidu.com')
  13.             Yield(www)
  14.             print('yield(www) end time: '.. UnityEngine.Time.time)
  15.             local s = tolua.tolstring(www.bytes)
  16.             print(s:sub(1, 128))
  17.             print('coroutine over')
  18.         end
  19.         function TestCo()            
  20.             StartCoroutine(CoExample)                                   
  21.         end
  22.      function StartDelay()
  23.        coDelay = StartCoroutine(Delay)            
  24.      end
  25.      function StopDelay()
  26.        StopCoroutine(coDelay)
  27.      end
复制代码
好处大概就是lua代码的写法上更加和C#中类似了,而且没有了之前的准备工作,代价是效率降低很多了,而且自己的C#端对应得对象需要继承类LuaClient,LuaClient中就封装了方案1中所有的那些操作,其实到最后还是返璞归真了,除此之外还加载了一些其他的库,估计这些就是写法改变的核心~~,
主要使用方法由于和C#太相似了,我就不一一列举解释了,大家自己看一下就可以了
效果图如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-14 05:17 , Processed in 0.090344 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表