【Unity】UnityでAssetBundleをダウンロードする方法すべてまとめ

UnityでAssetBundleをダウンロード・保存する方法はいろいろなやり方があってどれを使えばいいのかわかりづらいです。
そこで、UnityでAssetBundleをダウンロードする方法をすべてまとめてみました。

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;
}

キャッシュの仕組みについては本記事では詳しく触れません。
下記の記事でとても詳しく検証されています。

qiita.com

独自のDownloadHandlerを使う

UnityWebRequesetのDownloadHandlerはカスタムできるので、
次の記事の後半で紹介されているように自作のDownloadHandlerを使うこともできます。

techblog.kayac.com

UnityWebRequestすら使わない

一応、次の記事のようにUnityWebRequestすら使わないという手もあります。参考までに。

developers.cyberagent.co.jp

関連

light11.hatenadiary.com

light11.hatenadiary.com