ジャコ Lab

プログラミング関連のメモ帳的ブログです

UnityWebRequestTexture を使って画像をインターネットから取得し Texture2D 化する

どうしても他のことをやっているとブログを書いている時間が取れず、そのまま忘れていく流れになりがちです・・・
休みの日に時間が取れたので過去のメモを記事にしておこうと思います。

少し前にどころか、数か月前に Unity で画像を取得する方法を調べました。

UnityWebRequestTexture というキーワードを知ったのでメモがてらサンプルコードを残していきます。

UnityWebRequestTexture を使うと簡単に画像のダウンロードから Texture2D を作るところまでできます。

リファレンス

docs.unity3d.com

やりたかったことがそのまま書いてありました

どうやらキャストして取得するパターンとヘルパーを利用するパターンがあるようです。

サンプルシーンを作成

サンプルシーン
サンプルシーン

ButtonRawImageだけの簡単な画面です

サンプルスクリプト

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class WebRequester : MonoBehaviour
{
    [SerializeField]
    private RawImage _rawImage;

    public void OnClickGetTexture()
    {
        StartCoroutine(GetTexture("https://picsum.phostos/200"));
    }

    private IEnumerator GetTexture(string url)
    {
        using var req = UnityWebRequestTexture.GetTexture(url);

        Debug.Log("[WebRequester] Send");
        yield return req.SendWebRequest();
        Debug.Log("[WebRequester] Recv");

        if (req.result == UnityWebRequest.Result.Success)
        {
            var texture = DownloadHandlerTexture.GetContent(req);
            _rawImage.texture = texture;
        }
        else
        {
            Debug.LogError($"[WebRequester:ERROR] {req.downloadHandler.error != "" ? req.downloadHandler.error : req.error}");
        }
    }
}

こんな感じのスクリプトを用意してみました。ダウンキャストを利用するよりもこちらの方が素直かなと思い DownloadHandlerTexture.GetContent() を使用するパターンを採用しました。

たぶん、GetContent()の中ではキャストが発生していると思いますが!

インスペクタで設定

画像を表示する場所を設定

上記のサンプルスクリプトをアタッチした GameObject のインスペクタに RawImage を設定します。

Raw Image をアタッチする様子
Raw Image をアタッチする様子

ボタンのクリックリスナーを設定する

次にボタンを押したときに上記のサンプルスクリプトOnClickGetTexture() が発火するように設定します。

Button のクリックリスナーを設定する様子
Button のクリックリスナーを設定する様子

試してみる

画像はこちらのサイトを利用させていただきます。

実行結果
実行結果

まとめ

データのダウンロード後、Texture2D まで出来ていて楽ちん