美文网首页
ToLua的Example示例学习笔记05_LuaCorouti

ToLua的Example示例学习笔记05_LuaCorouti

作者: 凌枫望星月 | 来源:发表于2020-05-11 15:14 被阅读0次

    展示了如何使用lua协同。

    1」代码

    操作代码如下:

            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 = 1, 10, 1 do
                    print(fib(i))                    
                    coroutine.wait(0.1)                     
                end 
                print("current frameCount: "..Time.frameCount)
                coroutine.step()
                print("yield frameCount: "..Time.frameCount)
    
                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
    

    c#代码如下:

            new LuaResLoader();
            lua  = new LuaState();
            lua.Start();
            LuaBinder.Bind(lua);
            DelegateFactory.Init();         
            looper = gameObject.AddComponent<LuaLooper>();
            looper.luaState = lua;
    
            lua.DoString(luaFile.text, "TestLuaCoroutine.lua");
            LuaFunction f = lua.GetFunction("TestCortinue");
            f.Call();
            f.Dispose();
            f = null;  
    

    2」需要了解的部分

    • 首先,用到了LuaBinder.Bind(lua);,再给gameObject加上一个LuaLooper脚本组件用于驱动协同,最后将虚拟机lua赋值给脚本组件中的luaState变量即可。
    • 必须启动LuaLooper驱动协同,这里将一个lua的半双工协同装换为类似unity的全双工协同
    • fib函数负责计算一个斐那波契n

    3」值得注意的方法

    • coroutine.start(Func) 启动一个lua协同,返回一个coroutine对象
    • coroutine.wait 协同中等待一段时间,单位:秒
    • coroutine.step 协同中等待一帧.
    • coroutine.www 等待一个WWW完成.
    • tolua.tolstring 转换byte数组为lua字符串缓冲
    • coroutine.stop(coroutine对象) 停止一个正在lua将要执行的协同

    相关文章

      网友评论

          本文标题:ToLua的Example示例学习笔记05_LuaCorouti

          本文链接:https://www.haomeiwen.com/subject/lyuunhtx.html