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
}
|
まとめ