案例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檔案都加入到工程中同時...