なんかいろいろしてみます

Dec 2, 2018 - 1 minute read - HoloLens

Unity2017.3のUWP環境でUnityWebRequestが動かない問題(Unity2017.4.2で修正済み)

Unity2017.3.0からUnity2017.4.1まででUWP環境でのUnityWebRequestが動作しない場合がありました.その対策

現在この問題はUnity2017.4.2で修正済みなので備忘録として書いておきます

環境

  • Unity2017.3またはUnity2017.4.1
  • Universal Windows Platform(UWP)実行環境(HoloLens,Immersive HMD,Desktop)

症状

UWP実行環境においてUnityWebRequest関数からByteデータを取得する動作(ファイルをダウンロードなど)を行うとデータが正常にダウンロードできません.

UWP以外の環境だと問題無いです.

12345
using (UnityWebRequest www=UnityWebRequest.Get(uri))
            {
                yield return www.SendWebRequest();
                www.downloadHandler.data;// ダウンロードファイル UWP環境だとデータ取得に失敗する
            }

対策

UWP実行環境時にはUWP側の関数HttpClientを用いてダウンロード処理を実装します. UWP環境用の関数を利用するのでUnityEditor上では動作確認できません. またHttpClientでは非同期処理も利用できるため,#ifで切り分けて実装します.

Unity2017.2からUnityWenRequestの関数が一部変更になっているのでそれも切り分けておきます.

 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839
using UnityEngine.Networking;
using System.Collections.Generic;
#if UNITY_UWP
using System.Threading.Tasks;
using Windows.Storage.Streams;
using Windows.Web.Http;
#endif

  public IEnumerator FileDownload(string uri)
    {
        yield return null;
#if UNITY_UWP
        // Taskとawaitによる非同期処理
        Task.Run(async () =>
        {
            HttpClient httpClient = new HttpClient();
            Uri requestUri = new Uri(uri);
            HttpResponseMessage httpResponse = new HttpResponseMessage();

            // ファイルダウンロード開始
                 httpResponse = await httpClient.GetAsync(requestUri);
                httpResponse.EnsureSuccessStatusCode();
            // ダウンロードデータの取得
                var buffer=await httpResponse.Content.ReadAsBufferAsync();
                byte[] bytes = new byte[buffer.Length];
                var reader = DataReader.FromBuffer(buffer);
                reader.ReadBytes(bytes);
                bytes;// ダウンロードファイル
        });
#else
        var request = UnityWebRequest.Get(uri);
#if !UNITY_2017_2_OR_NEWER
        yield return request.Send();
#else
        yield return request.SendWebRequest();
#endif
        request.downloadHandler.data;// ダウンロードファイル
#endif
    }

まとめ