【Unity】今から始めるAssetBundle【2019】

数年ぶりにAssetBundleを触ったらわけがわからなかったので現時点における入門用の情報をまとめておきます。
本記事はAssetBundleの全体感の把握を簡潔にするための記事であり、個々の項目に対して深入りはしません。
ざっと理解するためにつかってください。

なおAdressable Assetについては本記事では取り扱いません。

Unity2018.3.9

概要

まずAssetBundleとは、かなりいい加減な言い方をするとZipファイルみたいなものです。
いくつかのAssetをまとめて圧縮して保存、使うときには解凍して使います。

AssetBundleを使うまでには下記の手順を理解する必要があります。

  1. AssetBundleをビルド
  2. AssetBundleをダウンロード
  3. AssetBundleをロード
  4. AssetBundleからAssetをロード

以下、この順に概要を説明していきます。

AssetBundleをビルド

何はともあれまずは、Assetをまとめて圧縮、つまりAssetBundleをビルドする必要があります。

AssetBundleはスクリプトを使ってビルドできます。

docs.unity3d.com

AssetBundleBrowserを使うとスクリプトを書かなくても簡単にビルドを試せます。

docs.unity3d.com

また、AssetBundleには以下の三つの圧縮設定があります。

名前 説明
LZ4 標準的な圧縮設定
一部のAssetだけを解凍できる(部分解凍)
LZMA 昔からある圧縮設定
部分解凍できない
無圧縮 無圧縮

実際にはほとんどのケースでLZ4を選択しておけば問題はありませんが、
ロードの資料などで圧縮形式の話が出てくるので把握しておいたほうがいいです。

各圧縮形式ごとのパフォーマンスは次の記事で検証されています。

tsubakit1.hateblo.jp

AssetBundleをダウンロード

ビルドしたAssetBundleはサーバにアップロードして、必要なタイミングでダウンロードすることが多いと思います。

AssetBundleはただのバイナリファイルなので、ダウンロードには普通にUnityWebRequest.Getを使います。

docs.unity3d.com

ダウンロードしたAssetBundleはこれまた普通にFileクラスなどでディスクに書き込みます。
DownloadHandlerFileというDownloadHandlerを使うと書き込みまで良い感じにやってくれたりもします。

また、これらの処理をUnityがやってくれるAPIUnityWebRequestAssetBundle.GetAssetBundleも用意されています。

docs.unity3d.com

これを通してダウンロードをすると、AssetBundleがUnityが決めたフォルダに保存されます。
またもしディスクにAssetBundleがすでに存在する場合には、同じAPIでディスクから読み込みをしてくれたり、
バージョン管理など面倒な処理を肩代わりしてくれたりします。
ただしその分、暗号化など独自の処理を入れることはできません。

これについては下記の記事で詳しく説明されています。

qiita.com

ダウンロード方法をまとめるとこんな感じです。

API 説明
UnityWebRequest.Get バイナリデータとしてAssetBundleをダウンロード
UnityWebRequestAssetBundle.GetAssetBundle ダウンロードからディスクにおける管理までを行うAPI

AssetBundleをロード

次に、ダウンロードしてディスクに保存したAssetBundleをメモリにロードします。
メモリにロードする方法には次の4つの方法があります。

API 説明 対応するダウンロード方法
AssetBundle.LoadFromMemory
AssetBundle.LoadFromMemoryAsync
メモリからロード
暗号化などするときに使う
UnityWebRequest.Get
AssetBundle.LoadFromFile
AssetBundle.LoadFromFileAsync
ファイルからロード UnityWebRequest.Get
WWW.LoadFromCacheOrDownload 古いAPIなので使わない
(代わりにUnityWebRequestAssetBundle.GetAssetBundleを使う)
-
UnityWebRequestAssetBundle.GetAssetBundle
の後にDownloadHandler.assetBundleで取得
UnityWebRequestAssetBundle.GetAssetBundle

まず、前節のダウンロード方法によって使用できるロード方法が変わってくるので注意が必要です。
UnityWebRequest.Getでダウンロードした場合には、AssetBundle.LoadFromMemoryAssetBundle.LoadFromFileを使うことになります。

また、UnityWebRequestAssetBundle.GetAssetBundleでダウンロードした場合には、ロードにも同じAPIを使います。
このAPIはもしディスクにAssetBundleが存在すればそれを取ってきて、なければダウンロードしてくれます。

ちなみにWWW.LoadFromCacheOrDownloadは古いので忘れましょう。

ロード方法の詳細は下記に載っています。(古い記事ですが情報は更新されていそうです)

unity3d.com

AssetBundleからAssetをロード

AssetBundleをロードしたらその中からAssetをロードする必要があります。
AssetのロードはAssetBundle.LoadAssetで行います。

docs.unity3d.com

AssetBundle同士の依存関係

例えばあるMaterialと、それが参照するテクスチャが別々のAssetBundleに格納されていたとします。

このような場合にはAssetBundleの依存関係が形成されるため、
先にテクスチャのAssetBundleを読み込んでからMaterialのAssetBundleを読み込む必要があります。

依存関係についての詳細は下の記事にまとめていますので必要に応じて参照してください。

light11.hatenadiary.com

AssetBundleManifest

AssetBundleをビルドすると、ビルドしたフォルダの直下にフォルダ名と同名のAssetBundleが作られます。
そしてこの中にはAssetBundleManifestというAssetが保存されています。

AssetBundleManifestには、AssetBundle同士の依存関係の情報や、バージョン管理のための情報が書き込まれています。

次の記事に少し詳しく書いているので必要に応じて参照してください。

light11.hatenadiary.com

参考

qiita.com

unity3d.com

tsubakit1.hateblo.jp

blog.applibot.co.jp