案例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#太相似了,我就不一一列舉解釋了,大家自己看一下就可以了
效果圖如下: