中堅プログラマーの備忘録

忘れっぽくなってきたので備忘録として・・・

【Unity】UnityWebRequestを使って画像ファイルをダウンロードし保存する

1.概要

Unity5.4から正式にリリースされた【UnityWebRequest】を使って
web上にある画像ファイルをダウンロードして
ローカルに保存してみます。

動作確認を行ったUnityのバージョンは【2019.2.13f1】になります。

2.スクリプト

using System;
using System.IO;
using UnityEngine.Networking;


StartCoroutine(GetwebReqContents());


private IEnumerator GetwebReqContents()
{
    Debug.Log("処理開始");
    while (Application.internetReachability == NetworkReachability.NotReachable)
    {
        Debug.Log("ネットワークに接続されていない");
        yield return new WaitForSeconds(5f);
    }

    Debug.Log("画像の取得開始");
    UnityWebRequest webReq = UnityWebRequestTexture.GetTexture("画像のURL");
    yield return webReq.SendWebRequest();
    Debug.Log("画像の取得完了");

    if (webReq.isNetworkError || webReq.isHttpError)
    {
        Debug.Log(webReq.error);
    }
    else
    {
        try
        {
            File.WriteAllBytes(@"保存先ファイルパス", webReq.downloadHandler.data);
            Debug.Log("保存完了");
        }
        catch(Exception ex)
        {
            Debug.Log(ex.Message);
        }
    }
}

3.使い方

基本的にはコルーチンを使うことになります。
【IEnumerator】インターフェースを使って【StartCoroutine】で関数を実行します。


スクリプトの説明としては
【Application.internetReachability】でインターネットのアクセス状態を調べます。
状態が【NetworkReachability.NotReachable】であれば
インターネットに接続されていない状態なので

yield return new WaitForSeconds(5f);
で5秒間処理を停止し、再開する。を
アクセス可能な状態になるまで繰り返します。


アクセス可能な状態

NetworkReachability.ReachableViaCarrierDataNetwork:キャリアネットワーク
or
NetworkReachability.ReachableViaLocalAreaNetwork:Wi-Fiネットワーク
になったら
UnityWebRequestTexture.GetTexture
でHTTP Get経由で画像をダウンロードしに行きます。
ダウンロードが完了したら指定パスに保存するといった流れになります。

4.結果

下図のとおりの流れになります。
【ネットワークに接続されていない】
の部分は故意にネットワークを切断しています。


f:id:tsu--kun:20191128151912p:plain