Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

勉強会レポ : Unity AssetBundle 完全に理解した

勉強会のレポート(メモ)です。
参加したのはこちら、「Unity AssetBundle 完全に理解した 」

connpass.comハッシュタグ : #AssetBundle完全に理解した

 

f:id:Raspberly:20190324215243j:plain

f:id:Raspberly:20190324215304j:plain

 

 

動画はこちらから視聴できます。

www.youtube.com

 

 

略称

AB : AssetBundle

AS : Addressable

 

 

 

タイムスケジュール

  内容 担当
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を知らない

www.dropbox.com

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を語らないのなら…俺が語るしかないッ

f:id:Raspberly:20190324214111j:plain

www.slideshare.net

Addressableとはなんぞや

Assetの制御を簡単にする機能。
ちょっと前までAssetBundleManagerと呼ばれていました。

ASはどういう機能があるのか

・ABを出力する機能
・ABがどこにあるのか気にせず利用できるようにする、特定のキーワードで取得できる。
・遅延ロード、大きなシーンを読み込んだ時、遠距離のものは即座にロードする必要はないときに遅延でロードさせることができる。
・メモリ管理がやりやすくなる 
・ABのパッチをあてることができる、ABの一部だけを差し替えたり更新できるようになる。
・ローカルサーバ ネットワークの動作を確認することができる。

ASの用語

ABとは別に用語が増えている。

アドレス

 アセットと1:1になる文字烈 好きに書き換えられる

グループ

 アセットを格納するグループ、スキーマとか設定をつけることができる

スキーマ

 グループごとのビルド設定、どうビルドするのかなどの設定

プロバイダー

 どうやってロードするのかという設定

ASの想定

ASは何がしたいのか、全てのアセットをABに含みたいのだと思う。
しかし使わないものがあるとIDが無駄になるので状況によって消したい。
ちなみにすべてABにすると、ビルドデータにアセットが一切含まれない。

しかし時間がかかるので、状況に応じてモードを使いわけるのがいい。


想定2

ABはアセットを取得して組み立てるではなく、組みあがったアセットを使う。
プレハブにアドレスを設定してそれだけを取得するのではないかなと思います。

そうなると問題がでてくる、重複の問題

二つのABで同じ素材を保持するということになってしまう。
Analyzeにチェックすると、重複チェックしてくれます。


ちなみに。全て非同期でやっています。
即座に生成することはできない、最短でもLateUpdate時。


自分の状況に合わないときはカスタマイズすることができます。
プロバイダーを拡張することもできます。

 

ここでデモ

www.youtube.com

 

現状どうなのか

素直に使えるなら楽になった、ビルドインシェーダーも含まれている。
テストケースがまだ甘い、エラーを特定するにはコードを見るしかない。安定するのはもうちょっと先。

 

 

 

 

 

 

 

 

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を使う

docs.google.com

最初に結論から、サーバを使った方がいい

なぜサーバがいいのか

・サイズを小さくできる
・リソースの差し替えをバイナリの更新無しでできる

むしろなぜローカルで使う必要があるのか

・通信しなくてもゲームをさせたい
・会社がサーバを用意している間の一時しのぎ
・ストレージ代を抑えたい

通信しなくてもプレイさせたい

・初回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

 

 

 

 

 

懇親会

 お寿司とピザ!

 

 

 

f:id:Raspberly:20190324215605j:plain

f:id:Raspberly:20190324215609j:plain

 

 

 

 



これほど食欲がなくなる寿司を見たことがあるだろうか・・・?

f:id:Raspberly:20190324215615j:plain

よく懇親会のネタで、お寿司のエビは人気がないとは言われますがこれほどとは。
この時はエビ、イカ、ホタテとたまごが少々。ちなみに有志によって全てアンロードされました、

 

 

タイムライン

 

 

 

 

 

 

 

 

 

 

 

 

 

 

感想ブログ

monry.hatenablog.com

 

 

 

過去の完全に理解した勉強会

raspberly.hateblo.jp

raspberly.hateblo.jp

raspberly.hateblo.jp

raspberly.hateblo.jp

 

 

 

 

 

間違っている箇所、消してほしいツイートがありましたらコメントにお願いします。