9.3K Views
September 26, 19
スライド概要
2019/9/25-6に開催されたUnite Tokyo 2019の講演スライドです。
池田 早人(株式会社バンダイナムコスタジオ)
成瀬 正裕(株式会社バンダイナムコスタジオ)
斎藤 淳(株式会社バンダイナムコスタジオ)
齋藤 健司(株式会社バンダイナムコスタジオ)
こんな人におすすめ
・チーム開発を行なっているエンジニア
・プロジェクトのマネージメント担当者
・バンダイナムコスタジオの開発が気になる方
受講者が得られる知見
・チーム開発における重要なポイントの紹介
・バージョン管理とアセットバンドルの運用に関して
・Unityを使いこなすためのテクニック
Unityのイベント資料はこちらから:
https://www.slideshare.net/UnityTechnologiesJapan/clipboards
リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。
バンダイナムコスタジオ流 Unityの使い方
本日のセッションの説明 • 今日お話しする事 • 各タイトルのアセットバンドル運用に関して • 各タイトルのUnityバージョンアップ作業に関して • 各タイトルで使用しているツールに関して • こんな人向けです • 主にエンジニア向け • チーム開発のマネージメント担当者 • スライドは公開します 1
自己紹介 • 池田 早人 「アイドルマスター ミリオンライブ! シアターデイズ」 • 成瀬 正裕 「ドリフトスピリッツ」 • 齋藤 健司 「テイルズ オブ ザ レイズ フェアリーズ レクイエム」 • 斎藤 淳 「NARUTO X BORUTO 忍者BORUTAGE」 2
タイトル紹介① ドリスピ • ドリフトスピリッツ • 2013年11月6日~ (iOS) • 2014年5月29日~ (Android) • Unity 2017.4.29 • ジャンル:レース ©BANDAI NAMCO Entertainment Inc. 配信:株式会社バンダイナムコエンターテインメント 3
タイトル紹介② レイズ • テイルズ オブ ザ レイズ フェアリーズ レクイエム • 2017年2月28日~ • Unity 2017.4.30 • ジャンル: 真実の強さを纏うRPG ©いのまたむつみ ©藤島康介 ©BANDAI NAMCO Entertainment Inc. 配信:株式会社バンダイナムコエンターテインメント 4
タイトル紹介③ ミリシタ • アイドルマスター ミリオンライブ! シアターデイズ • 2017年6月30日〜 • Unity 2017.4.29 • ジャンル:アイドルライブ& プロデュースゲーム ©窪岡俊之 ©BANDAI NAMCO Entertainment Inc. 配信:株式会社バンダイナムコエンターテインメント 5
タイトル紹介④ 忍ボル • NARUTO X BORUTO 忍者BORUTAGE • 2017年11月15日〜 (国内) • 2017年11月22日~ (海外) • Unity 2017.4.23 • ジャンル: アクション+ストラテジー ©岸本斉史 スコット/集英社・テレビ東京・ぴえろ ©BANDAI NAMCO Entertainment Inc. 配信:株式会社バンダイナムコエンターテインメント 6
アジェンダ 1. みんな大好き♡アセットバンドル 2. どうする?どうなる!Unityバージョンアップ 3. 管理ツーーール! 7
1. みんな大好き♡ アセットバンドル 8
アセットバンドル ドリフトスピリッツ編 ©BANDAI NAMCO Entertainment Inc. 配信:株式会社バンダイナムコエンターテインメント 9
アセットバンドル ドリフトスピリッツ編 ドリフトスピリッツからは、アセットバンドルのリリースフローについて紹 介します。 10
アセットバンドルのリリースフロー@ドリスピ クライアントアプリのリリース毎にtrunkからリリース用のブランチを作 成している。データ作成者はtrunkにコミットするだけで作業が完了し、 ブランチにマージしてアセットバンドルを作成するのはエンジニアが 行なうようにする。 11
アセットバンドルのリリースフロー@ドリスピ マージするブランチ数を減らして作業軽減を図るため、ブランチはア セットバンドルのリリース毎ではなく、クライアントアプリリリース毎に 作成する。 アプリリリース後アセットバンドルのみ更新する場合でも、新たなブラ ンチは作成せずにリリースブランチにデータをマージして、アセットバ ンドルを作成するようにしている。 12
アセットバンドルのリリースフロー@ドリスピ trunkには配信してはいけないテストデータや作成途中のデータも含 まれているので、リリース用ブランチを作成したらデータ作成者からエ ンジニアに連絡をしてブランチから削除する運用を行なっていた。 13
アセットバンドルのリリースフロー@ドリスピ アプリのリリース前(2013年夏)は この仕組で問題なく運用できる と思っていました 14
アセットバンドル問題発生!@ドリスピ リリース用ブランチを作成後、開発途中のデータを削除しないままア セットバンドルを配信してしまい、それを解析した第三者がSNS上で 公開する事態が発生した。 • ネタバレ • 非公式手段とはいえ、 権利所有者と合意した配信開始日より前にデータが流出してしまっ た。 15
アセットバンドル問題解決@ドリスピ アセットバンドル用のprefab置き場に、開発中データ置き場を作った。 • trunkでは開発中も含めてビルド • リリース用ブランチでは開発中は除外してビルド とするように運用することで、作業者の負担軽減、開発途中のデータ を誤って配信することがないようにできた。 16
アセットバンドル問題解決@ドリスピ これで開発途中のデータが配信 されることが無くなって解決! 17
アセットバンドル問題解決@ドリスピ ではなく、 問題は残っていた。 18
問題その2@ドリスピ 動作確認用の環境は、本番も含めて以下の4つ存在している • 本番 • デバッグ1(次回イベントの本番相当) • デバッグ2(次々回イベントの本番相当) • trunk アプリリリース毎にブランチを作成しているため、「本番」「デバッグ1」「デバッ グ2」は同じブランチからアセットバンドルをデプロイしている。 19
問題その2@ドリスピ • ネタバレを防ぐためブランチへのマージは遅らせたい • デバッグスケジュールが遅れるので、早くマージしろ! バグが見つかっても修正が間に合わない! この運用では上手くいかない問題が残った。 20
問題その2 解決@ドリスピ アセットバンドルのビルドは行なうけど各環境の配信対象から除外す る「ブラックリスト」を導入することで、ブランチにマージされているけ ど配信されないという仕組を作った。 21
アセットバンドル問題解決!@ドリスピ これで問題は全て解決! 22
問題その3発生!@ドリスピ と思ってたら、 本番リリース時に ブラックリストから削除し忘れて、 お客様の環境でエラー発生! 23
問題その3発生!@ドリスピ デバッグ環境のブラックリストからは 該当のアセットバンドルを削除していた ので、デバッグは無事通過していた 24
問題その3解決@ドリスピ 本番環境のデプロイフローの中に、ブラックリストと本番のマスターデ ータを比較して、マスターデータの中に存在するアセットバンドル名 がブラックリストに存在していたら作業者に警告メールを送る仕組を 作成した。 25
アセットバンドル問題解決!!@ドリスピ この仕組を構築した後は、 まだ新たな問題は見つかっていない でも100%完璧ではないであろう 26
アセットバンドルまとめ@ドリスピ 人と人とのやりとりでミスを無くそうとしても限界がある。 • 機械的な仕組を導入してミスを発生しないようにする。 • どうしても人力で作業するところには、機械的にチェックをする仕組 を導入して、本番に出る前にミスを検出する仕組を作る。 27
アセットバンドル レイズ編 ©いのまたむつみ ©藤島康介 ©BANDAI NAMCO Entertainment Inc. 配信:株式会社バンダイナムコエンターテインメント 28
レイズのアセットバンドル管理方法 配信するアセット単位でフォルダを分けて 管理・作成 • クエスト、イベント、キャラクターなど…… • 各フォルダ内に必要なマスターデータや アセットバンドルを配置 29
ビルド対象のフォルダを指定した設定ファイル • アセットバンドルをビルドする際、ビルド対象とするフォルダを指定し た設定ファイルを用意(テキストファイル) • 開発用の設定ファイル MainQuest/Quest_1_1 MainQuest/Quest_2_1 EventQuest/Event_2018_Xmas EventQuest/Event_2019_NewYear Chara/Ickx Chara/Mileena • 本番配信用の設定ファイル MainQuest/Quest_1_1 MainQuest/Quest_2_1 EventQuest/Event_2018_Xmas Chara/Ickx Chara/Mileena 30
ビルド対象のフォルダを指定した設定ファイル 設定ファイルで指定されたフォルダにあるマスターデータやアセットバンド ルのみがビルドされ、開発用と本番配信用のアセットバンドルを別々にビルド することができる • 本番配信用のアセットバンドルに、現在開発中の次に配信予定のデータな どが含まれないようにできる • ちなみに指定されたフォルダ内にあるマスターデータは、 同じデータ同士が結合されて1つのデータ ベースとして出力される 31
フォルダを分けることによるメリット • メリット 開発単位毎に作業フォルダが分かれているため、クエストやイベント など複数ラインで同時に平行開発ができる 特にマスターデータ(エクセルファイル)も分かれているため、複数 人で1つのマスターデータを編集しないで済む 32
フォルダを分けることによるデメリット • デメリット アセットバンドルやマスターデータがフォルダをまたいで点在するた め、一覧性や視認性・検索性が悪い 特にバトルなどキャラクター同士のバランス調整がし辛い → この問題を解決するため、レイズではこれとは別に、マスターデー タの行単位でフィルタリングができる仕組みもある 33
アセットバンドルのビルド 設定ファイルで指定されたフォルダのアセットバンドルのみを、ビルド マップを使ったBuildPipeline.BuildAssetBundles()でビルドする • ビルドマップを使わない通常のBuildAssetBundles()は、1行で全て のアセットバンドルがビルドできて楽ではありますが、ビルドマップを 使うとビルド時にビルドしたいアセットバンドルの制御ができるので 便利 34
アセットバンドルのビルド • ちなみに昔、アセットバンドルに含める/含めないを、.metaの assetBundleNameを都度書き換えてビルドするようにしていたとこ ろ、たまたまUnityが.metaの変更を正しく認識しなかった(再インポ ートされなかった)ことがあり、含めてはいけないアセットバンドルを 本番環境に撒いてしまったことがあり、痛い目にあいました……(苦笑) 35
ビルドマップを使ったアセットバンドルビルドのコード例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 { // ビルドマップを使ったアセットバンドルビルドのコード例 string[] assetBundleNames = AssetDatabase.GetAllAssetBundleNames(); List<AssetBundleBuild> buildAssetBundles = new List<AssetBundleBuild>(); foreach (var assetBundleName in assetBundleNames) { // アセットバンドル名からアセットを取得 var assetNames = AssetDatabase.GetAssetPathsFromAssetBundle(assetBundleName); List<string> assetNamesAdd = new List<string>(); foreach (var assetName in assetNames) { // 設定ファイルで指定されているフォルダ内のアセットバンドルのみビルド対象とする if (buildTargetFolders.Any(assetName.Contains)) // 設定ファイルに指定されているパスが含まれている? { assetNamesAdd.Add(assetName); } } } // ビルド対象のアセットがあったら、アセットバンドルとしてビルドする if (assetNamesAdd.Count > 0) { // ビルドマップを作成 AssetBundleBuild build = new AssetBundleBuild(); build.assetBundleName = assetBundleName; build.assetNames = assetNamesAdd.ToArray(); buildAssetBundles.Add(build); } 36
ビルドマップを使ったアセットバンドルビルドのコード例 29 30 31 32 33 34 35 } // ビルドマップでアセットバンドルをビルド if (buildAssetBundles.Count > 0) { assetBundleManifest = BuildPipeline.BuildAssetBundles(outputAssetBundlesPath, buildAssetBundles.ToArray(), buildAssetBundleOptions, buildTarget); } 37
アセットバンドル ミリシタ編 ©窪岡俊之 ©BANDAI NAMCO Entertainment Inc. 配信:株式会社バンダイナムコエンターテインメント 38
アセットバンドルフロー@ミリシタ • dev(開発用)とQA以降でアセットバンドルの作成フローが異なる • devはフォルダ毎に構成し、アプリ側で統合する • QA以降はサーバーにデプロイ時に統合して作成される QA dev BASE Build 20190915 20190917 20190920 テスト用 user_test Deploy BASE + 20190915 BASE + 20190915 20190917 BASE + 20190915 20190917 20190920 39
アセットバンドルビルド@ミリシタ • ミリシタでは1回のアセットバンドルビルドで7つ作成している • iOS 3種類 (iPhone5s/iPhone6/それ以降) • Android 2種類 (OpenGLES 3.0/OpenGLES 3.1以降) • Windows/Mac • アセット数:リリース 6600個 / 最新 33000個 • ビルドの管理に内製ツールを使用している • 基本的にJenkinsで実行され、ナイトビルドを活用している 40
アセットバンドル 忍ボル編 ©岸本斉史 スコット/集英社・テレビ東京・ぴえろ ©BANDAI NAMCO Entertainment Inc. 配信:株式会社バンダイナムコエンターテインメント 41
システム@忍ボル 忍ボルのアセットバンドルの仕組みはUnity5の頃に作られた仕組み を拡張して使ってます。 Addressable Assets System? ナニソレ、オイシイノ? という時代から使ってるものですから… 42
システム@忍ボル こんな感じに動作するマネージャーを自作して使ってます。 リソース 呼び出し マネージャー アセット バンドル 読み込むべき場所を スイッチで切り替える 43
システム@忍ボル マネージャーを自作することで、 • リソースもアセットバンドルも同じパスでロード • アセットバンドル用アセットも開発中はリソースからロード • 参照カウンタでのアセットの管理 • 使用頻度の高いアセットを事前にロード といったことをできるようにしてます。 44
ABネタバレ防止事情@忍ボル • リリース用ブランチに直近の公開アセット以外が含まれないように 開発する • 想定外のアセットバンドルがダウンロードされないようにスケジュー リングする • アセットバンドル以外の追加ダウンロードファイルの暗号化 • アセットバンドルのファイル名を難読化 • アセットバンドル公開アドレスの難読化 45
ABネタバレ防止事情@忍ボル • リリース用ブランチに直近の公開アセット以外が含まれないように開発する 新キャラ等の開発は開発用の ブランチで作成し、リリースの スケジュールに合わせてリリー 開発 リリース キャラA キャラA ス用ブランチにコピーすること キャラB で、リリース前の新キャラがバ キャラC 必要なキャラだ けコピーする キャラC レてしまうのを防止しています。 46
ABネタバレ防止事情@忍ボル • 想定外のアセットバンドルがダウンロードされないようにスケジューリングする サーバーに右表のようなアセットバンドル毎のダウン chara_a 2018/06/29 4:00 ロード可能時間を設定します。 chara_b 2018/07/30 4:00 ログインする時にサーバーはこのリストから設定時刻 chara_c 2018/08/20 4:00 を過ぎているアセットバンドルのリストを通知します。 chara_d 2018/08/29 4:00 この仕組で、公開前のアセットバンドルが端末にダウ chara_e 2018/09/28 4:00 ンロードされてしまうのを防止します。 47
ABネタバレ防止事情@忍ボル • アセットバンドル以外の追加ダウンロードファイルの暗号化 追加ダウンロードするファイルはアセットバンドルだけではなくバナーなどの 更新頻度の高い画像もあり、これらはアセットバンドルよりも単体の画像で公 開したほうがコストが安く済みますが、当然ネタバレの危険性がありますので AESによる暗号化をする事でネタバレ防止を行っています。 48
ABネタバレ防止事情@忍ボル • アセットバンドルのファイル名を難読化 アセットバンドルのファイル名前は直接アクセスするのではなく、必 ずファイル名を推測しにくいファイル名に置き換えてアクセスしてい ます。 例: Sample 52defa0d-bd16-0581-317e-04d75463c639 49
ABネタバレ防止事情@忍ボル • アセットバンドル公開アドレスの難読化 アセットバンドルを公開するフォルダも公開する毎に変更し、フォル ダ名にランダム文字列を入れることによって難読化し推測しにくくす ることで、不正アクセス防止と予期せぬアセットバンドルのアップロー ドによるネタバレを防止しています。 50
2. どうする?どうなる! Unityバージョンアップ 51
バージョンアップの歴史 2013/11 4.2.1 ←5回→ 4 2015/12 2016/5 4.6.9 5.3.4 ←2回→ 2018/2 2018/11 5.6.5 2017.4.8 ←1回→ 2019/7 2017.4.29 2017.4 5 ©BANDAI NAMCO Entertainment Inc. 2018/6 2017/2 2017.4.6(A) 2019/8 5.4.4 2017.4.4(i) 2017.4.30 5 2017.4 ©いのまたむつみ ©藤島康介 ©BANDAI NAMCO Entertainment Inc. 2017/6 2018/4 5.6.2 2017.4.1 5 ←1回→ 2019/8 2017.4.29 2017.4 ©窪岡俊之 ©BANDAI NAMCO Entertainment Inc. 2017/11 2018/2 5.6.0p3 2017.2.0p4 5 ←2回→ 2019/6 2017.4.23 2017.4 ©岸本斉史 スコット/集英社・テレビ東京・ぴえろ ©BANDAI NAMCO Entertainment Inc. 52 配信:株式会社バンダイナムコエンターテインメント
Unityバージョンアップ ドリフトスピリッツ編 ©BANDAI NAMCO Entertainment Inc. 配信:株式会社バンダイナムコエンターテインメント 53
Unityのバージョンアップにおける課題@ドリスピ • trunk:新しい Unity • 現行のリリース中のブランチ:古いUnity の時に、trunkからブランチにマージしようとしても互換性がない場合 がある。この時はデータ作成者が、ブランチで古いUnityで作業して、 trunkでも新しいUnityで作業する事態が発生してしまっている。 54
Unityのバージョンアップに伴うインシデント@ドリスピ 1. 前頁の状況下において、本番環境のデータに即時に修正反映し なければならない不具合が見つかった。 2. リリースブランチで古いUnityを使って修正した。 3. 緊急対応だったのでtrunkの修正は後回しにしたら、修正を忘れ てしまった。 4. 数か月後、trunkから新たなリリースブランチを作成したら同じ不 具合が再発してしまった。 55
Unityバージョンアップ レイズ編 ©いのまたむつみ ©藤島康介 ©BANDAI NAMCO Entertainment Inc. 配信:株式会社バンダイナムコエンターテインメント 56
レイズのUnityバージョンアップ手順 Unityをバージョンアップしたいが…… • 次期バージョンの開発作業には支障をきたさないようにしたい • 運営中の環境は古いUnityバージョンでリリースされた環境のため、 特にアセットバンドルなどの関係でUnityプロジェクトをアップデート する訳にはいかない ではどうするか……? 57
レイズのUnityバージョンアップ手順 自分のローカルPCのUnityエディタをバージョンアップして、取り敢え ず自分だけUnityプロジェクトを開く • 新しいUnityでプロジェクトを開くことで、Unityが自動的にコードを修 正してくれる箇所がある • Obosoleteなどで警告やエラーが出ている箇所は、手でコードを修 正 58
レイズのUnityバージョンアップ手順 スクリプトファイル(.cs)は、Unityの#defineディレクティブを使って旧 バージョンのUnityエディタでもビルドが通るように修正する #if UNITY_2017_4_OR_NEWER <新バージョンのコード> #else <旧バージョンのコード> #endif 59
レイズのUnityバージョンアップ手順 ProjectSettingsフォルダ内の設定ファイルや、更新が必要なプレハ ブなどのアセットは、別フォルダに上書きファイルとして保存しておく UnityProject/ ├─ Assets/ ├─ ProjectSettings/ └─ Overwrite_2017.4/ ├─ Assets/ │ └: └─ ProjectSettings/ ├─ ProjectSettings.asset └─ ProjectVersion.txt 60
レイズのUnityバージョンアップ手順 • ビルド専用マシンに複数バージョンのUnityが切り替えられるようイ ンストールをしておき、新バージョンのUnityでビルドをする際は上書 きフォルダ(Overwrite_2017.4)をUnityプロジェクトフォルダにまるご と上書きコピーをしてから、新しいバージョンのUnityでビルドをする • ちなみに自動的に変更がかかる.metaファイルは一旦無視(Unityの 自動更新に任せる) 61
レイズのUnityバージョンアップ手順 • 最後に、新しいバージョンのUnityでビルドされた環境がリリースされ た後に、全スタッフのローカルPCのUnityエディタも新しいバージョ ンにアップデートしてもらって移行完了 62
Unityバージョンアップ ミリシタ編 ©窪岡俊之 ©BANDAI NAMCO Entertainment Inc. 配信:株式会社バンダイナムコエンターテインメント 63
バージョンアップのポリシー@ミリシタ • 開発中は出来る限り最新版を使用する • リリース直前にiOSのBugfixされた最新バージョンに差替えた事も… • 運営中は基本的にバージョンアップはしない • 2017はリリース直前にLTSがリリースされたのでLTSに移行した • 2017.4.1以降のバージョンアップは主にAndroidの64bit対応のため 64
5.6から2017.4へ@ミリシタ • アセットバンドルの再作成とチェックが大変だった • ユーザーに再DLの負担を極力かけたくなかった • プラグインの対応状況の確認は早めにしておく • バージョンアップと共に大きな機能追加を実施した • 検証と準備期間を含めて6カ月くらい掛けた 65
Unityバージョンアップ 忍ボル編 ©岸本斉史 スコット/集英社・テレビ東京・ぴえろ ©BANDAI NAMCO Entertainment Inc. 配信:株式会社バンダイナムコエンターテインメント 66
Unityバージョンアップ事情@忍ボル 過去のUnityバージョンアップの度に、 • .metaやスクリプトの互換性 • ParticleやMechanimの挙動が変わってしまうことがある • アセットバンドルの互換性 といった問題が度々起こるので… 67
Unityバージョンアップ事情@忍ボル Unityのバージョンアップをするための条件を決めてます • 大きな宣伝やイベント等の影響(特にバグが出てしまう可能性を考 慮して) • バージョンアップしなければ実装できない必須機能があるか • Unityのサポート期限 • コンテンツをフルチェックする時間が取れるかどうか 68
Unityバージョンアップ事情@忍ボル 実際にバージョンアップをするとなった場合、 • .metaやスクリプトの互換性 • ParticleやMechanimの挙動が変わってしまうことがある の問題は、ただひたすら修正&チェックします。 69
Unityバージョンアップ事情@忍ボル • アセットバンドルの互換性 新キャラを開発している開発用 ブランチとリリース用ブランチの Unityバージョンが違うと予期 せぬ不具合が発生する可能性 があるので、Unityのバージョン 開発 (新Unity) 開発 (現Unity) キャラA キャラA キャラB リリース キャラA キャラBはコピーされない ように違うブランチに アップが入る場合はコミットする 先を分けて対応しています。 70
3. 管理ツーーール! 71
プロジェクトで使用している管理ツール バージョン管理 情報共有 タスク管理 バグトラ チャット 独自ツール ©BANDAI NAMCO Entertainment Inc. ©いのまたむつみ ©藤島康介 ©BANDAI NAMCO Entertainment Inc. ©窪岡俊之 ©BANDAI NAMCO Entertainment Inc. ©岸本斉史 スコット/集英社・テレビ東京・ぴえろ ©BANDAI NAMCO Entertainment Inc. 72 配信:株式会社バンダイナムコエンターテインメント
管理ツールの話 • オススメありますか? • 良い点/悪い点 • 重要視している所 73
バンダイナムコスタジオ流…とは • プロジェクトに決定権があり、多様性が特徴 • プロジェクトで最適化された結果 • これがベストではなく、日々改善中 • 情報交換して、Unityを使い倒しましょう! 74