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

【Unite Tokyo 2019】バンダイナムコスタジオ流Unityの使い方