Tolua使用筆記三 Tolua協程用法

2021-08-01 16:21:37 字數 3444 閱讀 1286

案例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("")

coroutine.www(www)

local s = tolua.tolstring(www.bytes)

print(s:sub(1, 128))

print('coroutine ended')

endfunction 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();

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.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('')

yield(www)

print('yield(www) end time: '.. unityengine.time.time)

local s = tolua.tolstring(www.bytes)

print(s:sub(1, 128))

print('coroutine over')

endfunction testco()

startcoroutine(coexample)

endfunction startdelay()

codelay = startcoroutine(delay)            

endfunction stopdelay()

stopcoroutine(codelay)

end

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

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

效果圖如下:

Tolua使用筆記三 Tolua協程用法

案例5 這一章講的是lua中的協程 如果我沒記錯的話,lua中沒有多執行緒,只有協程,lua的協程自帶的用起來有點侷限性,tolua中協程由於重寫了部分的方法,變得更加方便了 核心 如下 function cofunc print coroutine started local i 0 for i ...

ToLua學習筆記,使用Update方法(四)

每次我新增乙個lua指令碼,我都需要編寫重複的new函式麼?可以這樣,修改luacomponent.cs 如下 新增luaobject.lua指令碼,內容如下 此時在這樣呼叫 這是通過luacomponent的new函式查詢全域性的luaobject裡的new函式,來建立不同的lua表 當然也可以直...

centos下簡單使用tolua

3 編寫測試工程,編寫pkg檔案用tolua命令生成標頭檔案和可執行檔案 tolua o luafun.cpp h luafun.h luafun.pkg luafun.pkg include fun.h struct param class girl 把生成的標頭檔案和cpp檔案都加入到工程中同時...