成果物一覧に戻る
ウォーキングホラーゲーム2026/08チーム開発(3人)

そろそろ帰ろう

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

そろそろ帰ろう

概要

夜道の帰り道。背後の音に、振り返るべきか。

Androidのジャイロセンサーとライトを使ったウォーキングホラーゲーム。プレイヤーは夜道を歩いて家を目指す。背後から音が聞こえたとき、それがただの環境音なら無視して歩き続け、異常な音なら実際にスマホを背後へ向けてフラッシュを焚いて撃退する。

CyberAgent主催のインターン「Proto Sprint League」にて、3人チーム・実質2日間の開発期間で制作した。お題は「かえる」。帰る(家に向かう)と振り返る(コア操作)の二重の意味でお題を回収し、モチーフとして飾るのではなくゲームの目的と操作そのものをお題に一致させた。

コアループ

  1. 歩く — 正面を向いている間だけ家に近づく。進行は距離ではなく固定時間で管理
  2. 聞く — ランダムなタイミングで背後から音が鳴る。環境音か、異常音か
  3. 第1判断 — 振り返るかどうか。振り返るとライトが点き、背後の音がはっきり聞こえる。ただし点灯中は電池が減り続ける
  4. 第2判断 — 撮るかどうか。確かめてから決められるが、確かめている間もコストは支払っている

制限時間内に判断できなければ「撮影しなかった」と同じ扱いになる。

判断の4象限

このゲームの心臓部。実装・演出・音素材はすべてここを基準に作った。

鳴った音行動結果ペナルティ
異常音振り返って撮影撃退成功電池消費のみ
異常音振り返らない/時間切れゲームオーバー致命
異常音振り返ったが撮影しないゲームオーバー致命
環境音振り返って撮影空振り電池を大きく失う
環境音振り返って戻る正解ライト分の電池
環境音振り返らない正解なし

ペナルティが非対称であることが重要。「振り返らない」は致命傷になりうるので、プレイヤーは迷ったら振り返りたくなる。しかし振り返れば必ず損をする。この引っ張り合いが緊張を生む。

実機を使い切る設計

スマホをコントローラーとしてではなく、作中のスマホそのものとして扱った。

  • 振り返る操作は端末を実際に背後へ向けるジャイロ入力
  • ライトは端末のLEDが実際に点灯する
  • 撃退のフラッシュも実機の発光
  • 電池はゲーム内リソースであり、暗い部屋でプレイすると画面の外まで演出が届く

チーム開発で得た学び

技術力とは重厚な設計を導入することではなく、チーム構成と期間に対して設計の重さを選ぶ判断そのものだと実感した。

一方で、良い設計判断も全員の共通認識になっていなければ摩擦を生む。実際に開発中は認識のずれによる衝突が発生した。設計を決めることと同じくらい、決めたことをチームで揃え続けるプロセスが重要だと学んだ。

また、メンバーが外部ライブラリを使わない前提だったため、UniTaskなど普段使い慣れた技術をどこまで持ち込むかの塩梅が難しかった。個人の技術的な引き出しとチーム全体の習熟度のバランスを取る力は、今後の課題として明確になった。

技術的こだわり

3人が互いを待たない層分離

2日間の開発で最も危険なのは「Android実装が終わるまでロジックが書けない」という直列化。そこで入出力をインターフェースで切り出した。

Android層  ──IPlayerInput──▶  ゲームロジック層  ──公開イベント──▶  UI層
           ◀─IFeedbackPresenter─
  • IPlayerInputIsTurnedBack / ShutterDown)に対し、実機用のGyroInputとEditor用のKeyboardInputを用意。Android実装の完成を待たずロジックを完成まで持っていき、当日は実機実装を差し込むだけにした
  • IFeedbackPresenterSetLight / Flash / Vibrate)も同様に抽象化。実機LEDが未完成でも、Editorの白フラッシュ実装のままゲームは完成させられる
  • 振り返り閾値の保持はAndroid層に置いた。閾値調整は実機を持っている担当者が自分の手元だけで完結できるべきだと判断したため
  • UI担当向けにInspectorから全イベントを手動発火できるデバッグパネルを事前に用意し、ロジック完成待ちで演出制作が止まらない状態を作った

設計の重さを意図的に選ぶ

普段使っているR3・DIコンテナ・汎用ステートマシンは、今回あえて採用していない。

短期ハッカソンで求められるのは長期運用を見据えた堅牢な設計ではなく、チーム全員が同じ認知コストで触れる設計だと判断した。境界だけをインターフェースで固め、その内側の実装は各担当の裁量に任せる。設計書にも「重厚な設計を目指すのではなく、期間内で完成させるために構造として取り組みやすい環境を目指す」と明記した。

崩れてはいけない不変条件の明文化

企画が成立するために絶対に守るべき条件を、実装前にレビュー項目として言語化した。

  • 正面を向いている状態では靄を表示しない(振り返る意味が消えるため)
  • 靄を音の種別で出し分けない(第2判断が音から視覚に置き換わるため)
  • 靄と音の強調にフェードを入れる(チラ見が最小コスト戦法になるため)
  • 判定ウィンドウだけは姿勢によらず実時間で減らす(振り返っている間だけ猶予が延びるため)

特に「靄の出し分け防止」は、UIへ通知するイベントOnAimStartedあえて引数を持たせないことで構造的に不可能にした。ルールをドキュメントで守らせるのではなく、型で守らせる判断。

当日調整を数値だけで回す

2日目の午後はバランス調整に充てる前提だったため、判断猶予・イベント間隔・抽選率・日別難度・電池消費量などをScriptableObjectへ外出しし、コードを触らず調整できる状態にした。

説明文を読ませないチュートリアル

本編前に約30秒のDay 0を置き、環境音と異常音の両方を体験させる。汎用ステージシステムは作らず、IDaySequencerの別実装(TutorialSequencer)として固定シーケンスを供給する構成にしたため、GameManager側の分岐は最小限に収まった。

初日のうちに「説明なしでルールが伝わるか」の初見実機テストを実施し、見つかった最大の問題を1件だけ直して再プレイするというゲートを設けた。

担当した作業

  • ゲームロジック層の設計・実装(進行 / 4象限判定 / 電池 / 状態管理 / 日数進行)
  • レイヤー分離とインターフェース設計、クラス設計書の作成
  • IPlayerInput / IFeedbackPresenter の定義と、Editor用代替実装
  • ScriptableObjectによるパラメータ外部化とレベルデザイン
  • ゲームバランス調整、ゲームループのデバッグ
  • 企画・スケジュール・設計ドキュメントの整備(Notion)

スクリーンショット

そろそろ帰ろう screenshot 1
そろそろ帰ろう screenshot 2