ToLua 協程中呼叫 WWW
阿新 • • 發佈:2019-02-04
引言:
在遊戲中假如需要下載網路資源,一般都是藉助 Unity.WWW
工具類來完成,接下來我們分別說一下 C# 和 tolua 下實現的過程。
C# 下的實現
在 C# 中的做法通常如下:
- 啟動一個協程來執行下載任務,建立一個
WWW
物件; - 在一個死迴圈中查詢下載任務是否完成;
- 下載完成則跳出迴圈體,從上面建立的
WWW
物件的bytes
屬性中取出下載到的資料。
using UnityEngine;
using System.Collections;
public class TestWWW : MonoBehaviour {
// Use this for initialization
void Start () {
string url = "http://news.hainan.net/Editor/img/201702/20170213/big/20170213072342206_6778430.jpg";
//啟動一個協程執行下載任務
StartCoroutine(Download(url));
}
IEnumerator Download(string url)
{
WWW www = new WWW(url);
//在迴圈中查詢是否下載完畢
while (www != null )
{
if(www.isDone)
{
//下載結束退出死迴圈
break;
}
yield return null;
}
//統計下載資料大小
var data = www.bytes;
int strDataLengthKB = (int)data.Length / 1000;
Debug.Log("下載資源大小:"+strDataLengthKB+" KB" );
}
// Update is called once per frame
void Update () {
}
}
這裡我已下載一張圖片為例子,執行結果在如下:
下載資源大小:67 KB
UnityEngine.Debug:Log(Object)
toLua 下的實現
lua 中原生的協程容易出各種奇奇怪怪的問題,tolua 中做了優化,使用起來方便得多,同樣的功能在 tolua 中的寫法:
coroutine.start(function()
print('協程開始')
local www = WWW('http://news.hainan.net/Editor/img/201702/20170213/big/20170213072342206_6778430.jpg')
--等待 www 下載完畢後繼續執行
coroutine.www(www)
--下載到的資料
local data = www.bytes
local size = math.floor(data.Length/1000)
print('協程結束,資料大小:'..size..' Kb')
end)
執行結果:
協程開始
UnityEngine.Debug:Log(Object)
協程結束,資料大小:67 Kb
UnityEngine.Debug:Log(Object)
錯誤判別:
我還遇到一個問題就是要下載的地址不存在,但是 WWW.bytes
依然回返回 168b
的資料,那麼我們要如何來判斷是否正常下載到我們想要資料?那就需要使用 WWW
自帶的錯誤資訊 WWW.error
屬性了:
--錯誤資訊
local errorInfo = www.error
if errorInfo~= nil and string.len(errorInfo) > 0 then
local i,j = string.find(errorInfo,'404')
if j ~= nil then
--下載資源不存在
end
end