過去の自分の移動と操作をEchoとして再生し、現在の自分と協力して仕掛けを解くUnity製3Dパズルゲーム。
ECHO//SHIFTは、感圧板、バッテリー、電源ソケット、ドアを複数のループに分けて操作する個人制作のプロトタイプです。最大3体のEchoが記録済みの行動を同時に再生し、現在のプレイヤーがその結果を利用してゴールを目指します。
| 項目 | 内容 |
|---|---|
| ジャンル | 見下ろし型3Dタイムループパズル |
| ゲームエンジン | Unity 6000.4.6f1 / Universal Render Pipeline 17.4.0 |
| 開発言語 | C# |
| 対応環境 | Windows x86_64 |
| 開発形態 | 個人制作。仕様、設計、実装、検証、プレイテストを一貫して管理 |
| 開発期間 | 2026-07-19〜2026-08-09 |
| 現在の状態 | プレイ可能なプロトタイプ。ゲームプレイと回帰テストを検証済み |
記録した行動がEchoとして再生され、現在のプレイヤーと感圧板、バッテリー、ドアを連携して操作する流れを通常速度でまとめた50秒のプレイ動画です。
- 現在のプレイヤーで移動や装置操作を記録します。
Rまたは制限時間でループを終了すると、記録がEchoになります。- Echoに感圧板の保持やバッテリーの運搬・挿入を任せ、現在のプレイヤーで開いたドアを通過します。
- セクション3ではEcho 1とEcho 2に異なる役割を記録し、3体の状態を連携させます。
個人制作として、ゲームデザイン、C#によるリプレイ/インタラクション実装、Unity Editor上のシーン生成、UI・音響・VFX、テストとプレイテストを担当しました。
リプレイは60 Hzの明示的なfixed tickで進みます。各フレームは入力と期待する位置・姿勢を保持し、ループ確定後は変更しません。既存のEchoは新しいループの開始時にtick 0へ戻り、プレイヤーと同じ移動処理で再生します。記録が短い場合は記録済みの範囲だけを再生し、最後の位置・姿勢で停止します。
移動だけでなく、バッテリーの取得と電源ソケットへの挿入も記録します。インタラクションではシーンに保存したStable IDを参照し、近くにある別の対象へ置き換えません。これにより「過去の自分がどの装置を操作したか」をリプレイ中も一意に保ちます。
SimulationClockとLoopDirectorで、入力、移動、物理同期、インタラクションの解決、ドア状態の確定、位置・姿勢の記録を明示的なtick順に分離しました。- プレイヤーとEchoは互いに物理衝突せず、環境には衝突し、感圧板とゴールの判定には反応するレイヤー構成です。
- 実際のシーンを自動完走させ、最大Replay Drift
0 mを計測しています(許容値0.05 m)。
- 移動フレームとは別に、成功したインタラクションだけをtick、操作種別、Stable ID、検証位置として記録します。
- バッテリーをキャラクター階層の子にするとEchoの破棄時にバッテリーまで失われる問題があったため、所有状態を独立させ、Carry Socketの位置・姿勢だけを追従する構造へ変更しました。
- 対象の消失、重複所有、ループのリセット、上限を超えたEchoの削除を含むEditMode/PlayModeテストで回帰を防いでいます。
- カメラ、HUD、一時停止、チュートリアル、ロボットの姿勢、音響・VFXは、fixed tickによるリプレイやColliderを変更しない表示・演出部分として実装しています。
- プレイテストと画面確認で見つかったカメラ切れ、仮UI、T-pose、浮遊装飾、過剰なVFXをシーン生成処理から修正し、同じ問題が再発しないようテストを追加しました。
- シーン生成、レイヤー設定、Stable ID検証、Build Settings、キャプチャ、WindowsビルドをEditorコードから再現できます。
- シーン生成処理が本番アセットを意図せず再保存する問題に対し、生成前後のハッシュ確認を追加し、想定外の差分がある場合は処理を停止するよう修正しました。
- Runtime、Editor、EditModeテスト、PlayModeテストはAssembly Definitionで分離しています。
- EditMode
151/151、PlayMode131/131が成功。 - プロジェクト内の全シーン読み込み、Missing Component/Reference、全3セクションの自動完走を検証しています。
- 正常解法ではインタラクション
4回成功 /0回失敗、最大Replay Drift0 mを確認しています。 - コンパイラーのエラー/警告、Missing、NullReference、Unhandled Exceptionに一致する検証ログは各
0です。
結果の要約は検証結果の要約、検証方法はテスト計画を参照してください。
WASD/ ゲームパッド左スティック:移動E/ ゲームパッドSouthボタン:インタラクションR/ ゲームパッドStartボタン:現在のループを終了Escape/ ゲームパッドSelectボタン:一時停止 / 再開- ポーズメニュー:
Resume、Restart Section、Restart Game、Quit
Unity/Assets/_Project/
├─ Scripts/Runtime/ fixed tick、リプレイ、インタラクション、UI・音響
├─ Scripts/Editor/ シーン生成、検証、キャプチャ・ビルド処理
├─ Scripts/Tests/ EditMode・PlayModeテスト
├─ Scenes/ 生成済みの検証用・プレイ用シーン
├─ Art/ 本プロジェクトのマテリアル・表示用アセット
└─ ThirdParty/ ライセンスを確認した外部アセット
Docs/
├─ ADR/ 設計判断の記録
├─ Media/ README用画像
└─ *Validation.md 計測を伴う検証記録
- Unity Hubから
Unity/をUnity6000.4.6f1で開きます。 ECHO SHIFT/Build Phase 3 Sceneを実行し、P3_PlayableGreybox.unityを生成・確認します。- BatchModeでのシーン生成、EditMode、PlayMode、ビルドの各コマンドはDocs/TestPlan.mdに記録しています。
- Quaternius Modular Sci-Fi MegaKit / Animated Robot Pack: CC0 1.0
- Kenney Sci-Fi Sounds: CC0 1.0の原音から本プロジェクト用に加工したWAV
- Noto Sans JP: SIL Open Font License
公式配布元、取得した版、ハッシュ、使用範囲、変更内容、ライセンス表示はDocs/ThirdPartyAssets.mdとThirdPartyNotices/に記録しています。
本プロジェクトで制作したソースコードとアセットは、ポートフォリオ閲覧を目的としてリポジトリのライセンスに基づき公開しています。外部素材には、それぞれのライセンス表示が適用されます。
- 画面表示を伴うWindows版は、終了時に
UnityPlayer.dllのnative cleanup内で0xC0000005を再現するため、配布ビルドとしては未承認です。ゲームプレイ中のmanaged exceptionではなく、調査範囲と再現条件はWindows版終了時クラッシュの調査記録に記録しています。 - Steamworks、セーブデータ、enemy AI、戦闘、インストーラー/署名は未実装です。
- Replay Driftは計測しますが補正しません。任意のRigidbody状態を巻き戻す仕組みではありません。
- Windows版は終了時の問題が解決するまで正式配布を見送り、プレイ動画とソースコードを公開しています。

