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

ToLua 入门06_LuaCoroutine

[复制链接]
发表于 2022-6-11 08:01 | 显示全部楼层 |阅读模式
协程在unity中特别常用,在tolua中,我们也能在lua文本中实现协程调用;但是在demo范例中,除了协程调用,还有一些warp绑定一类的知识,可能学习起来会懵B;为了方便学习,我们可以对例子做出简单修改,使学生知识点更加串联。
打开ToLua/Examples/05_LuaCoroutine的TestCoroutine类文件,将类改外以下代码(去掉了绑定相关代码,指定为lua文件)。
  1. using UnityEngine;using System;using System.Collections;using LuaInterface;//例子5和6展示的两套协同系统勿交叉使用,此为推荐方案publicclassTestCoroutine:MonoBehaviour{publicTextAsset luaFile =null;privateLuaState lua =null;privateLuaLooper looper =null;voidAwake(){#if UNITY_5 || UNITY_2017 || UNITY_2018
  2.         Application.logMessageReceived += ShowTips;#else
  3.         Application.RegisterLogCallback(ShowTips);#endif//初始化状态
  4.         lua =newLuaState();//调用状态开始方法
  5.         lua.Start();
  6.         looper = gameObject.AddComponent<LuaLooper>();//调用协程需要借助外部组件 不然等待不会执行
  7.         looper.luaState = lua;//如果移动了ToLua目录,自己手动修复吧,只是例子就不做配置了string fullPath = Application.dataPath +"\\ToLua/Examples/05_LuaCoroutine";//添加lua文件路径
  8.         lua.AddSearchPath(fullPath);
  9.         lua.DoFile("TestLuaCoroutine.lua");LuaFunction f = lua.GetFunction("TestCortinue");
  10.         f.Call();
  11.         f.Dispose();
  12.         f =null;}voidOnApplicationQuit(){
  13.         looper.Destroy();
  14.         lua.Dispose();
  15.         lua =null;#if UNITY_5 || UNITY_2017 || UNITY_2018
  16.         Application.logMessageReceived -= ShowTips;#else
  17.         Application.RegisterLogCallback(null);#endif}string tips =null;voidShowTips(string msg,string stackTrace,LogType type){
  18.         tips += msg;
  19.         tips +="\r\n";}voidOnGUI(){
  20.         GUI.Label(newRect(Screen.width /2-300, Screen.height /2-200,600,400), tips);if(GUI.Button(newRect(50,50,120,45),"Start Counter")){
  21.             tips =null;LuaFunction func = lua.GetFunction("StartDelay");
  22.             func.Call();
  23.             func.Dispose();}elseif(GUI.Button(newRect(50,150,120,45),"Stop Counter")){LuaFunction func = lua.GetFunction("StopDelay");
  24.             func.Call();
  25.             func.Dispose();}elseif(GUI.Button(newRect(50,250,120,45),"GC")){
  26.             lua.DoString("collectgarbage('collect')","TestCoroutine.cs");
  27.             Resources.UnloadUnusedAssets();}}}
复制代码
其实如上代码,调用携程就和调用普通lua方法一样,只是借用了LuaLooper组件去实现协程的功能,如果不写
looper = gameObject.AddComponent();//调用协程需要借助外部组件 不然等待不会执行
looper.luaState = lua;
就会发现,携程方法会卡在wait的部分,不会往下执行。
其实也就是调用lua普通方法,在lua类里面,普通方法在去调用或停止对应的协程。
携程调用方式有两种,一种是作者封装好的,一种是类unity的,类unity的消耗较大,作者推荐为本方式调用协程。
由于去掉了lua与unity绑定,所以改为了加载外部lua文件,lua文件也是参考绑定的文件,只是去掉了unity相关的www加载代码,lua文件如下。
  1. function fib(n)
  2.     local a, b =0,1while n >0do
  3.         a, b = b, a + b
  4.         n = n -1
  5.     end
  6.     return a
  7. end
  8. function CoFunc()print('Coroutine started')for i =0,10,1doprint(fib(i))                    
  9.         coroutine.wait(0.1)                                               
  10.     end       
  11.         coroutine.wait(0.1)print("current frameCount: "..Time.frameCount)
  12.         coroutine.step()print("yield frameCount: "..Time.frameCount)
  13. end
  14. function TestCortinue()       
  15.     coroutine.start(CoFunc)
  16. end
  17. local coDelay = nil
  18. function Delay()
  19.         local c =1whiletruedo
  20.                 coroutine.wait(1)print("Count: "..c)
  21.                 c = c +1
  22.         end
  23. end
  24. function StartDelay()
  25.         coDelay = coroutine.start(Delay)
  26. end
  27. function StopDelay()
  28.         coroutine.stop(coDelay)
  29. end
复制代码
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-26 17:49 , Processed in 0.063424 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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