UnityでAssetBundleをダウンロード・保存する方法はいろいろなやり方があってどれを使えばいいのかわかりづらいです。
そこで、UnityでAssetBundleをダウンロードする方法をすべてまとめてみました。
- UnityWebRequest.Get x DownloadHandlerBuffer
- UnityWebRequest.Get x DownloadHandlerFile
- UnityWebRequestAssetBundle x DownloadHandlerAssetBundle
- 独自のDownloadHandlerを使う
- UnityWebRequestすら使わない
- 関連
Unity2018.3.9
UnityWebRequest.Get x DownloadHandlerBuffer
1つ目の方法はUnityWebRequest.Get()
を使って通信を処理する方法です。
Downloadの処理を行うDownloadHandlerとしてはデフォルトのDownloadHandlerBufferを使います。
この方法ではダウンロード完了時にバイト配列としてAssetBundleが得られます。
using (var request = UnityWebRequest.Get(url)) { yield return request.SendWebRequest(); if (request.isHttpError || request.isNetworkError) { yield break; } var data = request.downloadHandler.data; // バイト配列としてAssetBundleが得られるので読み込む場合はAssetBundle.LoadFromMemory var assetBundle = AssetBundle.LoadFromMemory(data); }
ディスクへの書き込みはFileクラスやFileStreamを使います。
最も汎用的なダウンロード方法ですが、以降の方法に比べて最適化はされていません。
UnityWebRequest.Get x DownloadHandlerFile
次に、DownloadHandlerをFile保存に特化したものに差し替えてみます。
このハンドラを使うとディスクへの書き込みまでをやってくれます。
また、データを受信した順に都度書き込みを行ってくれるのでメモリにも優しいです。
using (var request = UnityWebRequest.Get(url)) { // DownloadHandlerをファイル用のものに差し替える request.downloadHandler = new DownloadHandlerFile(savePath); yield return request.SendWebRequest(); if (request.isHttpError || request.isNetworkError) { yield break; } // すでにディスクへの書き込みが終わっているのでAssetBundle.LoadFromFileでも取得できる var assetBundle = AssetBundle.LoadFromFile(savePath); }
次節のようなUnityが用意してくれているキャッシュの仕組みは使えないので自作する必要はあるものの、
暗号化などUnityがサポートしない実装が自由にできるメリットがあります。
UnityWebRequestAssetBundle x DownloadHandlerAssetBundle
UnityWebRequest.Get
の代わりにUnityWebRequestAssetBundle.GetAssetBundle
を使う方法もあります。
これを使うと、AssetBundleをUnityが管理する保存先に保存してくれます。
また、その保存先にAssetBundleが保存されている場合にはダウンロードしないでそちらから取得してくれます。
using (var request = UnityWebRequestAssetBundle.GetAssetBundle(url)) { yield return request.SendWebRequest(); if (request.isHttpError || request.isNetworkError) { yield break; } // ハンドラはDownloadHandlerAssetBundleにキャストする var handler = request.downloadHandler as DownloadHandlerAssetBundle; var assetBundle = handler.assetBundle; }
キャッシュの仕組みについては本記事では詳しく触れません。
下記の記事でとても詳しく検証されています。
独自のDownloadHandlerを使う
UnityWebRequesetのDownloadHandlerはカスタムできるので、
次の記事の後半で紹介されているように自作のDownloadHandlerを使うこともできます。
UnityWebRequestすら使わない
一応、次の記事のようにUnityWebRequestすら使わないという手もあります。参考までに。