(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

AASを新規プロジェクトに採用した際の運用方法や生じる問題の解決方法【Unity】【Addressable Assets】【Unite Tokyo 2019】


このエントリーをはてなブックマークに追加



この記事でのバージョン
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と略しています。


アセット管理について

アプリを作る上で、ゲームシステム以外にも色々なシステムを実装する必要がありますが、

その中でも重要なのがアセット管理で、課金システムと同じぐらい重要になってきます。


そしてUnityで作ったアプリ、特にソシャゲなどの運用型のものは

AssetBundleを使うという選択肢しかありませんでしたが、AASという新たな選択肢が登場しました。

f:id:kan_kikuchi:20191023064843j:plain



AASの概要

新たな選択肢と言ってもAASの中身はAssetBundleです。

ただし、中身は同じとは言え互換性はありません。

f:id:kan_kikuchi:20191023065021j:plain


AASにはAssetBundleのマニフェストはありませんが、

代わりにカタログファイルという巨大なJsonファイルが存在し、実質これが本体です。


AASはUnityのバージョンの影響を受ける

AASはUnityに標準で付いてる機能ではないので、Unityのバージョンの影響を受けないように見えますが、

現状AASに大きな修正が入るとUnity自体のバージョンアップ必要になるので、

Unityのバージョンを上げないと新しいAASが使えないという状態です。

f:id:kan_kikuchi:20191023065357j:plain



アドレスはパスのまま使わない方が良い

AASはアセット登録直後はパスがアドレスとして登録されますが、

パスのまま使うとWindowsで引っかる可能性があるので、

アドレスはパスのまま使わない方が得策です。

f:id:kan_kikuchi:20191023065856j:plain



ロードとリリース

AASはLoadAssetAsync等のロード時に依存関係を全て解決してくれます。

また、ロード時の戻り値であるAsyncOperationHandleはメモリ解放を行う時に便利です。

f:id:kan_kikuchi:20191023072921j:plain


AASはReleaseで参照カウントをデクリメントする事ができ、

カウントが0になるとメモリが開放されます。


ただし、メモリ解放されると画面からも消えるので注意。

(アセットバンドルはメモリ解放後も画面に残すことができた)


なお、ReleaseにAsyncOperationHandleを入れれば、

確実に参照カウントを0に(=メモリ解放)出来ます。

f:id:kan_kikuchi:20191023073130j:plain



実行モードとプロファイラ

AASには複数の実行モードがありますが、基本Fast Modeで実装を行い、

実機で問題が起こった時だけ調査するためにPacked Play Modeにすると良いようです。

f:id:kan_kikuchi:20191023073707j:plain


なお、AAS用のプロファイラはFastModeでは細かな解析が出来ないので注意が必要です。

f:id:kan_kikuchi:20191024043215j:plain



AASの歴史

ここからはAASの各バージョンがどんな感じだったのかという話です。


AAS バージョン0.2 : UI系のバグが多発

UI系のバグ(ボタンが消える、画面が真っ白になる)が多発し、

調子が良い時に動くぐらいで、まだ使い物にならない状態。

f:id:kan_kikuchi:20191024044523j:plain



AAS バージョン0.5 : 実機で起動しない

UI系のバグはマシになりましたが、

実機では起動時の初期化が上手くいかず、起動すら出来ない状態。

f:id:kan_kikuchi:20191024044815j:plain



AAS バージョン0.6 : リモートからのロードに問題あり

実機で起動出来るようになったものの、リモートからのロードには問題がある状態。

f:id:kan_kikuchi:20191024045139j:plain



AAS バージョン0.7 : StreamingAssets周りの変更

AASのアセットが直でStreamingAssetsに置かれるのではなく、

アプリビルド時に転写されるようになった。

Setting.jsonも同様なので、設定を変えてそのままアプリをビルドすると

変更が反映されなくてハマるという注意点がある。(今も同じ仕様)

f:id:kan_kikuchi:20191024045736j:plain



AAS バージョン0.8 : 名前空間がすべて変更

名前空間がすべて変更された。

f:id:kan_kikuchi:20191024050012j:plain



AAS バージョン1.1.3 : 実機で動かない

実機で動かなかったが、

翌日(現地時間朝の4時)に1.1.4が緊急リリースされ、実機でも動くように。

f:id:kan_kikuchi:20191024050145j:plain



AAS バージョン1.1.5 : 脱プレビュー

プレビューが取れたものの、まだバグは多数存在

これ以降は新しい機能の追加ではなく、バグの修正が中心になっていく。

f:id:kan_kikuchi:20191024050325j:plain



AAS バージョン1.1.7 : ファイル名にハッシュなしが可能に

バンドルファイル名にハッシュなしが選べるように。

f:id:kan_kikuchi:20191024050411j:plain


ハッシュありだと差分が出てしまった時に違うファイルだと認識されて困るので、

内蔵したいアセット(チュートリアル等)にハッシュなしは便利とのこと。

f:id:kan_kikuchi:20191024050847j:plain



注意点や不具合

ここからはAASを使う上での注意点や不具合についてです。

spriteAtlasの使用時の注意

spriteAtlasを使う際、spriteAtlas内のアセットがローカルとリモートの双方に組み込まれていると

依存関係が発生してしまいます。(最初から組み込んでおきたいものはspriteAtlasを分ける)

f:id:kan_kikuchi:20191024051020j:plain



エラーハンドリングはAAS1.1.9から

エラーハンドリングは1.1.9からちゃんと出来るようになったので、

それ以前のバージョンを使う場合には注意が必要です。

f:id:kan_kikuchi:20191024051217j:plain



サブアセットはUnity2019.3から

マルチスプライトのようなサブアセットを扱う場合、

Unity2019.3以降でないとエラーを吐いてしまうようです。

f:id:kan_kikuchi:20191024051439j:plain



シリアライズフィールドはUnity2019.3から

アタッチする側される側の双方がAASに含まれていると、エラーが出るようです。

これもUnity2019.3以降なら直っているらいしいです。

f:id:kan_kikuchi:20191024051624j:plain



nested prefabでクラッシュ

nested prefab内でmissingが発生してる時に、

AASをビルドするとUnityがクラッシュしてしまいます。

f:id:kan_kikuchi:20191024051838j:plain



おわりに

講演の通り、だいぶ実用的になってきているため、新規プロジェクトで使う分には大丈夫そうです。

ただし、AssetBundleの互換性がないため、既に運用しているものの乗り換えは難易度が高いようです。

f:id:kan_kikuchi:20191024052112j:plain


また、この講演を見てプレビュー版は実験や勉強以外では

使わない方が良いと今まで以上に感じましたし、

それと同時にこういう先陣を切って使ってくれている人達がいるおかげで、

安定したものが使えるようになるという事もよく分かりました。