2022/05/20 CA.unity#4より
IDOLY PRIDEにおけるアセット管理とAssetBundleビルドフローや、それらを実現するために採用した技術について紹介します。
IDOLY PRIDEにおけるAssetBundleビルドパイプラインについてQualiArts 渡部聡
View Slide
1.自己紹介2.AssetBundle3.Assetの種類と管理方法4.AssetBundleビルドパイプライン5.まとめ
自己紹介
渡部聡•2014(AmebaGames)~2022(QualiArts )•UnityEngineer•UI系・ビルド系
AssetBundle
AssetBundleとは•asset(texture,audioclip,etc)をbundleしたもの•Unity特有の概念では無い(UEとかcocosとかにもある)•UnityにおいてはAssetBundleクラスとして扱う•アプリとは分離したもの(別ファイル化)として扱うことができる•AssetBundleのメリットアプリとは別に後からダウンロードさせられる運用で新キャラ追加!などが発生してもアプリを更新せずにすむ
Assetの種類と管理方法
Assetの種類•動画•カード絵•SDキャラ•その他UI系素材•キャラボイス・SE•3Dキャラ・背景・キャラモーション・シェーダー•ライブデータ(タイムライン・楽曲・エフェクト)
Assetの種類•動画•カード絵•SDキャラ•その他UI系素材•キャラボイス・SE•3Dキャラ・背景・キャラモーション・シェーダー•ライブデータ(タイムライン・楽曲・エフェクト)SVNとGoogleDriveの併用
SVNとGoogleDriveSVN GoogleDrive学習コスト 高 低GUI どれも微妙(Mac) パソコン版Googleドライブ(旧DriveFileStream)が使いやすいコミットしやすさ stagingの概念とか面倒 ファイルを置くだけ(意図せぬ移動が発生したり •••)ログの追いやすさ 普通 普通コミットの戻しやすさ File/Dir単位でも巻き戻しが可能 File単位の巻き戻しは簡単全体を特定のcommit時点に戻すとかは難しい
SVNとGoogleDriveSVN GoogleDrive学習コスト 高 低GUI どれも微妙(Mac) パソコン版Googleドライブ(旧DriveFileStream)が使いやすいコミットしやすさ stagingの概念とか面倒 ファイルを置くだけ(意図せぬ移動が発生したり •••)ログの追いやすさ 普通 普通コミットの戻しやすさ File/Dir単位でも巻き戻しが可能 File単位の巻き戻しは簡単全体を特定のcommit時点に戻すとかは難しい普段使いにはDriveが圧倒的に便利不具合調査とか特殊な状況ではsvnの機能が欲しくなる
Assetの種類•動画•カード絵•SDキャラ•その他UI系素材•キャラボイス・SE•3Dキャラ・背景・キャラモーション・シェーダー•ライブデータ(タイムライン・楽曲・エフェクト)基本的にログとか見ない稀にログを見たり戻したり
Assetの種類•動画•カード絵•SDキャラ•その他UI系素材•キャラボイス・SE•3Dキャラ・背景・キャラモーション・シェーダー•ライブデータ(タイムライン・楽曲・エフェクト)基本的にログとか見ない稀にログを見たり戻したり・・・という理由は全て後付けで、次のプロジェクトではSVNを捨ててplastic scmにする予定だったりも
AssetBundleビルドパイプライン
アセットの取り込み(旧)AssetBundleAsset checkout(rclone)生成Asset checkoutmetaコミットmetaコミット(rclone)
アセットの取り込み(旧)AssetBundle生成Asset checkoutmetaコミット(差分が少なければ)svnは高速Asset checkout(rclone)metaコミット(rclone)
アセットの取り込み(旧)AssetBundle生成Asset checkoutmetaコミット(差分が少なければ)svnは高速(差分が少なくとも)rsyncは遅めAsset checkout(rclone)metaコミット(rclone)
アセットの取り込み(新)AssetBundleassetを同期(rclone)checkout生成metaコミット•Driveの使いやすさはそのまま•rcloneの重さは(少し)軽減•ログが一元管理できてるかも
ビルドの並列化•iOS, Android, OSX, Windows, WebGLの5プラットフォーム用にビルドしている•マシンは社内MacProサーバー1台 RAM192GM, 16Core•workspaceは常にマシン上に常駐させる•並列化はJenkinsのPipeline Scriptで実装•ビルドの実行自体は定期orクリエイターorプランナーが実行する•↓下の「Unity」のところで5プラットフォームビルド
ビルド処理の実装方針•AssetBundleビルドパイプラインAPIのどれを使うか?UnityEditor.BuildPipeline レガシーAddressables イマドキのScriptableBuildPipeline Addressablesの中身•とにかく早い段階でビルド環境を整えたいAssetBundleを使えないプロジェクトは大量のAssetをコミットされやすい傾向大量のAssetでプロジェクトが膨れるとcloneやimportで大量の時間を浪費する•UnityEditor.BuildPipelineを採用 ビルド所要時間※2019年時点
レガシーBuildPipelineの問題点•プロジェクト初期ではUnityEditor.BuildPipelineを採用・・・しかし問題が発覚Texture Streaming非対応AssetBundle単位で圧縮と無圧縮を分けたいができなかったそして今更レガシーなAPIとか・・・•無圧縮なAssetBundleが必要になる状況動画(mp4)をAssetBundleに同梱したかったAndroidでは圧縮されたAssetBundleから動画を読み出せない•ScriptableBuildPipelineならどちらも解決できる -> 採用
ビルド処理の実装•SBP (ContentPipeline)を使う•特定の命名規則AssetBundleは無圧縮•実装詳細1. アセットのバリデーションをする2. BundleBuildParametersを継承して圧縮指定3. ContentPipeline.BuildAssetBundlesを実行4. 成果のAssetBundleを暗号化•アセットのバリデーションImporterを通っているかMeshに必要な情報が格納されているかetc etc..•AssetBundleの暗号化高速かつChunk読み可能なオレオレ実装しかし脆弱
余談:アセット確認環境•アセット確認専用アプリを準備ゲーム用と独立してて軽い- iOSアプリ- Androidアプリ- ブラウザ版(WebGL)•WebGL版はたまに便利真の姿はiOS/Androidアプリで見る必要あり
まとめ
まとめ•Asset管理にはSVNとGoogleDriveを採用•AssetBundleビルドにはScriptableBuildPipelineを採用•クリエイターとプランナーチームがビルドを実行
ありがとうございました