この記事でのバージョン
Unity 2018.4.8f1
はじめに
今回は『Unite Tokyo 2019』の講演の動画を見て勉強しつつ、
ついでに記事にまとめちゃおうという感じのやつです。
そして、題材にする講演は、
【リリースが先か】えっ!Addressablesを新規プロジェクトに?【ver1が先か】です!
1年以内に世に出さないといけないタイトルで、Addressable Assets Systemを採用し、リリースまで持っていこうとする、そのてんやわんやな顛末です。
Addressable Assets Systemを時系列に追いながら、そのときの対応方法と運用方法、出た問題の解決方法を説明します。
出演:
中山 正法(株式会社サムザップ ネイティブエンジニア)
概要の通り、Addressable Assets Systemを新規プロジェクトの採用したお話です。
ちなみにAddressable Assetsについての概要や使い方についての記事は以前書いたので、
そこら辺の話は省いて、自分が気になった事、知らなかった事を抜粋していく感じにしました。
なお、Addressable Assets(System)は長いので、記事中ではAASと略しています。
目次
- はじめに
- 目次
- アセット管理について
- AASの概要
- AASはUnityのバージョンの影響を受ける
- アドレスはパスのまま使わない方が良い
- ロードとリリース
- 実行モードとプロファイラ
- AASの歴史
- 注意点や不具合
- おわりに
アセット管理について
アプリを作る上で、ゲームシステム以外にも色々なシステムを実装する必要がありますが、
その中でも重要なのがアセット管理で、課金システムと同じぐらい重要になってきます。
そしてUnityで作ったアプリ、特にソシャゲなどの運用型のものは
AssetBundleを使うという選択肢しかありませんでしたが、AASという新たな選択肢が登場しました。
AASの概要
新たな選択肢と言ってもAASの中身はAssetBundleです。
ただし、中身は同じとは言え互換性はありません。
AASにはAssetBundleのマニフェストはありませんが、
代わりにカタログファイルという巨大なJsonファイルが存在し、実質これが本体です。
AASはUnityのバージョンの影響を受ける
AASはUnityに標準で付いてる機能ではないので、Unityのバージョンの影響を受けないように見えますが、
現状AASに大きな修正が入るとUnity自体のバージョンアップ必要になるので、
Unityのバージョンを上げないと新しいAASが使えないという状態です。
アドレスはパスのまま使わない方が良い
AASはアセット登録直後はパスがアドレスとして登録されますが、
パスのまま使うとWindowsで引っかる可能性があるので、
アドレスはパスのまま使わない方が得策です。
ロードとリリース
AASはLoadAssetAsync等のロード時に依存関係を全て解決してくれます。
また、ロード時の戻り値であるAsyncOperationHandleはメモリ解放を行う時に便利です。
AASはReleaseで参照カウントをデクリメントする事ができ、
カウントが0になるとメモリが開放されます。
ただし、メモリ解放されると画面からも消えるので注意。
(アセットバンドルはメモリ解放後も画面に残すことができた)
なお、ReleaseにAsyncOperationHandleを入れれば、
確実に参照カウントを0に(=メモリ解放)出来ます。
実行モードとプロファイラ
AASには複数の実行モードがありますが、基本Fast Modeで実装を行い、
実機で問題が起こった時だけ調査するためにPacked Play Modeにすると良いようです。
なお、AAS用のプロファイラはFastModeでは細かな解析が出来ないので注意が必要です。
AASの歴史
ここからはAASの各バージョンがどんな感じだったのかという話です。
AAS バージョン0.2 : UI系のバグが多発
UI系のバグ(ボタンが消える、画面が真っ白になる)が多発し、
調子が良い時に動くぐらいで、まだ使い物にならない状態。
AAS バージョン0.5 : 実機で起動しない
UI系のバグはマシになりましたが、
実機では起動時の初期化が上手くいかず、起動すら出来ない状態。
AAS バージョン0.6 : リモートからのロードに問題あり
実機で起動出来るようになったものの、リモートからのロードには問題がある状態。
AAS バージョン0.7 : StreamingAssets周りの変更
AASのアセットが直でStreamingAssetsに置かれるのではなく、
アプリビルド時に転写されるようになった。
Setting.jsonも同様なので、設定を変えてそのままアプリをビルドすると
変更が反映されなくてハマるという注意点がある。(今も同じ仕様)
AAS バージョン0.8 : 名前空間がすべて変更
名前空間がすべて変更された。
AAS バージョン1.1.3 : 実機で動かない
実機で動かなかったが、
翌日(現地時間朝の4時)に1.1.4が緊急リリースされ、実機でも動くように。
AAS バージョン1.1.5 : 脱プレビュー
プレビューが取れたものの、まだバグは多数存在。
これ以降は新しい機能の追加ではなく、バグの修正が中心になっていく。
AAS バージョン1.1.7 : ファイル名にハッシュなしが可能に
バンドルファイル名にハッシュなしが選べるように。
ハッシュありだと差分が出てしまった時に違うファイルだと認識されて困るので、
内蔵したいアセット(チュートリアル等)にハッシュなしは便利とのこと。
注意点や不具合
ここからはAASを使う上での注意点や不具合についてです。
spriteAtlasの使用時の注意
spriteAtlasを使う際、spriteAtlas内のアセットがローカルとリモートの双方に組み込まれていると
依存関係が発生してしまいます。(最初から組み込んでおきたいものはspriteAtlasを分ける)
エラーハンドリングはAAS1.1.9から
エラーハンドリングは1.1.9からちゃんと出来るようになったので、
それ以前のバージョンを使う場合には注意が必要です。
サブアセットはUnity2019.3から
マルチスプライトのようなサブアセットを扱う場合、
Unity2019.3以降でないとエラーを吐いてしまうようです。
シリアライズフィールドはUnity2019.3から
アタッチする側される側の双方がAASに含まれていると、エラーが出るようです。
これもUnity2019.3以降なら直っているらいしいです。
nested prefabでクラッシュ
nested prefab内でmissingが発生してる時に、
AASをビルドするとUnityがクラッシュしてしまいます。
おわりに
講演の通り、だいぶ実用的になってきているため、新規プロジェクトで使う分には大丈夫そうです。
ただし、AssetBundleの互換性がないため、既に運用しているものの乗り換えは難易度が高いようです。
また、この講演を見てプレビュー版は実験や勉強以外では
使わない方が良いと今まで以上に感じましたし、
それと同時にこういう先陣を切って使ってくれている人達がいるおかげで、
安定したものが使えるようになるという事もよく分かりました。