ToLua 入门06_LuaCoroutine
协程在unity中特别常用,在tolua中,我们也能在lua文本中实现协程调用;但是在demo范例中,除了协程调用,还有一些warp绑定一类的知识,可能学习起来会懵B;为了方便学习,我们可以对例子做出简单修改,使学生知识点更加串联。打开ToLua/Examples/05_LuaCoroutine的TestCoroutine类文件,将类改外以下代码(去掉了绑定相关代码,指定为lua文件)。
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
Application.logMessageReceived += ShowTips;#else
Application.RegisterLogCallback(ShowTips);#endif//初始化状态
lua =newLuaState();//调用状态开始方法
lua.Start();
looper = gameObject.AddComponent<LuaLooper>();//调用协程需要借助外部组件 不然等待不会执行
looper.luaState = lua;//如果移动了ToLua目录,自己手动修复吧,只是例子就不做配置了string fullPath = Application.dataPath +"\\ToLua/Examples/05_LuaCoroutine";//添加lua文件路径
lua.AddSearchPath(fullPath);
lua.DoFile("TestLuaCoroutine.lua");LuaFunction f = lua.GetFunction("TestCortinue");
f.Call();
f.Dispose();
f =null;}voidOnApplicationQuit(){
looper.Destroy();
lua.Dispose();
lua =null;#if UNITY_5 || UNITY_2017 || UNITY_2018
Application.logMessageReceived -= ShowTips;#else
Application.RegisterLogCallback(null);#endif}string tips =null;voidShowTips(string msg,string stackTrace,LogType type){
tips += msg;
tips +="\r\n";}voidOnGUI(){
GUI.Label(newRect(Screen.width /2-300, Screen.height /2-200,600,400), tips);if(GUI.Button(newRect(50,50,120,45),"Start Counter")){
tips =null;LuaFunction func = lua.GetFunction("StartDelay");
func.Call();
func.Dispose();}elseif(GUI.Button(newRect(50,150,120,45),"Stop Counter")){LuaFunction func = lua.GetFunction("StopDelay");
func.Call();
func.Dispose();}elseif(GUI.Button(newRect(50,250,120,45),"GC")){
lua.DoString("collectgarbage('collect')","TestCoroutine.cs");
Resources.UnloadUnusedAssets();}}}其实如上代码,调用携程就和调用普通lua方法一样,只是借用了LuaLooper组件去实现协程的功能,如果不写
looper = gameObject.AddComponent();//调用协程需要借助外部组件 不然等待不会执行
looper.luaState = lua;
就会发现,携程方法会卡在wait的部分,不会往下执行。
其实也就是调用lua普通方法,在lua类里面,普通方法在去调用或停止对应的协程。
携程调用方式有两种,一种是作者封装好的,一种是类unity的,类unity的消耗较大,作者推荐为本方式调用协程。
由于去掉了lua与unity绑定,所以改为了加载外部lua文件,lua文件也是参考绑定的文件,只是去掉了unity相关的www加载代码,lua文件如下。
function fib(n)
local a, b =0,1while n >0do
a, b = b, a + b
n = n -1
end
return a
end
function CoFunc()print('Coroutine started')for i =0,10,1doprint(fib(i))
coroutine.wait(0.1)
end
coroutine.wait(0.1)print("current frameCount: "..Time.frameCount)
coroutine.step()print("yield frameCount: "..Time.frameCount)
end
function TestCortinue()
coroutine.start(CoFunc)
end
local coDelay = nil
function Delay()
local c =1whiletruedo
coroutine.wait(1)print("Count: "..c)
c = c +1
end
end
function StartDelay()
coDelay = coroutine.start(Delay)
end
function StopDelay()
coroutine.stop(coDelay)
end
页:
[1]