もんりぃ is undefined.

育児ネタとか、技術ネタとか。

UnityWebRequest を用いた Texture の取得方法 (追記あり)

TL; DR

  • UnityWebRequest.Get ではなく UnityWebRequestTexture.GetTexture を使いましょう。

UnityWebRequest について

  • 昔のバージョンの Unity では WWW というクラスを用いて HTTP な通信を行っていました。
  • しかし、Unity 5.4 から UnityWebRequest というクラスが新たに登場しました。
  • このクラスの登場により、より柔軟な HTTP Request / Response が行えるようになりました。
  • UniRx と組み合わせると、より便利になったりするのですが、それはまた別のお話。

本題

  • 最初、画像を取得する際の処理を以下のように考えました。
    • UnityWebRequest.Get で UnityWebRequest のインスタンスを構築
    • request.Send() でリクエスト送信
    • レスポンス受信が完了したら request.downloadHandler.data を Texture2D に食わせる
  • しかし、そもそもそのやり方だとうまく Texture2D のインスタンスが生成できませんでした。
  • じゃあ、何故か?というと、元々 2017.1.0f1 以前の Unity には UnityWebRequest.GetTexture というメソッドがあり、そちらを使うのが正解でした。
  • しかし、2017.1.0f1 で UnityWebRequestTexture.GetTexture に移動しているので、こちらを使う必要がある、というオチでした。
  • なお、 AudioClip や MovieTexture (モバイル非対応) も同様に UnityWebRequestMultimedia.GetAudioClip や UnityWebRequestMultimedia.GetMovieTexture が正解っぽいです。
  • また、データを受けるための DownloadHandler はそれぞれ DownloadHandlerTexture と DownloadHandlerAudioClip と DownloadHandlerMovieTexture という専用のクラスが用意されています。

所感

  • 利用している Unity のバージョンによって処理が異なるので、共通ライブラリ化してたりすると #if UNITY_X_Y な制御が増えそうですね…。

追記

  • Unity 2017.1.1p3 に於いて、 UnityWebRequestTexture.GetTexture() は挙動が怪しいようです。
  • まだ、バグレポ送れてはいませんが、「iOS 環境で同時に複数リクエストを送信すると、稀に取得できるインスタンスが Texture2D 以外のモノになる」というバグがあります。
  • 直るまでは、downloadHandler.data を Texture2D.LoadImage() に食わせるやり方が安全っぽいです。