今回、参加しているUnity案件でアセットバンドルを使ってほしいという要望があり、いざ開発に着手したところ、AssetManagerにAssetBandleMangerがない(非推奨になっている)ことを知った。
後続として、Unity Adressable Assets System(AAS)になっているらしいのだが、いろいろな記事やYoutubeを漁ったけど、ちょっと何言っているかわからないレベルだったので、誰よりもわかりやすくまとめてみたいと思います。
・環境は6000.0.10f1
・Adressable Assets Systemとは
Unityで現在主流になっているアセット管理システムです。
・利点
画像とか動画とか3Dモデルとかテクスチャとかマテリアルとか、、
Resourcesから読み込むようなシステムだとアプリ内に含まれてビルドされてしまうのでアプリが肥大化してしまう。データを追加するたびにいちいちアプリをビルドしてリリースする必要がある。
これを解消できる画期的な仕組み。
スクリプトも簡単。非同期ロードを使用して任意の場所からロードすることができる。
メモリ管理も自動でやってくれるのでロード&アンロードがかなり便利。
例えば今まで動的に生成したプレハブのテクスチャとかマテリアルを変更したあと、プレハブを削除してもテクチャやマテリアルは解放されないので、自力でガベ処理(メモリの解放処理)を行う必要があったが、ここも自動でやってくれる。
・想定されるケース
ゲームやアプリケーション内で、ダウンロードやアップデートを通じて新しいコンテンツを動的に追加したい場合。
新しいレベル、キャラクター、アイテムなどをアプリケーションの初回リリース後に追加する場合。
・個人的に調査したかった内容
Q1 .そもそもの使い方。
Q2 .たとえば30個登録しているアセットグループは全部ロードされてしまうのか
Q3.アプリ本体とアセット用でプロジェクトを分けた方が管理しやすいかと思ったけど問題ないのか。
今回は①についてまとめてみる。
・使い方
テストでは課金システムのようなものを作りたいと思います。
ボタンを押すと外部からデータをロードしてグリッドビューに動的に一覧表示。そのオブジェクトをクリックすると購入(使用できる)ようにしたいと思います。
①PackageManager よりAddressable Asset Systemを導入します。
②インストールが完了したら[Window] > [Asset Management] > [Addressables] > [Groups]を選択します。
初めて利用する場合は、以下のようなウィンドウが表示されるので、[Create
Addressables Settings]ボタンを押します。
③外部から読み込みたい素材(動画、3Dモデル、画像など)を選択し、
インスペクターのAdressableにチェックを入れます。
チェックを入れると自動的にAddressables Groupウィンドウの「Default Local Group」に追加されていきます。
自分でグループを作ったり、複数のファイルをまとめて登録したい場合はAddressables Groupウィンドウを開いてドラッグアンドドロップで登録するのがラクチンです。(複数ファイルを選択した状態でチェック入れてもOK)
画像の場合Texture TypeをSprite (2D and UI)などに設定しておけばそのままパッケージに含めることができますので必要な設定は先にしておくと便利です。
④7つの動画を登録してみました。
スクリプトからアセットを読み出すにはAddressable Nameを指定することになります。Labelの項目に好きな名前を設定することができます
ここで名前を設定しておくとこのラベル単位で読み込むことができるのでMovieをいうラベルを設定しておきます。タグのようなイメージですね。
PlaymodeをUse Exting Buildにしておくと便利なので変更しておきます。
⑤サンプルコード。適当なオブジェクトにアタッチしてエディタで実行すると、ローカルフォルダからアセットが読み込まれていることがわかる。
下記のコードではStartにAddressableの読み込み処理を書いたので、アプリケーションが実行されたタイミングで読み込み処理が行われているが、運用時はボタンを押したときに読み込み処理を行い、パネルにイメージを追加。パネルを閉じたときに開放するように作っていくことになる。
また、AddressableのデータはローカルのAssets/AAS_Movieフォルダ内に配置しているため、実行時はここから読み込まれている
このためたとえば動画ファイルを削除したりするとAddressable Groupからも消されてしまう。
アセットをロードしたら、毎回忘れずに解放する必要があるらしい。
実行したところローカルフォルダからアセットが読み込まれていることが確認できる。
⑥アセットをリモート先(WEBサーバー)から読み込んでみる。
サーバに配置するためには、Addressableをビルドしてアップロードする必要があります。設定は少し複雑ですが、スクリプトはリモートとローカルで変更する必要がありません(超重要)。
まず、[Window] -> [Asset Management] -> [Addressables] -> [Profile]を開き、Remoteの項目を[Custom]に設定、下記の2つを設定します。
RemoteBuildPath:アップロードするアセットファイルを作るフォルダ
RemoteLoadPath:アップロード先(=実行時に取得する)のURL
僕の場合、ロリポップにWordpress環境があるのでこんな感じで登録
続いて
[Window] -> [Asset Management] -> [Addressables] -> [Settings]を選択
・Build Remote Catalogにチェック
・Catalog/Player Version Overrideに0と記入
・Build & Load PathsにRemoteを指定
この状態でビルドしたものをサーバにアップする。
また、ここのBuild & Load PathsをLocal Or Remoteに切り替えることでどちらから読み込むかを指定できるということを覚えておく。
アセットビルドの手順
[Window] -> [Asset Management] -> [Addressables] -> [Groups]を選択
Addressable Asset Settingsウィンドウで、Buildボタンをクリックし、New Build -> Default Build Scriptを選択します。これにより、アセットバンドルが生成されます。
実行が完了するとAssetable Reportsが表示されます。
ビルドパスは[ServerData]と設定したのでプロジェクトデータの下にServerDataができていることが確認できます。通常のビルドを同じようにビルド用のデータができたというイメージですね。
このServerDataをwordpressサーバにアップロードします
テーマフォルダの下ではなくルートの階層にアップでOKです。
FileZiilaを使ってアップロードする場合はこんな感じ。
⑦実行して確認するとロリポップサーバから読み込まれていることが確認できる
⑧使ってみた所感
先駆者の記事やYoutubeも見漁ったが、わかりにくすぎたので、理解するまでに時間がかかったが、いざわかってしまえば、割と使いやすそう&簡単。
Unityアプリにおいてプレハブ化して利用することは大いにあると思うので
今までどおりローカルから読み込むものは、ローカル(ビルドイン)から、有料コンテンツや素材が増えていくようなものはリモートからとグループを分けて管理するほうが良いと思った(Addressables GroupのDefault Local Groupという名前は使わず、FromLocalとFromRemoteというグループを作って進めていくことにする)
次回、
Q2 .たとえば30個登録しているアセットグループは全部ロードされてしまうのか
Q3.アプリ本体とアセット用でプロジェクトを分けた方が管理しやすいかと思ったけど問題ないのか。
について書いていきます。