Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
アセットバンドルの管理について
Search
Cygames
PRO
November 30, 2015
Programming
7
7.6k
アセットバンドルの管理について
2015/11/15 Cygames Tech Fes
Cygames
PRO
November 30, 2015
Tweet
Share
More Decks by Cygames
See All by Cygames
【CEDEC2025】『Shadowverse: Worlds Beyond』二度目のDCG開発でゲームをリデザインする~遊びやすさと競技性の両立~
cygames
PRO
1
370
【CEDEC2025】大規模言語モデルを活用したゲーム内会話パートのスクリプト作成支援への取り組み
cygames
PRO
2
870
【CEDEC2025】現場を理解して実現!ゲーム開発を効率化するWebサービスの開発と、利用促進のための継続的な改善
cygames
PRO
0
800
【CEDEC2025】ブランド力アップのためのコンテンツマーケティング~ゲーム会社における情報資産の活かし方~
cygames
PRO
0
320
【CEDEC2025】『ウマ娘 プリティーダービー』における映像制作のさらなる高品質化へ!~ 豊富な素材出力と制作フローの改善を実現するツールについて~
cygames
PRO
0
260
【CEDEC2025】LLMを活用したゲーム開発支援と、生成AIの利活用を進める組織的な取り組み
cygames
PRO
1
2.6k
【TiDB GAME DAY 2025】Shadowverse: Worlds Beyond にみる TiDB 活用術
cygames
PRO
0
1.9k
雲だけじゃない!『GRANBLUE FANTASY: Relink』の世界に奥行きを出す半透明スプライト活用術
cygames
PRO
0
990
最高のアートワークを発信する『Cygames展 Artworks』企画制作事例
cygames
PRO
0
150
Other Decks in Programming
See All in Programming
なぜ今、Terraformの本を書いたのか? - 著者陣に聞く!『Terraformではじめる実践IaC』登壇資料
fufuhu
4
560
あのころの iPod を どうにか再生させたい
orumin
2
2.4k
それ CLI フレームワークがなくてもできるよ / Building CLI Tools Without Frameworks
orgachem
PRO
17
3.8k
#QiitaBash TDDで(自分の)開発がどう変わったか
ryosukedtomita
1
360
オホーツクでコミュニティを立ち上げた理由―地方出身プログラマの挑戦 / TechRAMEN 2025 Conference
lemonade_37
2
460
MCP連携で加速するAI駆動開発/mcp integration accelerates ai-driven-development
bpstudy
0
290
管你要 trace 什麼、bpftrace 用下去就對了 — COSCUP 2025
shunghsiyu
0
380
Webinar: AI-Powered Development: Transformiere deinen Workflow mit Coding Tools und MCP Servern
danielsogl
0
110
SQLアンチパターン第2版 データベースプログラミングで陥りがちな失敗とその対策 / Intro to SQL Antipatterns 2nd
twada
PRO
38
11k
あなたとJIT, 今すぐアセンブ ル
sisshiki1969
1
590
AIに安心して任せるためにTypeScriptで一意な型を作ろう
arfes0e2b3c
0
340
QA x AIエコシステム段階構築作戦
osu
0
260
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.4k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Scaling GitHub
holman
461
140k
Testing 201, or: Great Expectations
jmmastey
45
7.6k
We Have a Design System, Now What?
morganepeng
53
7.7k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
Facilitating Awesome Meetings
lara
54
6.5k
The World Runs on Bad Software
bkeepers
PRO
70
11k
Code Review Best Practice
trishagee
69
19k
Transcript
None
⾃自⼰己紹介 $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE • 中村克也 •
エンジニアマネージャー • Unityを使⽤用した社内ライブラリ開発・運⽤用 • 社外窓⼝口 • エンジニアのリクルート
アジェンダ $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE • Unity4からUnity5へ •
Unity5の新要素について • シングルマニフェスト • バリアント • 依存関係 • リソース管理理 • ロードAPIと圧縮 • Jenkins連携 • おまけ • 質疑応答
• Cygamesでは、Unity5リリースと同時期に開発中プロ ジェクトに関してはUnity5へ移⾏行行 • Unity4からの変更更部分で⼤大きい部分は、アセットバンド ルビルド • Unity4のビルド資産を破棄して、再構築を試みる • とりあえず作って、使ってみる、後追いでリファクタリ
ング(他PJへ横展開できるように) $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
アジェンダ $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE • Unity4からUnity5へ •
Unity5の新要素について • シングルマニフェスト • バリアント • 依存関係 • リソース管理理 • ロードAPIと圧縮 • Jenkins連携 • おまけ • 質疑応答
<講演ファイル> http://japan.unity3d.com/unite/unite2015/files/DAY1_̲1300_̲room2_̲Ito.pdf <サンプルプロジェクト> http://files.unity3d.com/vincent/assetbundle-‐‑‒demo/users_̲assetbundle-‐‑‒demo.zip $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
2015/3 Unity5リリース Unite2015での講演から ベースはこれを参考に進めました。
アセットバンドルに関しては、 シングルマニフェストとバリアントの2つが⼤大きな機能追加 ですが、 今回のプロジェクトでは両⽅方とも使⽤用することをやめました。 $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
アジェンダ $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE • Unity4からUnity5へ •
Unity5の新要素について • シングルマニフェスト • バリアント • 依存関係 • リソース管理理 • ロードAPIと圧縮 • Jenkins連携 • おまけ • 質疑応答
全アセットバンドルのCRC/依存関係/ハッシュなどを持った、 ⼀一意のファイル BuildPipeline.BuildAssetBundlesで指定した出⼒力力フォルダ名 で出⼒力力される $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
シングルマニフェストの中⾝身 個別マニフェストの中⾝身 CRC/Hash/Dependenciesの情 報を持ってて便便利利 $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
なぜ使わないのか。 『1回のビルド出⼒力力で1つのシングルマニフェストが作成される』 これがネック。 $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
例例えば、上記のようなフォルダを⽤用意してアセットを管理理す る場合フォルダ(カテゴリ)ごとにビルドしたい! というニーズに3つのAndroid.manifestが作成される。 root Assets Resources Bg 背景画像 Chara キャラ画像
3d 3dアセット フォルダ構成 Android.manifest (Bg) Android.manifest (Chara) Android.manifest (3d) 同名なので管理理できない $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
結果、同等の情報を持った独⾃自のリソースリストを作成する ことに。 カテゴリごとに、name/hash/version/groupをCSVでア セットバンドルビルド時に出⼒力力するように。 name hash version group bg_001.unity3d 621a0f92b9f32c8126f2aa6af5ab4cc7
00000000 common bg_002.unity3d 3d534a8f488cdf3f50837d7ed337d2c3 00000000 common bg_101.unity3d 45b0bab78240018ee411401410c2dbe2 00000000 tutorial_g1 bg_102.unity3d 4095525f35ea45a83ddf67b8ec4178ff 00000000 tutorial_g2 bg_103.unity3d 66d254f9fb533dcf90463f7d96ce2a54 00000000 every bg_104.unity3d 7798907c2e4d18a0f3b5e509377e7680 00000000 every Unity4でも同じことしてました。。 $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
解決策はある 出⼒力力先を変えることで、名前が変えられる 分散出⼒力力されるマニフェストとランタイム側で複数マニフェ ストを管理理することで解決はします。 AndroidBg.manifest(Bg) AndroidChara.manifest (Chara) Android3d.manifest (3d) 開発中の運⽤用が複雑になる。
独⾃自フォーマットのリストには柔軟性で敵わない。 Groupタグとか便便利利 $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
アジェンダ $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE • Unity4からUnity5へ •
Unity5の新要素について • シングルマニフェスト • バリアント • 依存関係 • リソース管理理 • ロードAPIと圧縮 • Jenkins連携 • おまけ • 質疑応答
HD(⾼高画質)とSD(標準画質)を同じアセットとして扱え る仕組み $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE Hoge.unity3d.hd Hoge.unity3d.sd
別のバンドルを同じものと⾒見見なして切切り替 えする
なぜ使わないのか。 『プロジェクトにHD/SD2つのリソースを管理理する必要がある』 これがネック。 $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
デザイナーには、HD版1リソースで作業させる (SD版を意識識させたくない) SD版は⾃自動⽣生成するように、対象はテクスチャです。 変換svを別途⽤用意、変換処理理を経由してアセットバンドル ビルドsvへ Repository 変換sv Build sv リソースsv
リサイズ (50%) & 減色 clone cp rsync $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
サウンドとムービーは⾃自動化しない ⾼高⾳音質(画質)/標準⾳音質(画質)は、デザイナにそれぞれ出 ⼒力力してもらい、リポジトリでHD/SDを管理理 Repository 変換sv Build sv リソースsv リサイズ (50%)
& 減色 clone cp rsync clone AB(HD)/Sound/Movie AB(SD) サウンド、ムービーも品質を分けるのでCygamesでは HD/SD-‐‑‒>High/Lowと呼ぶように $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
リソースサーバーの階層構造 00000000/High/AssetBundle/Android など 品質をデバイスのスペックに合わせて変更更する バージョン 品質 種類 プラットフォーム 00000000 High
AssetBundles Android 00000001 Low Sounds iOS 01010001 Movies PC $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
品質レベル基準 デバイスの搭載RAMで判断、アプリ初期化時にデバイス チェック。 512Mb未満は『Low』 512Mb以上は『High』 デフォルトで決まった品質レベルは、 オプション画⾯面などでユーザーが任意で切切り替えられるよう に動的に対応できるようにする。 切切り替え後は、対象の種類ごとにストレージから全削除し再 ダウンロードさせる。共存不不可。
$POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
Low版の必要性 搭載RAM512Mb未満の端末は、国内Android端末では2012 年年初発売端末までさかのぼる。 iOSはiPhone4s(2011年年)以前。 シェア的に微妙なところ、 ⾮非推奨とした上で採⽤用判断はプロジェクトにお任せ $POGJEFOUJBM $PQZSJHIU $ZHBNFT
*OD "MM3JHIUT3FTFSWFE
アジェンダ $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE • Unity4からUnity5へ •
Unity5の新要素について • シングルマニフェスト • バリアント • 依存関係 • リソース管理理 • ロードAPIと圧縮 • Jenkins連携 • おまけ • 質疑応答
Unity4では、PushしてPopして、ビルドシーケンスが複雑 いつロードされて破棄されてるのか不不明確 シングルマニフェスト使いたくない (前述の独⾃自リソースリスト使いたい) $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
アセットバンドルは、共有アセットバンドルと固有アセット バンドルを分けて作成 CommonShader CommonMaterial Model001 ModelTexture001 CommonTexture 3DCommonShader.unity3d 3DCommonTexture.unity3d 3DCommonMaterial.unity3d
3DCharaModel001.unity3d 3D Build Group ModelMaterial001 AssetImporter::assetBundleNameを全て設定してから BuildPipeline.BuildAssetBundles() アセットの依存が残り、依存するアセットは固有バンドルに 格納されない $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
シーン単位なのか、画⾯面単位なのか、アセットのライフスパ ンを明確にして、共有アセットバンドルのロード 固有アセットバンドルのロード、アンロードを管理理する Object/ABの破棄 固有AB DL/Load Load順番は、⼦子から ある⼀一定の状態 (バトル、xx画⾯面など) 開始処理理
終了了処理理 CommonShader CommonTexture CommonMaterial Model001 共有AB DL/Load $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
アジェンダ $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE • Unity4からUnity5へ •
Unity5の新要素について • シングルマニフェスト • バリアント • 依存関係 • リソース管理理 • ロードAPIと圧縮 • Jenkins連携 • おまけ • 質疑応答
①1プロジェクト構成 ソースコード(アプリ)、リソース を1つのプロジェクトに全て含める $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE Game
script resources Prein 3D UI Card resources 3D Editor script Editor script resources UI Editor script BG resources Prein Game script Title. unityproject Title. unityproject 3DWork. unityproject UIWork. unityproject ②複数プロジェクト構成 アプリとカテゴリごとのリソースで分ける 3D/UI/Cardなど、アセットバンドルビル ド⽤用プロジェクトに分ける
メリット、デメリットを考える ①1プロジェクト構成 リソース作成-‐‑‒>即時プレビュー。ゲーム上で確認したい。 プロジェクトの肥⼤大化。 ②複数プロジェクト構成 プロジェクトはシンプル。作業に必要なプロジェクトだけ使う 確認に⼿手間がかかる (ビルドしてサーバーアップして。。) ※カードビューアー、モデルビューアーといった 最終形を担保できるツールを別途⽤用意する必要がある
結果:①を採⽤用することに ソースとリソースのリポジトリは分けます $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
root Assets ①_ProjectName Resources プリインストールリソース Scenes Scripts ②_ProjectNameResources Resources アセットバンドルリソース
リソースリポジトリで管理 アプリビルド時はcloneしない ③_ProjectNameDebug xxx デバッグツールなど アプリビルド時にフォルダごと削除 Plugins StreamingAssets その他assetフォルダ プロジェクトフォルダ構成 $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
1プロジェクト構成のメリットは、ローカルに置いたアセッ トを直接ロードできる アセットバンドルとローカルアセットのロードを吸収するク ラスでResourcesのロードをラップする public T LoadObject<T>(string assetName, string objectName,
bool isServerResources = true) where T : Object { if (!isServerResources) { // Resourcesから return Resources.Load<T>(objectName); } else { // AssetBundleから var o = assetManager.LoadObject(assetName, objectName, typeof(T)); if (o != null) { return (T)o; } // なければResourcesから T resource = Resources.Load<T>(objectName); return resource; } } $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
アジェンダ $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE • Unity4からUnity5へ •
Unity5の新要素について • シングルマニフェスト • バリアント • 依存関係 • リソース管理理 • ロードAPIと圧縮 • Jenkins連携 • おまけ • 質疑応答
アセットバンドルのダウンロード WWW.LoadFromCacheOrDownload ・キャッシュサイズ上限 ・Caching.ready肥⼤大化 ・150⽇日制限 ⻑⾧長い運営を⾒見見据えると不不向き 前述した、独⾃自のリソースリストで管理理するようにして WWW.LoadFromCacheOrDownloadを使わないように $POGJEFOUJBM $PQZSJHIU
$ZHBNFT *OD "MM3JHIUT3FTFSWFE
・アプリ初期化時に最新のリソースリストをダウンロードしておく ・アセットバンドルを1度度DLしたらハッシュをセーブする ・ 2回⽬目以降降は、セーブしたハッシュと独⾃自リストのハッシュ、 バージョンから再DLチェック ・差分があれば再DL この繰り返し 初期化時:リソースリストダウンロード ②差分ありダウンロード(www) ③ハッシュセーブ
①セーブデータハッシュチェック $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
アセットバンドルからのロード AssetBundle.CreateFromFileを使⽤用したいのですが、 BuildAssetBundleOptions.UncompressedAssetBundle 付けないとロード出来ない(無圧縮アセットバンドル) おおよそな数値ですが、実例例では 5,000アセットバンドルで2.5GBくらいになってしまった。 $POGJEFOUJBM $PQZSJHIU $ZHBNFT
*OD "MM3JHIUT3FTFSWFE
アセットバンドル⾃自体を圧縮することに。 5,000ファイル:2.5GB -‐‑‒> 450MB ※アルゴリズムは⾮非公開。 アセットバンドルビルドシーケンス アセットバンドルロードシーケンス AssetImporter.assetBundleName BuildPipeline.BuildAssetBundles
圧縮 ハッシュ生成 リソースリスト生成 www ダウンロード 解凍 AssetBundle.CreateFromMemory 管理クラスに登録 圧縮したままストレージへ保存 解凍時にメモリに乗るのでFromMemory使う $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
アジェンダ $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE • Unity4からUnity5へ •
Unity5の新要素について • シングルマニフェスト • バリアント • 依存関係 • リソース管理理 • ロードAPIと圧縮 • Jenkins連携 • おまけ • 質疑応答
$POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE アプリとアセットバンドルのビルドは、Jenkinsで⾃自動化、 NightlyBuild(安定版)と⼿手動ビルドを使い分ける 出⼒力力されたアプリは、配布サーバーへ転送される 出社と同時に、最新リソースでチェックできるように
ビルドマシン:Mac mini(2012年年モデル Intel Core i5 2.5GHz) アプリビルド30分、 アセットバンドルビルド2時間(1プラットフォーム) ビルドマシン:Mac Pro(mem
64GB DDR ECC) アプリビルド5分、 アセットバンドルビルド15分(1プラットフォーム) $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
PC High/Low BuildTarget.WebPlayer iOS High iOS Low Android High Android
Low PC/iOS/Android Low 画像コンバート $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
Mac Pro 5台! やりすぎ反省省。。 現在は1台の並列列jobで⼗十分対応できてます $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD
"MM3JHIUT3FTFSWFE
LTE7GB超過したユーザーの国内キャリアの128kbps速度度制限対策 iOSの場合、(「設定(デベロッパ)」)で通信速度度変更更できる ファイルサイズ6、7Mbくらいでダウンロードできなくなっている アセットバンドルを細かく、多くの⽅方針が功を奏して1ファイルのサイズ を軽減していた でもオーバーするものもあったサウンド、ムービーなど ダウンロードしないオプションを⽤用意 サイズオーバーしているムービーは泣く泣く削除したり。 おまけ $POGJEFOUJBM
$PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
• シングルマニフェストは使わず、依存関係は使い⽅方でカバー • バリアントは、サーバーリソースでスイッチする • LoadFromCacheOrDownloadを使わず、バージョンチェックは⾃自 作リストでまかなう • ⾮非アセットバンドル状態のリソースを使えるように •
jenkinsで常に最新のアプリ、アセットバンドルを提供するように 振り返り $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE
懇親会で気軽にお声掛けください。 質疑応答 $POGJEFOUJBM $PQZSJHIU $ZHBNFT *OD "MM3JHIUT3FTFSWFE