Slide 1

Slide 1 text

20時間超の物語をVRで! 『ALTDEUS: Beyond Chronos』 の制作を支えた ”Uranus”の制作過程と機能紹介
 MyDearest株式会社 中地 功貴 / 下嶋 健司 / 増谷 海人

Slide 2

Slide 2 text

本資料について
 本資料は発表後すぐに SpeakerDeckにて公開いたします。 本講演に関するSNS投稿は大歓迎です。 #CEDEC2021 と #アルトデウスBC で ツイートしてもらえると嬉しいです! W IP

Slide 3

Slide 3 text

PV (動画)

Slide 4

Slide 4 text

VRインタラクティブストーリーアクション • 「VRゲームならではのインタラクションと物語 体験」を両立した作品 • 2020年12月リリース • Oculus / Steam / PSVRで発売中 🏅ファミ通・電撃ゲームアワード2020   アドベンチャー部門 最優秀賞 🏅Oculusストア内ユーザー評価 世界No.1    (Road to VR調べ) ALTDEUS: Beyond Chronos(アルトデウスBC)
 W IP

Slide 5

Slide 5 text

長編物語の制作を支えたイベントエディタ 『Uranus』の制作過程と機能について アルトデウスBCの20時間以上におよぶ長編の物語の制作は、前作 に当たる『東京クロノス』の開発時に生まれた"Uranus"というイベント エディタの存在によって支えられています。 本セッションでは、"Uranus"の制作過程と機能紹介を中心に、アルト デウスBCの制作過程を余すことなく紹介します。 本講演で話すこと
 W IP

Slide 6

Slide 6 text

1. Uranusの紹介
 2. Uranusの誕生と変遷
 3. シナリオデータの変換ワークフロー
 4. Uranus内部的な仕組み
 5. デバッグ機能
 6. CI環境
 アジェンダ
 W IP

Slide 7

Slide 7 text

登壇者紹介


Slide 8

Slide 8 text

登壇者について - 中地 功貴
 W IP W IP VRエンジニア 中地 功貴 / Nakaji Kohki 上級バーチャルリアリティ技術者 (日本VR学会認定) 著書: 技術評論社『VRエンジニア養成読本』共著 作品: 『Crevasse』『至近距離ガールVR』 2020年1月にMyDearestへ入社し、 『アルトデウス:BC』のインタラクション の実装全般とCI整備を担当 Twitter: @nkjzm

Slide 9

Slide 9 text

登壇者について - 下嶋 健司
 W IP W IP リードボードゲーマー 下嶋 健司 / Shimojima Kenji 2018年4月にMyDearestに入社し、 『東京クロノス』『アルトデウス:BC』 のリードプログラマー的な何かを務める。 個人製作も昔から継続してたりしてなかったり。 作品:『アニュビスの仮面』『ウルタールの化け猫』 『ジュン少年の事件簿』等 Twitter: @ookumaneko_XD

Slide 10

Slide 10 text

登壇者について - 増谷 海人
 W IP W IP 放浪エンジニア 増谷 海人 / Masutani Kaito 2018年にMyDearestへ入社し、 『東京クロノス』『アルトデウス:BC』 のプログラマーとして活躍。 幼少期からプログラミングに興味を持ち、 個人でのゲーム制作を日々続けている。 Twitter: @(休止中)

Slide 11

Slide 11 text

イベントエディタ”Uranus”で出来ることを、動 画で分かりやすく紹介します。 • Uranusとは • Uranusで作成したADVパートの紹介 • Uranusエディターの紹介 1. Uranusの紹介


Slide 12

Slide 12 text

• VRADVを作る為の システム
 
 • 会話を作る為の専 用エディター
 
 • GUIベースで誰でも 作れるのが目標
 Uranusとは?


Slide 13

Slide 13 text

Uranusで作成した シーンのデモ動画

Slide 14

Slide 14 text

Uranusエディターデモ動画


Slide 15

Slide 15 text

エディタ上のデモ動画

Slide 16

Slide 16 text

Uranus誕生までの経緯と、東京クロノスからアル トデウスBCへの変遷を紹介をします。 • シナリオエディタ作成の経緯 • Excelベースのプロトタイプ • Uranus ver 0.1が生まれるまで • Uranus ver 0.2で追加された機能 2. Uranusの誕生と変遷


Slide 17

Slide 17 text

Uranusが出来るまで
 東京クロノス~アルトデウスまで


Slide 18

Slide 18 text

作るきっかけ
 ~東京クロノス編~


Slide 19

Slide 19 text

会話メインでプレイ時間10時間以上


Slide 20

Slide 20 text

だが人数は少ない
 プロデューサー
 音楽
 ディレクター
 プログラマー


Slide 21

Slide 21 text

可能な限り効率を
 求める必要がある


Slide 22

Slide 22 text

楽に作れて調整しやすい
 開発環境を作ろう!


Slide 23

Slide 23 text

要素の洗い出し


Slide 24

Slide 24 text

• カメラ設定 • キャラ操作 • テキスト表示 • 背景指定 • サウンド指定
 最低限必要な要素の洗い出し


Slide 25

Slide 25 text

作らなくて良いなら
 作りたくない!


Slide 26

Slide 26 text

既存のシステム調査


Slide 27

Slide 27 text

• RPG等のゲームではよくある
 • 独自言語の場合も
 • 敷居が高い
 – 初心者の手は借りられない
 スクリプト言語


Slide 28

Slide 28 text

• NScripter、吉里吉里、等
 • 3D空間前提で使うのは試行錯誤が辛い
 • こちらも敷居が高い
 – 初心者の手は借りられない
 ノベルゲーム固有スクリプト


Slide 29

Slide 29 text

• GUIベースで制作
 • 方向性は近い
 • 3Dの敷居が高い
 – 初心者の手は借り られない
 ノベルゲーム開発ソフト
 https://b.tyrano.jp/
 https://tkool.jp/lngmv/ 


Slide 30

Slide 30 text

• Unityのエディター拡張で制作
 • Unityで完結するのは良い
 • 3Dの敷居が高い
 – 初心者の手は借りられない
 Unityアセット
 Fungus
 https://assetstore.unity.com/packages/tools/game-toolkits/fungus-3418 4
 宴
 https://assetstore.unity.com/packages/tools/game-toolkits/utage3-unit y-text-adventure-game-engine-version3-80727


Slide 31

Slide 31 text

中々これって言うのが
 無い・・・


Slide 32

Slide 32 text

じゃあ 作ろうか!

Slide 33

Slide 33 text

ゲーム業界皆大好き
 Excelベース
 (諸説あり)


Slide 34

Slide 34 text

宴に近い形式で試す


Slide 35

Slide 35 text

作ってみたプロトタイプ


Slide 36

Slide 36 text

結果・・・


Slide 37

Slide 37 text

「「「Excel辛い!!」」」


Slide 38

Slide 38 text

何が辛いか?


Slide 39

Slide 39 text

Excelを眺め続けるのが辛い


Slide 40

Slide 40 text

Excel→3D空間のイメージが難しい


Slide 41

Slide 41 text

Excel⇔VRの行き来が面倒


Slide 42

Slide 42 text

「 Excel見たくない・・・
 _:(´ཀ`」 ∠):_ 」


Slide 43

Slide 43 text

1フレーム内で完結する2Dゲームなら 想像が効かせ易いが


Slide 44

Slide 44 text

3D空間、かつVR内でやるにはイメージ と調整が難しい


Slide 45

Slide 45 text

初心者の手は
 借りられない


Slide 46

Slide 46 text

じゃどうしよう?


Slide 47

Slide 47 text

Unityのタイムラインは?


Slide 48

Slide 48 text

• 項目が多くなりそうで辛そう
 • 入力に合わせたテキストや演出に合わなさそう
 タイムライン感想
 https://docs.unity3d.com/ja/2018.4/Manual/TimelineSection.html 


Slide 49

Slide 49 text

初心者の手は
 借りられない


Slide 50

Slide 50 text

じゃどうしよう?


Slide 51

Slide 51 text

独自ツール作るか・・・


Slide 52

Slide 52 text

一回要望のヒアリング


Slide 53

Slide 53 text

• 基本的にはUnity内で完結したい
 • GUIベースが良い
 • その上でボタンポチポチするだけにしたい
 • 1テキストウィンドウ毎に演出を付けられる様にした い
 • 初心者の手を借りられるようにしたい
 ヒアリング結果


Slide 54

Slide 54 text

ツールのGUI調査


Slide 55

Slide 55 text

https://b.tyrano.jp/
 ティラノビルダー


Slide 56

Slide 56 text

素晴らしすぎる


Slide 57

Slide 57 text

これをUnityかつ
 VRADVに落とし込む


Slide 58

Slide 58 text

No content

Slide 59

Slide 59 text

No content

Slide 60

Slide 60 text

• Excelの仕組みのGUI化
 • 1個1個が「コマンド」
 • ボタン1個で追加
 • 上から順番に再生する
 • 選択したコマンドの状態をプ レビューしたい
 
 
 方向性


Slide 61

Slide 61 text

大体同じ方向性


Slide 62

Slide 62 text

作ってみた


Slide 63

Slide 63 text

No content

Slide 64

Slide 64 text

ここまでが前作
 東京クロノス


Slide 65

Slide 65 text

Uranusエディター 
 ver 0.2
 の機能詳細


Slide 66

Slide 66 text

イベント設定画面


Slide 67

Slide 67 text

No content

Slide 68

Slide 68 text

イベント引き継ぎ機能


Slide 69

Slide 69 text

• 尺の都合で会話を別ファイルで区切る時がある
 • その際、配置位置を前のイベントと合わせたい
 • それを手動でやるのはそこそこ面倒
 • 自動化最高
 イベント引き継ぎ機能


Slide 70

Slide 70 text

イベント引き継ぎ機能のデモ動画

Slide 71

Slide 71 text

プレビュー系


Slide 72

Slide 72 text

キャラ状態リスト
 選択したコマンド時のキャラ状態リスト


Slide 73

Slide 73 text

パラメーター
 シミュレーター


Slide 74

Slide 74 text

• 分岐のプレビューを手軽に確認したい
 • フラグや変数を変えると即座に反映したい
 • 選択肢の結果も手軽にプレビューしたい
 パラメーターシミュレーター


Slide 75

Slide 75 text

No content

Slide 76

Slide 76 text

シミュレーター結果がすぐに プレビューに反映されるデモ動画

Slide 77

Slide 77 text

改善方法


Slide 78

Slide 78 text

専用のslackチャンネル


Slide 79

Slide 79 text

気になる事や要望が あれば些細な事でも すぐ書いてください これを何度も呼びかける


Slide 80

Slide 80 text

何回も繰り返した事により
 意見を引き出せたが、
 まだまだ足りてはいなかった


Slide 81

Slide 81 text

Uranus Editorによりイベントシーンの 作成を比較的簡単かつ手軽にできた。 機能自体は改善を続けており、 今後もまた作り続ける予定ではあります 2. Uranusの誕生と変遷【まとめ】


Slide 82

Slide 82 text

長編シナリオのテキストを様々なデータ形式に 変換するまでのワークフローを紹介します。 • GSS(GoogleSpreadSheet)ベース • Doc→GSS→ゲーム用データ変換 • Unity側からデータ取得 • 台本作成のワークフロー 3. シナリオデータの変換ワークフロー
 W IP

Slide 83

Slide 83 text

Uranusへ持ってくるデータの話


Slide 84

Slide 84 text

表示されるテキストのデータ


Slide 85

Slide 85 text

データ変換の流れ
 テキストファイル GoogleDocument GoogleSpreadsheet ScriptableObject

Slide 86

Slide 86 text

● GAS(Google App Script)
 で変換
 ● 変換先はシナリオと
 イベントのベースになる
 「字コンテ」ファイル
 ● 書式ルールは大体
 クロノス準拠
 
 シナリオのGoogleSpreadSheet(GSS)化
 GoogleDocument (シナリオ) GoogleSpreadsheet (字コンテ)

Slide 87

Slide 87 text

No content

Slide 88

Slide 88 text

No content

Slide 89

Slide 89 text

セリフ コメント イベント区切り 選択肢 イベント毎に別シート

Slide 90

Slide 90 text

字コンテGSS爆誕


Slide 91

Slide 91 text

字コンテ?
 ● シナリオに合わせて演出指示等が
 書いてあるファイル
 
 ● シナリオは基本文字情報なのでそれのゲーム演出 への落とし込み
 
 ● 絵コンテの文字版


Slide 92

Slide 92 text

• シナリオ/イベント系のマスターデータ扱い
 
 • これを元に色々なデータ書き出す
 – テキスト一覧
 – イベントファイルのテンプレ
 – イベント遷移一覧
 – 選択肢データ
 – 収録台本
 字コンテGSS


Slide 93

Slide 93 text

字コンテGSS テキスト一覧 演出遷移一覧 イベントファイルの元(沢山) 台本(キャラ毎と通し)

Slide 94

Slide 94 text

マスターデータ運用
 の理由


Slide 95

Slide 95 text

遷移の流れを追える、
 かつ設定を自動化
 したかった


Slide 96

Slide 96 text

イベントファイルに
 テキストが既に入ってるテン プレが欲しい


Slide 97

Slide 97 text

台本制作の
 自動化がしたい


Slide 98

Slide 98 text

書き出したデータ例


Slide 99

Slide 99 text

テキストデータ


Slide 100

Slide 100 text

イベント遷移


Slide 101

Slide 101 text

イベントファイル


Slide 102

Slide 102 text

Unityから
 GSSデータの獲得


Slide 103

Slide 103 text

Unity Google App Script リクエスト ダウンロード Scriptable Objectに変換

Slide 104

Slide 104 text

GAS側のエクスポート用意
 ● リクエストが飛んで来たらデータを変換して渡す
 
 ● イベントファイルと一部その他はCSV形式
 
 ● それ以外は基本JSON形式


Slide 105

Slide 105 text

実際にエディターで落とす


Slide 106

Slide 106 text

DL後に変換して保存


Slide 107

Slide 107 text

台本作成


Slide 108

Slide 108 text

通し台本


Slide 109

Slide 109 text

抜き台本


Slide 110

Slide 110 text

台本のテンプレートファイル用意


Slide 111

Slide 111 text

台本作成時の流れ
 セリフとコメント抜出 テンプレートをコピー 字コンテGSS 台本テンプレ 抜き出したテキストを 入れ込む 新規台本 GASでゴニョゴニョする


Slide 112

Slide 112 text

フォーマット
 イベント毎に区切り、概要入れる


Slide 113

Slide 113 text

抜きと通しの差
 ● 特定キャラ 
 ● コメントふくまない
 ● 全キャラ
 ● コメントふくむ
 抜き台本
 通し台本
 物量以外にはそんなに差は無い*


Slide 114

Slide 114 text

問題点


Slide 115

Slide 115 text

GSSのフォントが
 超限定的


Slide 116

Slide 116 text

縦文字が死


Slide 117

Slide 117 text

No content

Slide 118

Slide 118 text

変換時に縦に見える様に フォーマットは
 して見た・・・


Slide 119

Slide 119 text

限界がありすぎる


Slide 120

Slide 120 text

結果起きた事
 字コンテGSS 新規台本 Excelで台本編集 形式指定 ダウンロード

Slide 121

Slide 121 text

orz


Slide 122

Slide 122 text

GASの最大稼働時間は 30分
 (GSuiteの場合)


Slide 123

Slide 123 text

アルトデウス:BCは
 シナリオが膨大


Slide 124

Slide 124 text

ふくれ上がると
 予想した予想量を
 圧倒的に上回る


Slide 125

Slide 125 text

台本変換が30分で
 終わらない orz


Slide 126

Slide 126 text

作る台本を
 分割して対応


Slide 127

Slide 127 text

1/3 2/3 3/3

Slide 128

Slide 128 text

orz


Slide 129

Slide 129 text

想定以上の物量時の
 事前測定はやりましょう
 *当たり前の事をちゃんとやれ事案


Slide 130

Slide 130 text

GSSベースの仕組み
 全体的に良かった所


Slide 131

Slide 131 text

共有と同時編集が
 楽だった


Slide 132

Slide 132 text

シナリオ、マップ、
 遷移先がセットに
 なってるので追いやすい


Slide 133

Slide 133 text

Unityからエディターでポ チっとして更新は楽


Slide 134

Slide 134 text

台本自動作成は人権


Slide 135

Slide 135 text

台湾にいながら
 システム作れた


Slide 136

Slide 136 text

GSSベースの仕組みを作る事で共有可能な色 んなデータの元を用意し、作業の効率化を達成 出来た • GSSのマスターデータを作成する • マスターデータからゲームデータに変換 • Unity側からデータ取得 • 台本作成の自動化 3. シナリオデータの変換【まとめ】


Slide 137

Slide 137 text

生成された演出データがゲーム上 で動作するしくみを紹介します。 • Uranus の中身 • メインルーチンの実装 • コマンドの実装 4. Uranus内部的な仕組み


Slide 138

Slide 138 text

Uranus の中身
 • 役目:「演出ファイル」と「コマンド」を
 順番に実行する
 ○ 演出ファイルには「コマンド」のリストがある
 ■ 上から順番にコマンドを実行する
 ○ 演出ファイルを実行すると結果が出力される
 ■ 結果によって次の演出ファイルを決定


Slide 139

Slide 139 text

メインルーチンの実装
 ゲームスタート
 ↓★↓
 演出データロード & ロード待機
 ↓
 必要なアセットをロード & ロード待機
 ↓
 演出実行 & 終わるまで待機 
 ↓
 演出後処理、次の演出データを決定 
 ↓
 ★に戻る…


Slide 140

Slide 140 text

メインルーチンの実装
 • 「処理の待機」が全体的に多い
 • 待っている間、別の処理もしたい (非同期処理)
 ■ ロード画面の表示
 ■ プレイヤーの入力受け付け
 ■ オブジェクトの動作


Slide 141

Slide 141 text

メインルーチンの実装
 • Unity C#のプログラムコードは基本同期処理
 ■ 関数上の手続き:1フレーム内の処理
 ■ 手続きをそのまま書くことはできない


Slide 142

Slide 142 text

メインルーチン (前作の場合)
 • Update () 上で擬似的な非同期処理
 ○ 1フレームごとに何を実行するか分岐させる


Slide 143

Slide 143 text

メインルーチン (前作の場合)
 • Update ()
 ○ もし演出ロード中なら
 ■ 演出ロード完了をチェック
 ■ ロード画面処理
 ○ そうでないなら
 ■ もしコマンドが処理待ちフラグがONなら
 – コマンドの処理待ち
 ■ そうでないなら、以下ループ
 – 次のコマンドを実行する
 – もしそのコマンドが処理待ちを要求したら
 » コマンド処理待ちフラグをON、ループ終了
 – もし次のコマンドがなかったら (演出終わり)
 » 演出をロード、ループ終了
 処理順? どこから始まる??

Slide 144

Slide 144 text

メインルーチン (前作の場合)
 • Update () 上で擬似的な非同期処理
 ○ 1フレーム単位で何をするか書かないといけない
 ■ 処理順がコード上で読みにくい
 ■ メンテナンス性に影響
 ○ コマンド処理は待機あり・なし対応のために
 条件分岐が複雑化


Slide 145

Slide 145 text

ALTDEUS でのメインルーチン
 • async / await ベースの非同期処理
 ○ await 処理関数 = 処理が終わるのを待つ
 ○ UniTask を採用
 ■ Unity 上で async/await ベースの記述を
 可能にするライブラリ
 ■ Coroutine と似た記述が可能で、より高機能


Slide 146

Slide 146 text

メインルーチンの実装
 • async メインルーチン
 ○ while (次の演出がある)
 ■ await 演出データロード
 ■ await 必要なアセットロード
 ■ 演出結果 = await 演出実行
 – await コマンド演出処理
 – return 演出結果
 ■ 演出結果に応じて次の演出を決定


Slide 147

Slide 147 text

メインルーチンの実装
 ゲームスタート
 ↓
 演出データロード
 ↓
 アセットロード
 ↓
 演出実行
 ↓
 次の演出データロード
 ↓
 …
 ←これと同じ順番で処理を記述できた
 
 ● 見やすい
 ● コードメンテナンスしやすい
 ● await 中は他の処理を並列で実行で きる


Slide 148

Slide 148 text

• コマンドが行う処理
 ○ 演出ロード時
 ■ ロード処理
 – 演出に必要なアセットなどを登録
 ○ 演出中
 ■ 演出処理
 – コマンドを非同期で実行
 ■ ルーチン処理
 – 単純な順番以外で実行する場合の処理
 コマンドの実装


Slide 149

Slide 149 text

演出中のコマンド処理
 • while (次のコマンドがある)
 ○ await コマンドの演出処理
 ○ IF
 ■ コマンドが単純な遷移 -> 一つ下のコマンドへ
 ■ 複雑な遷移 -> コマンドのルーチン処理


Slide 150

Slide 150 text

• テキスト表示コマンド
 ○ ロード処理
 ■ テキストIDをロードリストに登録
 ○ 演出処理
 ■ ボイスを再生・リップシンク再生
 ■ テキストを表示
 ■ await プレイヤーの入力を待機
 コマンド実装の一例


Slide 151

Slide 151 text

• 選択肢コマンド
 ○ 演出処理
 ■ await 画面を表示、アニメーション待機
 ■ 選択肢を選択可能にする
 ■ await 選択肢が決定されるのを待機
 ○ ルーチン処理
 ■ 選択結果に対応するラベルへジャンプ
 コマンド実装の一例


Slide 152

Slide 152 text

今回の実装でわかったこと
 • async/await の利点
 ○ 非同期処理と演出処理の相性が非常に良い
 ■ 待機を含めてその手続きを順に書くだけ
 ■ 可読性が高い → メンテナンスしやすい


Slide 153

Slide 153 text

今回の実装でわかったこと
 • async/await の欠点
 ○ 中断処理がかなり面倒
 ■ async/await では特殊な例外で止める
 ■ Coroutine より複雑
 
 


Slide 154

Slide 154 text

今回の実装でわかったこと
 • プログラマー間での知見共有が重要
 ○ async/await は比較的最近の記法
 ○ 利用範囲がかなり広い
 
 


Slide 155

Slide 155 text

Uranusエディターで作られた 演出の実行方法を紹介しました • async/await 形式の実装で 演出の手続きをそのまま書ける • 扱いが難しい箇所もあり 情報共有が大切 4. Uranus内部的な仕組み【まとめ】


Slide 156

Slide 156 text

実機での確認作業の効率化を図って作成したデ バッグ機能について紹介します。 • ゲーム内表示 • ログ表示とログ送信 • デバッグメニュー – イベント再生 – フラグ変指数編集 – 描画設定 – リプレイ 5. デバッグ機能


Slide 157

Slide 157 text

ゲーム内表示


Slide 158

Slide 158 text

No content

Slide 159

Slide 159 text

FPS 背景 FPS

Slide 160

Slide 160 text

イベントツール

Slide 161

Slide 161 text

現在の情報 背景

Slide 162

Slide 162 text

ログ表示


Slide 163

Slide 163 text

No content

Slide 164

Slide 164 text

No content

Slide 165

Slide 165 text

エラーログはslackに送信
 ● 例外情報
 ● アプリ情報
 ● イベントID
 ● スタックトレース
 
 等々を各ハードの実機から 送っている


Slide 166

Slide 166 text

デバッグメニュー


Slide 167

Slide 167 text

デバッグメニューのデモ動画

Slide 168

Slide 168 text

イベント再生機能のデモ動画

Slide 169

Slide 169 text

フラグ/変数編集
 フラグ・変数切替のデモ動画

Slide 170

Slide 170 text

描画設定
 描画設定切り替えのデモ動画 実機上で解像感を確認できる様子

Slide 171

Slide 171 text

リプレイ
 ● 記録開始で保存開始
 ● 手・頭・入力を記録
 ● イベント毎にファイル 保存
 ● リプレイ再生で記録した位 置と入力で強制上書き
 ● バグの再現用


Slide 172

Slide 172 text

・・・基本使われなかった


Slide 173

Slide 173 text

使われなかった理由
 • 認知が少なかった
 • 間違えて被ってる最中に再生すると酔う
 • 放置してしまうとデータ量が膨大になる
 • 外部テスターに強要は出来ない


Slide 174

Slide 174 text

VR内で使えるデバッグメニューと機能を用意した おかげで実機とエディター両方で楽に テストできる環境を用意できた 5. デバッグ機能【まとめ】


Slide 175

Slide 175 text

VRゲームならでは少し特殊なCI環境と、 その仕組みについて紹介します。 • ビルド環境 • 自動通しプレイ – 東京クロノスの場合 – アルトデウス:BCの場合 6. CI環境
 W IP

Slide 176

Slide 176 text

東京クロノスの時の問題点
 設定の切り替えを各プログラマのローカル環境で行っていた ● 前回うまくいったビルド設定が分からなくなる ○ 様々なビルド設定が存在した(Defineの切り替えも併用) ■ Oculus Go (Android) ■ Oculus Quest (Android) ■ Oculus Rift (PC) ■ Steam (PC) ■ PlayStation VR (PS4) ● ローカルの意図しない変更がビルドに含まれてしまう ● デバッグのたびに手動で端末にインストールする必要がある

Slide 177

Slide 177 text

自動ビルド
 アルトデウス:BCでは自動ビルドの仕組みを導入! ● GitHubにpushするとJenkinsのジョブ(処理の単位)が動く ○ ジョブが動くと自動的にビルドとテストが実行 ■ プラットフォーム毎 ■ 設定毎(debud/ staging / release) ● ビルド失敗→ ビルドログをSlackに通知 ● ビルド成功→ NASと各プラットフォームにアップロード ➡ Pushした数分後にVRHMD実機で動作確認が可能に!

Slide 178

Slide 178 text

自動ビルド
 成功 失敗 NAS Polling push 社内の物理マシン

Slide 179

Slide 179 text

Jenkinsの流れ
 ● 定期的にPollingして実行 ● CLIでUnityのメソッドを呼べる ○ ビルドとテストを実行 ○ ● 結果に応じて後続ジョブが実行 ● Slackに通知する(右図) push通知 ビルド結果通知 (Rift/Dev) アップ完了通知 ビルド結果通知 (Quest/Dev) アップ完了通知

Slide 180

Slide 180 text

ビルドスクリプト
 Quest/Devの設定 ● ジョブ毎のビルド設定機能 ○ ScriptableObjectで実現 ○ Platform / Symbols/ Build Optionsなど ● エディタ上でも設定の切り替え等が可能

Slide 181

Slide 181 text

ビルド後の処理(アップロード等)
 ● 後続ジョブを実行してバッチ処理を叩く ○ Parameterized Triggerプラグインで引数を渡す ● Oculusだとコマンドラインツールが提供されている

Slide 182

Slide 182 text

自動通しプレイ


Slide 183

Slide 183 text

東京クロノスの時


Slide 184

Slide 184 text

自動通しプレイ


Slide 185

Slide 185 text

再生して放置


Slide 186

Slide 186 text

選択肢は?


Slide 187

Slide 187 text

個別ルート 選択肢 You did it

Slide 188

Slide 188 text

エンディング 選択肢 エンディング

Slide 189

Slide 189 text

選択肢 本ルート 選択肢に戻る

Slide 190

Slide 190 text

再生して放置


Slide 191

Slide 191 text

問題点


Slide 192

Slide 192 text

ハードの自動通しテスト
 ● 位置と回転が物理
 ● 動かすゲームの場合困る


Slide 193

Slide 193 text

問題点2


Slide 194

Slide 194 text

複雑な分岐の
 自動通しテスト


Slide 195

Slide 195 text

完全なネタバレ


Slide 196

Slide 196 text

選 選 選 選 選

Slide 197

Slide 197 text

選 選 選 選 選 選 選 選 選 選

Slide 198

Slide 198 text

問題点3


Slide 199

Slide 199 text

手動で更新と起動を
 する必要がある


Slide 200

Slide 200 text

自動テストを開始する手順
 1. gitプル
 2. Unity起動
 3. Unityで再生
 4. デバッグメニューでテスト開始


Slide 201

Slide 201 text

わざわざ操作する
 必要がある


Slide 202

Slide 202 text

アルトデウス:BC
 の場合


Slide 203

Slide 203 text

自動通しプレイを自動的に起動する
 バッチでNAS上にある最新ビルドを定期的に自動起動 ➡ Gitへのpushから自動通しプレイまでが完全自動化 NAS Polling push 社内の物理マシン 社内の物理マシン Upload 自動起動

Slide 204

Slide 204 text

自動プレイ ● バッチでNAS上にある最新ビルドを定期的に自動起動 ○ 3倍速で自動進行してクリアまで進めてくれる ● プレイログ/クリアログをSlackに通知 ● プレイの様子をOBSでストリーミング配信 ○ 配信サービスの規約的にOKであるか確証がないので念のため伏せる ○ Slackで「配信くれ」というとURL教えてくれる ~6:30 ➡ 常に進行不能等の不具合が、自動的に早期に検知できる ⬅Oculus Rift 自動プレイの様子 常に最新ビルドの 自動通しプレイが走っている

Slide 205

Slide 205 text

バッチの定期実行 ● バッチをループ ● 一定時間毎に プロセス起動と終了 自動プレイモード起動 • -auto引数を追加 (独自実装) • プレイスピード指定 自動起動の仕組み


Slide 206

Slide 206 text

詳細は下記の記事を参照してください!

Slide 207

Slide 207 text

自動通しプレイの
 ゲーム側対応


Slide 208

Slide 208 text

自動通しプレイに必要な要素
 • 会話進行
 • 選択肢選択
 • 探索
 • ハンドインタラクション全般
 • 全エンディング踏破


Slide 209

Slide 209 text

自動進行の流れ
 ソフト起動 自動進行オン 差し込み タイトル 自動進行 Jenkins経由
 Jenkinsから引数を 受けって起動
 自動進行中
 全場面自動進行


Slide 210

Slide 210 text

会話進行
 ● 基本決定ボタン連打
 ● 入力機能にデバッグ機能 として押された判定を 挿し 込めるように
 ● 会話中は常に挿し込んで 行く


Slide 211

Slide 211 text

会話進行 - 強制入力
 VRInput Uranus Input DebugInput 入力来たら通知飛ばす 
 Uranus上の入力
 デバッグの入力
 強制入力
 入力来たら通知飛ばす 
 入力に反応

Slide 212

Slide 212 text

自動選択肢
 ● ランダムと特定エンド向けの選 択2種類
 ● 会話と同じで強制入力を 入 れ込む
 ○ 上下入力
 ○ 決定入力
 ● 上下移動はランダム回数 行 う


Slide 213

Slide 213 text

No content

Slide 214

Slide 214 text

特定エンドに向け自動選択肢
 ● 各選択肢で選ぶ選択の一覧 データを作成
 ● 基本はただのインデックスの 数値
 ● 複数パターンを作って特定 ルートを辿る自動プレイを作 れるように


Slide 215

Slide 215 text

自動探索
 ● 基本ランダム
 ● 全ての選択出来る物から 一つを選択する
 ● 総当たりで潰していく


Slide 216

Slide 216 text

No content

Slide 217

Slide 217 text

自動インタラクション


Slide 218

Slide 218 text

ハードの自動通しテスト
 ● 位置と回転が物理
 ● 動かすゲームの場合困る


Slide 219

Slide 219 text

自動で動かすハードがあ れば・・!


Slide 220

Slide 220 text

ハードは
 流石に作れない・・・


Slide 221

Slide 221 text

ハードの位置・回転適用 後に強制的に移動させる


Slide 222

Slide 222 text

位置回転入力の更新
 手と頭の反映 自動で現在の 手と頭の位置指 定 HMDとコント ローラーの 更新適用 ハード毎の入力
 実際に見える要素
 自動進行
 手と頭の反映 HMDとコント ローラーの 更新適用 ハード毎の入力
 実際に見える要素
 通常


Slide 223

Slide 223 text

自動インタラクションのデモ動画

Slide 224

Slide 224 text

インタラクションの種類は色々


Slide 225

Slide 225 text

同じパターンで流用できる
 物はそれで流用


Slide 226

Slide 226 text

それ以外は・・・


Slide 227

Slide 227 text

根性!
 (個別実装)


Slide 228

Slide 228 text

インタラクション毎にインタ ラクションの種類を送って いた


Slide 229

Slide 229 text

インタラクション開始時の流れ
 インタラクショ ン状態開始 インタラクショ ン特有処理開 始 自動進行 インタラクショ ン処理 Jenkins経由
 Jenkinsから引数を 受けって起動
 通知を飛ばす
 手や頭の移動

Slide 230

Slide 230 text

自動でクリアしてくれるシ ステムは出来た


Slide 231

Slide 231 text

一つ問題点


Slide 232

Slide 232 text

Oculus Riftの仕様上
 一定時間動かないと
 スタンバイになる


Slide 233

Slide 233 text

解決策


Slide 234

Slide 234 text

自動振動君 →スマホのアラームで 時々振動させて防ぐ荒業

Slide 235

Slide 235 text

エラーログはslackに送信


Slide 236

Slide 236 text

クリアログをSlackに送信
 ● クリア時間
 ● 周回数
 ● アプリ情報
 ● フラグ・変数の状態一覧


Slide 237

Slide 237 text

修正がすぐに実機で確認できて便利だった • 修正→確認のサイクルが頻繁な テスト期間は特に有益だった 自動プレイ + Slack通知が仕組みよかった • Slackで自動プレイの進行状況がわかる • 最後までプレイできる状態が 常に担保されているのは精神的に良い 6. CI環境【まとめ】


Slide 238

Slide 238 text

• 物語VR作品特化のUranusの仕組みで、少人 数ながら効率的な開発を実現できた
 • 演出の手続き的処理の実装が
 async/await 形式と相性がよかった
 • デバッグ機能/CI環境で、作業の効率化とイ テレーションの高速化が図れた
 本セッションのまとめ
 W IP

Slide 239

Slide 239 text

最後に


Slide 240

Slide 240 text

なんでこんな話をしたか


Slide 241

Slide 241 text

もっとストーリー系
 VRゲームが遊びたい!


Slide 242

Slide 242 text

ご静聴ありがとうございました!