勉強会のレポート(メモ)です。
参加したのはこちら、「Unity AssetBundle 完全に理解した 」
connpass.comハッシュタグ : #AssetBundle完全に理解した
動画はこちらから視聴できます。
略称
AB : AssetBundle
AS : Addressable
- タイムスケジュール
- オープニング
- #1 お前はまだ本当のAssetBundleを知らない
- #2 ごっこランドを支える技術 ?AssetBundle 編?
- #3 誰もAddressableを語らないのなら…俺が語るしかないッ
- LT1. AssetBundleダウンロードサイズ表示対応
- LT2. Unload(true)って使ってますか?
- LT3. サーバ無しでAssetBundleを使う
- LT4. 複数プロジェクトで同一AssetBundleを使い回す時の注意点
- 懇親会
- タイムライン
- 感想ブログ
- 過去の完全に理解した勉強会
タイムスケジュール
内容 | 担当 | |
---|---|---|
13:00 | 受付開始 | - |
13:30 | イントロダクション | - |
13:40 | お前はまだ本当のAssetBundleを知らない | @toru_inoue |
14:20 | 休憩 | - |
14:25 | ごっこランドを支える技術 〜AssetBundle 編〜 | @monry |
15:05 | 休憩 | - |
15:10 | 誰もAddressableを語らないのなら…俺が語るしかないッ | @tsubaki_t1 |
15:50 | 休憩 | - |
16:00 | LT1: AssetBundleダウンロードサイズ表示対応 | @8bitdots |
16:10 | LT2: Unload(true)って使ってますか? | @2Lt_FROST |
16:20 | LT3: サーバ無しでAssetBundleを使う | @tty_yamada |
16:30 | LT4: 複数プロジェクトで同一AssetBundleを使い回す時の注意点 | @kannan_xiao4 |
16:40 | クロージング/懇親会準備 | - |
16:50 | 懇親会 | - |
18:00 | 解散 | - |
オープニング
今回のテーマはAssetBundle、
会場、懇親会、生放送、提供は全てミクシィさんです。
#1 お前はまだ本当のAssetBundleを知らない
ASについては話しません。
いろいろなパーンを紹介します、しかし時間が足りないため資料の方を見てください。
今日はAB以外についても知ってもらいます。
ABを扱うということは、アプリを運用するということです。
運用を完全に理解しましょう。
更新可能要素について
実はABだけではない、Assetを更新する方法はいろいろあります。
この更新できるものをUpdatableと呼びます。
USA
UnityがシリアライズしたAssetのこと。
USAをアプリ外から入れるのはABのみ。
Bytes
Byteから生成するAsset。
Code
コードから生成するAsset。
USAを使うならAssetBundle
理想の運用と現実
Updatableを使ってAppを運用するわけですが、
ガッツポーズしたらユーザのリソースをアップデートしてほしい。
しかし現実はそうはいかない。ではどう実装するか。
どういう運用があるのか歴史にまとめてみた。
ワンパン期
まるごとApp内にリソースを準備
リソース分離期
起動後にリソースを取得
リソースアップデート期
起動時、アップデートを検知したら更新
任意アップデート期
ユーザが特定の画面でアップデート
常時アップデート
リソース全体を取得するのではなく、使用時に使う分だけアップデート。Updatableごと
要素と運用の突き合わせ
3つのUpdatableと4つの運用の組み合わせに制限はない。
AB使わなくても更新はできる。
Unityの場合、アップデートにはABが真っ先に候補でてくるが、ABは敷居が高い。
これはABが悪いのではない、運用をするための解としてABがあるだけ。
考えるべきはUpdatableと運用の理想的な組み合わせを考えること。
正直いうとABは必須ではない。
最高の来世
ストリーミングゲームの登場。しかし運用に対しては特に変わりはない。
変わることは、サーバとの距離がなくなるので、データダウンロードでは無く。単なる展開になる。
#2 ごっこランドを支える技術 ?AssetBundle 編?
ごっこランドをささえる技術 〜AssetBundle 編〜/AssetBundle Fully Understood - Speaker Deck
これからAB完全に理解したい人、運用方法に悩む人向けの内容。
話すこと
・ABの基礎知識について
・弊社での運用事例
技術書店に当選しました。け54
ABとはなにか
AssetをBundleしたもの。
Unity上でランタイムで動的読み込みすること。
いわゆるダウンロードコンテンツ。
Unity3.5から使えたもの、5で大幅改善された。
メリット
ビルドされたアプリサイズを削減できる。
IOSじゃ150MB、Google playは100MBまでしかアップロードできないが、これに対応できる。
ビルドすることなくAssetを更新できる。
ABをとりまく構成要素
この辺の技術を組み込むことで構築できます
AssetBundle
圧縮されたバイナリファイル、圧縮アルゴリズムで固めたものそのもの。
Assetが固められた時点でAsset File Hashを持つ。
Assetの情報がちょっとでも書き換わるとこのHashも変わる。
Streamed Scene AssetBundle
Scene自体をAssetBundleとして固めた物
中身は単なるAssetBundle、名前が違う。
特殊な点としてLoadされた時点でSceneManagerからアクセスできるようになる。
依存するAssetBundleがある場合は予めLoadしておく必要がある。
Asset Bundle Name
ABの名前
インスペクタで設定。AssetBunleBuildで設定できる。
この名前はビルド時にパスとして利用される。
拡張子として.unity3dが使われる?他とぶつからないようなものがいい。
AssetBundleVariant
SD/HD、画質の切り替え、ローカライゼーション用。
Addressableがサポートしていないので非推奨。
AssetBundle Manifest
目録、ビルドする時に作られる。
各ABのハッシュ値、依存関係が含まれる、がファイルサイズは持たれない。
ハッシュ値や依存関係を問い合わせる時は、AssetBundleNameを使って問い合わせます。
ビルドすると.manifestというファイルが作られる。これはサーバとかにアップするものではない。
UnityWbRequestAssetBundle
ABをインターネットから取得する。
ローカルからも取得できる。
Webから取得するならこれを推薦。
AssetBundleCreateRequest
ABをロードする時に使うAsyncOperation。
UnityWebRequestを使うときは登場しない。
AssetBundleReauest
さっきはABそのままだったが、ロードされたABからAssetを取り出す時に使うもの。
Caching
WebRequest経由で取得したものをキャッシュしてくれる。
BuildPipelne.BuildAssetBundles
ABを使う上で必須、ABやManifestを構築するのに使う。
この辺を抑えておけば完全に理解したといっても過言ではない
AssetBndleDependency
AB内のAssetもまた、ABである状態を依存と呼ぶ。
この依存情報はManifestに記録される。
依存するABを事前に呼んでおかないと、依存元を読んだ時にMissingになる。
適切に設定しないとABコピー問題がおきる。。
運用事例について
ごっこランド。
詳しい構築は調べればでるので調べてください。
ビルドサーバ
Jenkinsおじさんが頑張っている
まとめ
ABの回りの概念を理解することでABの運用は怖くないということがわかると思います。
ビルドサーバがあると楽、ただくそ大変。
#3 誰もAddressableを語らないのなら…俺が語るしかないッ
Addressableとはなんぞや
Assetの制御を簡単にする機能。
ちょっと前までAssetBundleManagerと呼ばれていました。
ASはどういう機能があるのか
・ABを出力する機能
・ABがどこにあるのか気にせず利用できるようにする、特定のキーワードで取得できる。
・遅延ロード、大きなシーンを読み込んだ時、遠距離のものは即座にロードする必要はないときに遅延でロードさせることができる。
・メモリ管理がやりやすくなる
・ABのパッチをあてることができる、ABの一部だけを差し替えたり更新できるようになる。
・ローカルサーバ ネットワークの動作を確認することができる。
ASの用語
ABとは別に用語が増えている。
アドレス
アセットと1:1になる文字烈 好きに書き換えられる
グループ
アセットを格納するグループ、スキーマとか設定をつけることができる
スキーマ
グループごとのビルド設定、どうビルドするのかなどの設定
プロバイダー
どうやってロードするのかという設定
ASの想定
ASは何がしたいのか、全てのアセットをABに含みたいのだと思う。
しかし使わないものがあるとIDが無駄になるので状況によって消したい。
ちなみにすべてABにすると、ビルドデータにアセットが一切含まれない。
しかし時間がかかるので、状況に応じてモードを使いわけるのがいい。
想定2
ABはアセットを取得して組み立てるではなく、組みあがったアセットを使う。
プレハブにアドレスを設定してそれだけを取得するのではないかなと思います。
そうなると問題がでてくる、重複の問題
二つのABで同じ素材を保持するということになってしまう。
Analyzeにチェックすると、重複チェックしてくれます。
ちなみに。全て非同期でやっています。
即座に生成することはできない、最短でもLateUpdate時。
自分の状況に合わないときはカスタマイズすることができます。
プロバイダーを拡張することもできます。
ここでデモ
現状どうなのか
素直に使えるなら楽になった、ビルドインシェーダーも含まれている。
テストケースがまだ甘い、エラーを特定するにはコードを見るしかない。安定するのはもうちょっと先。
LT1. AssetBundleダウンロードサイズ表示対応
AssetBundleDownloadSize - Speaker Deck
そもそもなぜこんな話をするのか。
IOSで追加のダウンロードをさせる場合はサイズを表示しなければならなくなった。
細かい不明点はあるがABのサイズ表示をしたい。
しかしABにはサイズ取得メソッドがない、公式でない以上自分で作るしかない。
今回はYAMLを加工してどうにかするアプローチをしました。
LT2. Unload(true)って使ってますか?
docs.google.comみなさんはunload(ture)を使っていますか?
これはABを強制解放することができます。
結果、使っているのに解放されてMissingになったりする。
その点falseは安全。
ところでこれ誰が管理しているのかというと、unityのresoucesが管理しています。
見方を変えると、任意の単位でいくつかのAssetの解放ができる。
ライブラリはgithubで公開しています
LT3. サーバ無しでAssetBundleを使う
最初に結論から、サーバを使った方がいい
なぜサーバがいいのか
・サイズを小さくできる
・リソースの差し替えをバイナリの更新無しでできる
むしろなぜローカルで使う必要があるのか
・通信しなくてもゲームをさせたい
・会社がサーバを用意している間の一時しのぎ
・ストレージ代を抑えたい
通信しなくてもプレイさせたい
・初回DL中のミニゲームに
・チュートアルまではダウンロードさせない
・完全オフラインモード
どうやってローカルでやるか、ストリーミングアセットで対応します。
まとめ
理由がなければサーバでやったほうがいい
ローカルでやる場合はプロジェクトにあった運用を
LT4. 複数プロジェクトで同一AssetBundleを使い回す時の注意点
20190324_複数プロジェクトで共通のAssetBundleを使う - Speaker Deck
ABを扱う際の壁
・ABのキャッシュ
・metaファイルのguid
本題、どう使いまわすのか
・キャッシュしない
WebGLではブラウザキャッシュがかってにききます
・ABビルドを行うprojectは1つだけにする
ちゃんと読み込めます
・自前でシングルマニフェストを生成する
自前でjsonなどで管理
キャッシュについて
hashコンフリクトさえ起こらなければ大丈夫
hashの代わりにCachesAssetBundleとか使えry
キャッシュは自前実装すれば複数とか関係ない
guidによる参照の問題
テクスチャとかオーディオなら大丈夫、ghuidで管理されている。
問題はC#やシェーダー、これらはビルドインされていることが前提となっている。
C#スクリプトのAB対応
・C#スクリプトをmetaごと複数して読み込む
・DLL化して取り込む
AB考えないならパッケージマネージャーを使った方がいい。
DLLの置き換えでMissingになる問題は力技で解決。
まとめ
GUIDによる参照関係に気を付けましょう。
cluster.unityが開催されます ぜひ参加してね
cluster-vr-meetup.connpass.com
懇親会
お寿司とピザ!
🍣 #AssetBundle完全に理解した pic.twitter.com/g9I5glDGkZ
— 青木とと(ˊᗜˋ*) ごたゆに #11 3/27(水) (@lycoris102) March 24, 2019
ピザがアセットの参照が無くなった…#AssetBundle完全に理解した pic.twitter.com/wfuw9onvuY
— 人生\(^o^)/ (@8bitdots) March 24, 2019
🦐<どうして… #AssetBundle完全に理解した pic.twitter.com/z3kI7ps8Ob
— トモぞヴP (@TomozoP) March 24, 2019
これほど食欲がなくなる寿司を見たことがあるだろうか・・・?
よく懇親会のネタで、お寿司のエビは人気がないとは言われますがこれほどとは。
この時はエビ、イカ、ホタテとたまごが少々。ちなみに有志によって全てアンロードされました、
タイムライン
📛作りました!#AssetBundle完全に理解した pic.twitter.com/J3WC4JYmjQ
— 青木とと(ˊᗜˋ*) ごたゆに #11 3/27(水) (@lycoris102) March 24, 2019
すべてをわかりたい #AssetBundle完全に理解した pic.twitter.com/XNisSWZmre
— トモぞヴP (@TomozoP) March 24, 2019
#AssetBundle完全に理解した
— 殺意駆動開発 (@toru_inoue) March 24, 2019
自分の死霊はこれ。
プレゼン版https://t.co/g05wfRvzVI
完全版https://t.co/j3zZZUub1m
USA
— Kazushige Mori(Cz_mirror) (@Cz_mirror) March 24, 2019
なんでも使える
Unity Serialized Asset
アプリの実行中に読み込むことでAssetとして展開できる。
#AssetBundle完全に理解した
ここまでの話はAssetBundle以外にもUpdatable (リソースの追加取得) な運用が可能だよ、という選択肢の開示の話に見える #AssetBundle完全に理解した
— 青木とと(ˊᗜˋ*) ごたゆに #11 3/27(水) (@lycoris102) March 24, 2019
#AssetBundle完全に理解した
— 青木とと(ˊᗜˋ*) ごたゆに #11 3/27(水) (@lycoris102) March 24, 2019
これを完全理解しようとしているのか... pic.twitter.com/gPWzhsidrl
弊社は拡張子なしですが、拡張子は決めたほうが良いです。
— やまだ たいし (@OrotiYamatano) March 24, 2019
その方が幸せになります。
私は泣きをみました。#AssetBundle完全に理解した
ごっこらんどすごい…。
— JKさやちゃんぐbot (@songofsaya_) March 24, 2019
個別にプロジェクト開発して、ビルドサーバでマージしてアセバン作ってる??
ここ、Jenkinsの知見とかスクリプトとかも公開してほしいー。#AssetBundle完全に理解した
ごっこランドを支える技術 〜ビルド編〜https://t.co/VVJW3jQxnG#AssetBundle完全に理解した
— JKさやちゃんぐbot (@songofsaya_) March 24, 2019
マウスポインタが2つあるライブコーディング #assetbundle完全に理解した
— VRのたぐすキャット (@notargs) March 24, 2019
この椿さんの講演動画は日本人デベロッパーにとって非常に価値の高いモノになる予感だ…! #AssetBundle完全に理解した
— もんりぃ先生👨🏫4/4 Git ハンズオン📚技術書典 け54📔マンガUnity (@monry) March 24, 2019
ソシャゲみたいな膨大なアセットが存在するプロジェクトだと、基本アセットはビルド用の別プロジェクトに置く形になるので、Virtualモードとかの恩恵はあんま受けれないんですよね #AssetBundle完全に理解した
— k7a (@k7a_5) March 24, 2019
なるほど。
— mao (@TEST_H_) March 24, 2019
既存のManifestを解析してyamlを解読 → ファイルサイズなどを乗っけ直した独自Manifestを生成するアプローチ。
Unity側では独自Manifestをパースするクラスを実装#AssetBundle完全に理解した
「Unity4系からAssetBundleを使ってきた人どれくらいいますか?」 #AssetBundle完全に理解した pic.twitter.com/TBd9z1V8xz
— 青木とと(ˊᗜˋ*) ごたゆに #11 3/27(水) (@lycoris102) March 24, 2019
Unloadに関する基本的な情報はこちらを参照https://t.co/lVi1aRbIGT#AssetBundle完全に理解した
— 青木とと(ˊᗜˋ*) ごたゆに #11 3/27(水) (@lycoris102) March 24, 2019
サーバ無しでAssetBundleを使う
— トモぞヴP (@TomozoP) March 24, 2019
結論:サーバーを使ったほうがいい
#AssetBundle完全に理解した
聞きそびれたけど、スクリプトをDLL化するメリットは特に無いんじゃないかな…?面倒くさくなるだけで🤔 #AssetBundle完全に理解した
— 椿 (@tsubaki_t1) March 24, 2019
撤収完了しました!
— 青木とと(ˊᗜˋ*) ごたゆに #11 3/27(水) (@lycoris102) March 24, 2019
お疲れ様でしたー!#AssetBundle完全に理解した pic.twitter.com/nUaEP8EoTe
AssetBundleを完全に理解した図です #AssetBundle完全に理解した pic.twitter.com/p2GOAfvoyM
— トモぞヴP (@TomozoP) March 24, 2019
感想ブログ
過去の完全に理解した勉強会
間違っている箇所、消してほしいツイートがありましたらコメントにお願いします。