過去の自分の移動と操作をEchoとして再生し、現在の自分と協力して仕掛けを解くUnity製3Dパズルゲーム。
🎥 50秒プレイ動画 · 💻 コア実装 · 技術解説
Windows版は現在ダウンロードできません。 画面付きPlayerの終了時にUnityPlayer.dll内のnative crashが再現するため、動画とソースを公開しています。動画では記録・Echo再生・装置の連携を確認できますが、正常終了を保証するものではありません。
2026-10-03に画像・音声を再生成し、生成手順・検査の不整合を修正した後、EditMode 151/151、PlayMode 131/131を確認しました。Windowsビルドと全3セクションの自動完走も成功しましたが、終了時のnative crashを新しいDumpで再確認しており、正常終了は未確認です。検証範囲 · 終了時クラッシュ調査
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 |
| 現在の状態 | 動画・ソース公開。画面付きWindows配布は終了時クラッシュのため未承認 |
記録した行動が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で分離しています。
- 2026-10-03にPhase5A成果物を再生成し、古い検査baselineとContact Sheet生成を修正してEditMode
151/151、PlayMode131/131成功。画像・音声はGit管理外なので、全テストには生成準備が必要です。再生成前の2026-09-29はEditMode146/151でした。 - PlayModeでプロジェクト内の全シーン読み込み、Missing Component/Reference、全3セクションの自動完走を検証しています。
- 正常解法ではインタラクション
4回成功 /0回失敗、最大Replay Drift0 mを確認しています。 - 今回のBuildReportはエラー/警告
0/0、完走PlayerログにMissing、NullReference、Unhandled Exceptionの一致はありません。ただしnative crashは別途再現しており、Editor起動ログのPackageCache診断や再生成前のEditMode失敗を「全ログ問題なし」とは扱いません。
結果の要約は検証結果の要約、検証方法はテスト計画を参照してください。
| 関心 | 入口 |
|---|---|
| fixed tickとリプレイの順序 | Runtime/Core |
| 記録対象の識別と操作の競合 | Runtime/Interaction |
| 3セクションの進行・リセット | Runtime/Gameplay |
| 回帰検証 | EditMode / PlayMode |
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版は終了時の問題が解決するまで正式配布を見送り、プレイ動画とソースコードを公開しています。

