スマホを実際に背後へ向けてフラッシュで撃退する、ジャイロ操作のウォーキングホラー。

夜道の帰り道。背後の音に、振り返るべきか。
Androidのジャイロセンサーとライトを使ったウォーキングホラーゲーム。プレイヤーは夜道を歩いて家を目指す。背後から音が聞こえたとき、それがただの環境音なら無視して歩き続け、異常な音なら実際にスマホを背後へ向けてフラッシュを焚いて撃退する。
CyberAgent主催のインターン「Proto Sprint League」にて、3人チーム・実質2日間の開発期間で制作した。お題は「かえる」。帰る(家に向かう)と振り返る(コア操作)の二重の意味でお題を回収し、モチーフとして飾るのではなくゲームの目的と操作そのものをお題に一致させた。
制限時間内に判断できなければ「撮影しなかった」と同じ扱いになる。
このゲームの心臓部。実装・演出・音素材はすべてここを基準に作った。
| 鳴った音 | 行動 | 結果 | ペナルティ |
|---|---|---|---|
| 異常音 | 振り返って撮影 | 撃退成功 | 電池消費のみ |
| 異常音 | 振り返らない/時間切れ | ゲームオーバー | 致命 |
| 異常音 | 振り返ったが撮影しない | ゲームオーバー | 致命 |
| 環境音 | 振り返って撮影 | 空振り | 電池を大きく失う |
| 環境音 | 振り返って戻る | 正解 | ライト分の電池 |
| 環境音 | 振り返らない | 正解 | なし |
ペナルティが非対称であることが重要。「振り返らない」は致命傷になりうるので、プレイヤーは迷ったら振り返りたくなる。しかし振り返れば必ず損をする。この引っ張り合いが緊張を生む。
スマホをコントローラーとしてではなく、作中のスマホそのものとして扱った。
技術力とは重厚な設計を導入することではなく、チーム構成と期間に対して設計の重さを選ぶ判断そのものだと実感した。
一方で、良い設計判断も全員の共通認識になっていなければ摩擦を生む。実際に開発中は認識のずれによる衝突が発生した。設計を決めることと同じくらい、決めたことをチームで揃え続けるプロセスが重要だと学んだ。
また、メンバーが外部ライブラリを使わない前提だったため、UniTaskなど普段使い慣れた技術をどこまで持ち込むかの塩梅が難しかった。個人の技術的な引き出しとチーム全体の習熟度のバランスを取る力は、今後の課題として明確になった。
2日間の開発で最も危険なのは「Android実装が終わるまでロジックが書けない」という直列化。そこで入出力をインターフェースで切り出した。
Android層 ──IPlayerInput──▶ ゲームロジック層 ──公開イベント──▶ UI層
◀─IFeedbackPresenter─
IPlayerInput(IsTurnedBack / ShutterDown)に対し、実機用のGyroInputとEditor用のKeyboardInputを用意。Android実装の完成を待たずロジックを完成まで持っていき、当日は実機実装を差し込むだけにしたIFeedbackPresenter(SetLight / Flash / Vibrate)も同様に抽象化。実機LEDが未完成でも、Editorの白フラッシュ実装のままゲームは完成させられる普段使っているR3・DIコンテナ・汎用ステートマシンは、今回あえて採用していない。
短期ハッカソンで求められるのは長期運用を見据えた堅牢な設計ではなく、チーム全員が同じ認知コストで触れる設計だと判断した。境界だけをインターフェースで固め、その内側の実装は各担当の裁量に任せる。設計書にも「重厚な設計を目指すのではなく、期間内で完成させるために構造として取り組みやすい環境を目指す」と明記した。
企画が成立するために絶対に守るべき条件を、実装前にレビュー項目として言語化した。
特に「靄の出し分け防止」は、UIへ通知するイベントOnAimStartedにあえて引数を持たせないことで構造的に不可能にした。ルールをドキュメントで守らせるのではなく、型で守らせる判断。
2日目の午後はバランス調整に充てる前提だったため、判断猶予・イベント間隔・抽選率・日別難度・電池消費量などをScriptableObjectへ外出しし、コードを触らず調整できる状態にした。
本編前に約30秒のDay 0を置き、環境音と異常音の両方を体験させる。汎用ステージシステムは作らず、IDaySequencerの別実装(TutorialSequencer)として固定シーケンスを供給する構成にしたため、GameManager側の分岐は最小限に収まった。
初日のうちに「説明なしでルールが伝わるか」の初見実機テストを実施し、見つかった最大の問題を1件だけ直して再プレイするというゲートを設けた。