Tolua使用筆記三:Tolua協程用法

案例5:

這一章講的是lua中的協程

如果我沒記錯的話,lua中沒有多線程,只有協程,lua的協程自帶的用起來有點侷限性,Tolua中協程由於重寫了部分的方法,變得更加方便了

核心代碼如下:

function CoFunc()
    print('Coroutine started')
    local i = 0
    for i = 0, 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
效果圖如下:

對於lua中的協程:

主要的知識點如下:

1:註冊C#中類型方法到lua中 :先在ToLua中的CustomSetting.cs 文件中添加需要註冊的類型,然後按照C#中的那種方法直接用a.b就可以調用C#類型中的靜態方法了,如果調用的是非靜態方法,則是用a:b  , 具體爲什麼這麼區別是因爲lua中沒有類的概念,只能用這種方法獲取到具體對象


2:lua協程的準備工作

在 創建完lua虛擬機之後,一定要記得做以下幾步:

lua.Start();
LuaBinder.Bind(lua);                
looper = gameObject.AddComponent<LuaLooper>();
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的推薦協程使用方案

具體的核心代碼如下:

        function CoExample()            
            WaitForSeconds(2)
            print('WaitForSeconds end time: '.. UnityEngine.Time.time)
            WaitForFixedUpdate()
            print('WaitForFixedUpdate end frameCount: '..UnityEngine.Time.frameCount)
            WaitForEndOfFrame()
            print('WaitForEndOfFrame end frameCount: '..UnityEngine.Time.frameCount)
            Yield(null)
            print('yield null end frameCount: '..UnityEngine.Time.frameCount)
            Yield(0)
            print('yield(0) end frameCime: '..UnityEngine.Time.frameCount)
            local www = UnityEngine.WWW('http://www.baidu.com')
            Yield(www)
            print('yield(www) end time: '.. UnityEngine.Time.time)
            local s = tolua.tolstring(www.bytes)
            print(s:sub(1, 128))
            print('coroutine over')
        end

        function TestCo()            
            StartCoroutine(CoExample)                                   
        end

     function StartDelay()
       coDelay = StartCoroutine(Delay)            
     end

     function StopDelay()
       StopCoroutine(coDelay)
     end

好處大概就是lua代碼的寫法上更加和C#中類似了,而且沒有了之前的準備工作,代價是效率降低很多了,而且自己的C#端對應得對象需要繼承類LuaClient,LuaClient中就封裝了方案1中所有的那些操作,其實到最後還是返璞歸真了,除此之外還加載了一些其他的庫,估計這些就是寫法改變的核心~~,

主要使用方法由於和C#太相似了,我就不一一列舉解釋了,大家自己看一下就可以了

效果圖如下:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章