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

【Unite Tokyo 2019】【リリースが先か】えっ!Addressablesを新規プロジェクトに?【ver1が先か】