数年ぶりにAssetBundleを触ったらわけがわからなかったので現時点における入門用の情報をまとめておきます。
本記事はAssetBundleの全体感の把握を簡潔にするための記事であり、個々の項目に対して深入りはしません。
ざっと理解するためにつかってください。
なおAdressable Assetについては本記事では取り扱いません。
- 概要
- AssetBundleをビルド
- AssetBundleをダウンロード
- AssetBundleをロード
- AssetBundleからAssetをロード
- AssetBundle同士の依存関係
- AssetBundleManifest
- 参考
Unity2018.3.9
概要
まずAssetBundleとは、かなりいい加減な言い方をするとZipファイルみたいなものです。
いくつかのAssetをまとめて圧縮して保存、使うときには解凍して使います。
AssetBundleを使うまでには下記の手順を理解する必要があります。
- AssetBundleをビルド
- AssetBundleをダウンロード
- AssetBundleをロード
- AssetBundleからAssetをロード
以下、この順に概要を説明していきます。
AssetBundleをビルド
何はともあれまずは、Assetをまとめて圧縮、つまりAssetBundleをビルドする必要があります。
AssetBundleはスクリプトを使ってビルドできます。
AssetBundleBrowserを使うとスクリプトを書かなくても簡単にビルドを試せます。
また、AssetBundleには以下の三つの圧縮設定があります。
名前 | 説明 |
---|---|
LZ4 | 標準的な圧縮設定 一部のAssetだけを解凍できる(部分解凍) |
LZMA | 昔からある圧縮設定 部分解凍できない |
無圧縮 | 無圧縮 |
実際にはほとんどのケースでLZ4を選択しておけば問題はありませんが、
ロードの資料などで圧縮形式の話が出てくるので把握しておいたほうがいいです。
各圧縮形式ごとのパフォーマンスは次の記事で検証されています。
AssetBundleをダウンロード
ビルドしたAssetBundleはサーバにアップロードして、必要なタイミングでダウンロードすることが多いと思います。
AssetBundleはただのバイナリファイルなので、ダウンロードには普通にUnityWebRequest.Get
を使います。
ダウンロードしたAssetBundleはこれまた普通にFileクラスなどでディスクに書き込みます。
DownloadHandlerFileというDownloadHandlerを使うと書き込みまで良い感じにやってくれたりもします。
また、これらの処理をUnityがやってくれるAPIUnityWebRequestAssetBundle.GetAssetBundle
も用意されています。
これを通してダウンロードをすると、AssetBundleがUnityが決めたフォルダに保存されます。
またもしディスクにAssetBundleがすでに存在する場合には、同じAPIでディスクから読み込みをしてくれたり、
バージョン管理など面倒な処理を肩代わりしてくれたりします。
ただしその分、暗号化など独自の処理を入れることはできません。
これについては下記の記事で詳しく説明されています。
ダウンロード方法をまとめるとこんな感じです。
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.LoadFromMemory
かAssetBundle.LoadFromFile
を使うことになります。
また、UnityWebRequestAssetBundle.GetAssetBundle
でダウンロードした場合には、ロードにも同じAPIを使います。
このAPIはもしディスクにAssetBundleが存在すればそれを取ってきて、なければダウンロードしてくれます。
ちなみにWWW.LoadFromCacheOrDownloadは古いので忘れましょう。
ロード方法の詳細は下記に載っています。(古い記事ですが情報は更新されていそうです)
AssetBundleからAssetをロード
AssetBundleをロードしたらその中からAssetをロードする必要があります。
AssetのロードはAssetBundle.LoadAsset
で行います。
AssetBundle同士の依存関係
例えばあるMaterialと、それが参照するテクスチャが別々のAssetBundleに格納されていたとします。
このような場合にはAssetBundleの依存関係が形成されるため、
先にテクスチャのAssetBundleを読み込んでからMaterialのAssetBundleを読み込む必要があります。
依存関係についての詳細は下の記事にまとめていますので必要に応じて参照してください。
AssetBundleManifest
AssetBundleをビルドすると、ビルドしたフォルダの直下にフォルダ名と同名のAssetBundleが作られます。
そしてこの中にはAssetBundleManifestというAssetが保存されています。
AssetBundleManifestには、AssetBundle同士の依存関係の情報や、バージョン管理のための情報が書き込まれています。
次の記事に少し詳しく書いているので必要に応じて参照してください。