3.8K Views
September 26, 19
スライド概要
2019/9/25-6に開催されたUnite Tokyo 2019の講演スライドです。
中山 正法(株式会社サムザップ)
こんな人におすすめ
・Addressable Assets Systemを導入してみたい人
・プロジェクトの技術選定に悩んでいる人
・勇気が欲しい人
受講者が得られる知見
・Addressable Assets Systemの使用の一例
・開発プロジェクトに未完成のパッケージを入れると起きる事象
Unityのイベント資料はこちらから:
https://www.slideshare.net/UnityTechnologiesJapan/clipboards
リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。
【リリースが先か】 えっ!Addressablesを新規プロジェクトに? 【Ver1が先か】 所属団体名 / 株式会社サムザップ 登壇者名 / 中山正法
プロフィール — 中山 正法 — 株式会社サムザップ ネイティブエンジニア H2
アセット管理について — 運用型のアプリにおいては生命線 — フルネイティブ時代が到来して気を使うことが多くなった — Unityではアセットバンドルが提供されている 3
皆さん 4
アセットバンドルは 好き? 5
Addressable Assets Systemについて — AASの概要 — 導入の経緯 — 実際の組み込みについて – 各バージョン – いろいろ起きた問題について 6
AASの概要 — Unity純正のアセット管理システム — アセットバンドルをベースにしている — 依存関係などの挙動は大体同じ — ファイル拡張子は違う — マニフェストは存在しない — 代わりにカタログファイルが存在する 7
AASの使い方 — PackageManagerからインストールできる — Unity備え付けじゃないのでVer Upの影響を受けにくい — 大きな修正の場合はUnityのVer Upを要請されることがある — 主なUI構成はAddressablesのウィンドウとプロファイラ — コード無しでビルドできる 8
AASの使い方 — アセットを増やすときはD&D — グループごとに管理できる – ビルド先、ロード先の設定 – プロバイダの指定 – ビルドの単位 – ひとまとまりにするか – バラバラにするか 9
AASの使い方 — ドラッグ後はアドレスがパスの名で記入される — simplifyを使って短くする — パスのままでビルドを行うとその分ディレクトリが掘られる — Windowsでパス長制限に引っかかる可能性あり 10
AASの使い方 — ラベル機能がある — ラベルはグループではなくアセット 単位で付与できる — ラベルはアドレスとほぼ同列の扱 いなので、ロードの際に利用できる 11
AASの使い方 — ビルドはボタン一つ — addressables windowの右上のボタ ンからできる — 各グループで設定したパスに向かってビ ルドされる 12
AASの使い方 — ビルドはボタン一つ — addressables windowの右上のボタ ンからできる — 各グループで設定したパスに向かってビ ルドされる 13
AASの使い方 — ロードはAddressable.LoadAssetAsync<>() — 実際のロードはグループに設定されたプロバイダが行う — プロバイダは実際にロードを担当するクラス — ベースクラスを継承して自作することもできる — AsyncOperarionHandleは残しておいたほうがいい — 後述のメモリ解放で使う 14
AASの使い方 — メモリ解放はAddressable.Release() — 引数に対象のオブジェクトを入れる — 参照カウントがデクリメントされて0になるとメモリ解放 — より確実なのはAsyncOperationHandleを入れてしまうこと 15
AASの使い方 — 実行モードは3種類 — 実機準拠のPacked Play Mode — アセットの依存関係は計算するがPrefabを読み込むVirtual Mode — 完全にPrefabで駆動するFast Mode 16
AASの使い方 — 実行モードは3種類 — 実機準拠のPacked Play Mode — アセットの依存関係は計算するがPrefabを読み込むVirtual Mode — 完全にPrefabで駆動するFast Mode 17
AASの使い方 — Fast Mode — 開発者への福音 — アセットをビルドすることなく、その場で動作確認できる — 開発中は基本的にこのモード — FastMode用のカタログがLibrary下に作られる 18
AASの使い方 — Virtual Mode — FastModeの状態を維持しつつプロファイラで詳細な確 認ができるモード — 恐ろしく重い — これも専用のカタログが作られる — あんまりつかってない 19
AASの使い方 — Packed Play Mode — ビルドしたアセットを読み込む、実機準拠モード — 実機でトラブルが発生したときはこちらで調査を行う — カタログはビルドしたものを使う 20
AASの使い方 — プロファイラ — FastModeでは使えない — アセットの参照カウントがわかる ようになる — これに映ってる間はメモリから除 去されない 21
AAS導入の経緯 — アセットバンドルのマネージャーについて悩んでいた — 自作するのはだるい — グループ会社から提供してもらう道もあった — いろいろ考えて却下 22
AAS導入の経緯 — 自分では作りたくないが、人から施しも受けたくない — AASの記事をみて導入を検討した 23
プロジェクトの概要 — 納期が決まっている — 技術的な挑戦は控えている — 開発は終盤 24
プロジェクトの概要 — Spineを使った2D RPG — サウンドと動画はCRIを利用している — アドベンチャーパートにLive2Dを使用している — これらを一緒に扱って差分を検知する必要がある 25
最初期の検証 — Ver0.2系 — UI系のバグが多く正常に動作しない — 最低限アセットバンドル様に動作することだけ確認した 26
最初期の検証 — Ver0.2系 — UI系のバグが多く正常に動作しない — 最低限アセットバンドル様に動作することだけ確認した — しかしながら上述のバグが深刻なため、移行を断念 27
最初期の検証 — Ver0.2系 — UI系のバグが多く正常に動作しない — 最低限アセットバンドル様に動作することだけ確認した — しかしながら上述のバグが深刻なため、移行を断念 — しばらくアセットバンドルでの開発をすすめる 28
アセットバンドルでの開発中 — ほぼロードAPIをラップするだけに留める — 依存関係の解決をランタイムで行わない — アセット構造をエンジニアが熟知 — ロード順を厳格に決めて実装していた — この時点でアセットの粒度を決めていたので移行後のパフォーマ ンスの変化に敏感になれた 29
時は流れて年始 — Ver 0.5系 — UI系のバグもだいぶマシになっていたので、アセット登録からビ ルドまで比較的スムーズに実行できた 30
時は流れて年始 — Ver 0.5系 — UI系のバグもだいぶマシになっていたので、アセット登録からビ ルドまで比較的スムーズに実行できた — ただしAndroidとiOSの実機にて動作しなかった 31
時は流れて年始 — Ver 0.5系 — UI系のバグもだいぶマシになっていたので、アセット登録からビ ルドまで比較的スムーズに実行できた — ただしAndroidとiOSの実機にて動作しなかった — 意図せずプロバイダーのコードが削除されてしまっていた — 起動時のAASイニシャライズに失敗し起動すらできない状態 32
monoで試してみた 33
かろうじて 起動に成功 34
そして・・・ 35
36
ビルトインシェーダー 全滅 37
ver 0.5系での移行を 断念 38
さらに時は流れて — Ver 0.6系 — IL2CPPでのストリップ問題は解決 — アセットバンドルからの移行を開始 39
さらに時は流れて — Ver 0.6系 — IL2CPPでのストリップ問題は解決 — アセットバンドルからの移行を開始 — まずはStreaming Assetsから読み込みさせた — そのあとダウンロードの実装 40
ダウンロード — リモートから直接ロードは行わない 41
ダウンロード — リモートから直接ロードは行わない — カタログデータからバンドルファイル名を取得 — 接続先のサーバーからwebrequestを利用してDL 42
ダウンロード — リモートから直接ロードは行わない — カタログデータからバンドルファイル名を取得 — 接続先のサーバーからwebrequestを利用してDL — Persistent Data pathへ書き込みを行う — グループのロードパスはこちらを向いてる 43
ダウンロード — UnityWebrequestのダウンロードハンドラを利用してる 44
ダウンロード — UnityWebrequestのダウンロードハンドラを利用してる — お手軽にDL時のメモリプレッシャーを抑えてくれる 45
ダウンロード — UnityWebrequestのダウンロードハンドラを利用してる — お手軽にDL時のメモリプレッシャーを抑えてくれる — DL時のダウンロードサイズ表示もカタログから取得している 46
ダウンロード — UnityWebrequestのダウンロードハンドラを利用してる — お手軽にDL時のメモリプレッシャーを抑えてくれる — DL時のダウンロードサイズ表示もカタログから取得している — 差分に関してはファイル名にハッシュがついているので、ストレー ジにないものはすべてDLしている 47
CRI系ファイルの取扱 — 音と映像に使用している 48
CRI系ファイルの取扱 — 音と映像に使用している — bytesファイルに書き換えてAASで扱っている — 他のアセット違ってDL後に中身をロードして、別のディレクトリに cpkファイルを書き込んでいる 49
CRI系ファイルの取扱 — 音と映像に使用している — bytesファイルに書き換えてAASで扱っている — 他のアセット違ってDL後に中身をロードして、別のディレクトリに cpkファイルを書き込んでいる — その際はラベルを使ってCRIかどうか区別している 50
CRI系ファイルの取扱 — 音と映像に使用している — bytesファイルに書き換えてAASで扱っている — 他のアセット違ってDL後に中身をロードして、別のディレクトリに cpkファイルを書き込んでいる — その際はラベルを使ってCRIかどうか区別している — ちなみにUnity標準のビデオアセットをAASで取り扱おうとした が、当時はエラーで実機からロードできなかった 51
0.7系 — 使用感はほとんど変わっていない 52
0.7系 — 使用感はほとんど変わっていない — ただしStreamingAssetsに格納されるファイルの取り扱いが変 わった 53
0.7系 — 使用感はほとんど変わっていない — ただしStreamingAssetsに格納されるファイルの取り扱いが変 わった — Library下に配置されて、アセットビルドのときだけ更新され、ア プリビルドのときだけStreamingAssetsに転写される 54
0.7系 — 使用感はほとんど変わっていない — ただしStreamingAssetsに格納されるファイルの取り扱いが変 わった — Library下に配置されて、アセットビルドのときだけ更新され、ア プリビルドのときだけStreamingAssetsに転写される — エディタだけで確認してると、Setting.jsonの変更が反映されな かったりしてハマる 55
0.8系 — 使用感はほとんど変わっていない — 名前空間がすべて変更され、非同期処理にはAsyncがつけられ た 56
1.1.3 — ねんがんのver 1! 57
1.1.3 — ねんがんのver 1! — しかしまた実機で動かない! 58
1.1.3 — ねんがんのver 1! — しかしまた実機で動かない! — 翌日に1.1.4が緊急リリースされてやっと動く — ありがとうunity_bill ! 59
1.1.5 — これをもってpreviewが取れる — 以降はバグfixを中心行われる 60
1.1.7 — いろいろ修正されている(詳しくはリリースノートで) 61
1.1.7 — いろいろ修正されている(詳しくはリリースノートで) — バンドルファイルの命名規則にハッシュなしなどが選べるように なった 62
1.1.7 — いろいろ修正されている(詳しくはリリースノートで) — バンドルファイルの命名規則にハッシュなしなどが選べるように なった — これにより内蔵ファイルなど名前に差分をつけたくないものも扱 いやすくなった。 63
内蔵したいアセットについて — アップルの規約により、アプリ起動直後にDLを走らせるとリジェク トされる可能性がある 64
内蔵したいアセットについて — アップルの規約により、アプリ起動直後にDLを走らせるとリジェク トされる可能性がある — グループ設定でロードパスとビルドパスをStreaming Assetsに すると内蔵できる 65
内蔵したいアセットについて — アップルの規約により、アプリ起動直後にDLを走らせるとリジェク トされる可能性がある — グループ設定でロードパスとビルドパスをStreaming Assetsに すると内蔵できる — ファイルの命名規則を、nohashにしておかないと依存関係をミ スったときにアセットを読み込めなくなるので注意 66
内蔵したいアセットについて — spriteAtlas使用時にはより注意が必要 — spriteAtlasを構成しているソースファイルが、DLしたいアセット と内蔵したいアセットの双方に組み込まれていると、依存関係が 発生してしまう — エディターのselect dependencyからは確認ができないので、 ハマりやすい 67
エラーハンドルについて — ファイルがないとか、アドレスが間違っているとかを検知してハ ンドリングしないといけない 68
エラーハンドルについて — ファイルがないとか、アドレスが間違っているとかを検知してハ ンドリングしないといけない — AysncOperationHnadleがSuccess以外のステータスを返し てくれなかった(8月現在) — 1.1.9で修正されたので、Exceptionをキャッチできるようになっ た 69
エラーハンドルについて — ファイルがないとか、アドレスが間違っているとかを検知してハ ンドリングしないといけない — AysncOperationHnadleがSuccess以外のステータスを返し てくれなかった(8月現在) — 1.1.9で修正されたので、Exceptionをキャッチできるようになっ た — 特別な実装をせずに、何らかのエラーを検知したら、トップに戻し ている 70
そのほか遭遇した不具合 — サブアセットが取れない。。。 71
そのほか遭遇した不具合 — サブアセットが取れない。。。 — マルチスプライトのようにサブアセットを保持しているアセットを 取り扱う場合、LoadAssetAsync<IList<Sprite>>を利用できる のだが、実際使ってみるとスレッドエラーを大量に吐き出してハン グアップしてしまう 72
そのほか遭遇した不具合 — サブアセットが取れない。。。 — マルチスプライトのようにサブアセットを保持しているアセットを 取り扱う場合、LoadAssetAsync<IList<Sprite>>を利用できる のだが、実際使ってみるとスレッドエラーを大量に吐き出してハン グアップしてしまう — Unity 2019.3で直っているらしい 73
そのほか遭遇した不具合 — ProjectからAddressable Assetsをアタッチすると。。。 — The file 'none' is corrupted! 74
そのほか遭遇した不具合 — ProjectからAddressable Assetsをアタッチすると。。。 — The file 'none' is corrupted! — アタッチする側とアタッチされる側双方がAddressable Assets だと起きてしまう — 2019.3で直っているらしい 75
そのほか遭遇した不具合 — 2018.3からの新機能nested prefab 76
そのほか遭遇した不具合 — 2018.3からの新機能nested prefab — 中でmissingが発生していると、アセットのビルド時にUnityがク ラッシュする 77
そのほか遭遇した不具合 — 2018.3からの新機能nested prefab — 中でmissingが発生していると、アセットのビルド時にUnityがク ラッシュする — 不慮のクラッシュに見舞われたときは、prefabの中を確認すべし 78
まとめ — AASはおおよそアセットバンドルを使うのに必要な機能が、だい たい搭載されていて便利 — バグも非常に多いが1.1.9までにだいぶ修正されている — 根っこはアセットバンドルだが、互換性がないので運用中のプロ ジェクトから乗り換えるのは厳しい — 凝ったロードする場合はプロバイダーを自作すると、読み込む部 分のAPIを統一できるのでスッキリする 79
Thank you! 80