1. 程式人生 > >ToLua 協程中呼叫 WWW

ToLua 協程中呼叫 WWW

引言:

在遊戲中假如需要下載網路資源,一般都是藉助 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

參考資料: