AIが壊して、AIが直した。Unityデータ消失から復元までの全記録
「面倒でもちゃんと動くことを優先して」
今朝、そう指示した瞬間から、地獄が始まった。
※注釈:デジタルツイン学習(R2R2R)の検証プロセス 本プロジェクトは、AIの判断を物理的動作へ変換する設計を検証するものです。現実空間をデジタルツイン化し、仮想空間での大量試行(Real-to-Render)から得た最適解を、実世界のモーター駆動(to-Real)へ還元する「R2R2Rパイプライン」の実装過程を記録・考察します。
データが消えた日
AIが生成したスクリプトでUnityが壊れた
ロボットアームと小鉢が「すり抜ける」問題を解決しようとしていた。
UnityのArticulationBodyとMeshColliderが非互換という根本的な制約に直面し、「各リンクにBoxColliderを手動追加するEditorスクリプト」という泥臭い解決策を選んだ。面倒でも確実に動く方法を選んだはずだった。
ClineにEditorスクリプト AddRobotColliders.cs を生成させて実行。コンソールに表示されたのは:
Added 70 BoxColliders to RobotArmy objects.
成功に見えた。しかし再生した瞬間、コンソールが赤く染まった。
Non-convex MeshCollider with ArticulationBody is not supported.
エラー×62件BoxColliderではなくMeshColliderが追加されていた。しかも firefighter オブジェクトにまで。Clineのクレジットも残り$0.01で止まった。
git resetで消えたシーンファイル
git reset --hard aae3712 で安定コミットに戻ろうとした。しかしシーンファイルがgitにコミットされていなかった。
続けて git clean -fd を実行した結果:
Removing Assets/Scenes/R2R2R-20260224.unity
Removing Assets/kobachi_2/
Removing Assets/Scripts/Editor/
Removing Assets/RobotMaterials/
シーン、小鉢アセット、スクリプト、マテリアル——全部消えた。背景がピンク一色になったUnityを見て、正直かなり焦った。
なぜ復元できたか:Unityはメモリを持っていた
ここで気づいた重要なこと。Unityを一度も閉じていなかった。
HierarchyにはRobotArmy10体、kobachi_2、defaultが残っていた。シーンデータはUnityのメモリ上に生きていた。すぐに File → Save As でシーンを保存した。
GeminiとUnity VCSで2月24日まで戻る
マテリアル消失による全ピンク状態はまだ残っていた。Geminiに相談しながら Unity Version Control(旧Plastic SCM) を活用する方針に切り替えた。
Changesets から cs:3(新しいSceneを作成) を右クリック → Switch to this changeset → ポップアップで Reload。
Check-in successfully completed. Changeset 4 was created.2月24日の状態への復元、完了。
なぜこうなったのか
① AIに任せる前に、判断基準も一緒に渡すべきだった 「BoxColliderを追加して」だけでなく「ArticulationBodyと共存できる方法で」と渡すべきだった。AIは指示通りに動く。指示が曖昧なら、曖昧な結果が返ってくる。
② git cleanは危険 トラッキングされていないファイルも消える。Unityのシーンファイルは .gitignore に入りがちなので特に注意が必要だった。
③ Unityを閉じなければメモリは生きている パニックになっても、まずCmd+Sを押すべきだった。
④ VCSはCheck-inしておかないと保険にならない 今後は作業の区切りごとに必ずCheck-inを習慣化する。
なぜ「役割分担」を変えたか
午前の失敗を受け、午後の進め方を根本から設計し直した。
単に「次は気をつけよう」ではなく、AIと人間の役割を明確に分離するという方針転換だ。
人間がやること:
目で確認が必要な作業(小鉢の配置・サイズ確認)
判断が必要な局面(スケール・構造の決定)
安全確保(作業前後のVCS Check-in)
AIにやらせること:
コードの生成(ただしレビュー必須)
繰り返し作業の自動化
技術的な選択肢の提示
この「役割分担の再設計」が、午後の進め方の根幹になった。
小鉢をシーンへ、物理演算へ
小鉢(kobachi_2)の配置
3DpressoでスキャンしたOBJデータをUnityにインポート。Kobachiフォルダに Image_0(テクスチャ)、result(OBJファイル)、result(Prefab)が入った。HierarchyにドラッグしてScale 0.3で配置。kobachi_2(親)→ default(子) という構造が自然にできた。
RobotArmControllerが存在しない問題
動かしたい関節をアサインするため RobotArmController スクリプトを探した。Clineは「作成しました」と報告していたが、Projectウィンドウで検索しても何もヒットしなかった。
Geminiの分析:「Clineは作成したと報告したものの、実際にはファイルとして保存(Write)できていないか、違うディレクトリに作成してしまった可能性がある。」
AIが「完了した」と言っても、ファイルが実在するかを人間が目視確認するまで信用しない——午前の教訓がここでも証明された。
床の手動作成
物理シミュレーションには床(Collider付き)が必須だった。Clineには任せず手動で作成した。
Hierarchy右クリック → 3D Object → Plane
Scale:X/Y/Z = 10(実寸100m×100m)
マテリアル:マットなダークグレーを適用(Smoothnessを0に設定)
Mesh Collider が自動付与されていることを確認
床がマットになったことで、ロボットの白が映えて一気に「研究室」らしい雰囲気になった。
10cmグリッドのShader Graph実装——そして棚上げ
床の視認性を高めるため、Clineに10cm間隔のグリッドシェーダーを作成させた。Shader Graphを使ったワールド座標ベースの実装で、床のScaleに依存しない設計だった。
しかし途中でClineがJSON構文エラーを繰り返し引き起こした。ファイルが破損し、修正しようとするとまた破損する——という負のループに入った。
Geminiがリスクを検知:「Clineがループに入っている。トークンを浪費するだけなので棚上げにしましょう。」
「なんかできないね。別の方法させよう」
この判断は正しかった。Shader Graphの問題に時間を使いすぎることなく、本来の目的である物理演算のセットアップに切り替えられた。
小鉢の物理セットアップ
床が整ったところで、小鉢に物理的な実体を持たせる作業へ。Clineへの指示:
kobachi_2に Box Collider(Convex)を追加Rigidbody コンポーネントを追加、質量 0.1kg(100g)に設定
ロボットの指先が届く範囲の床の上に正確に配置
再生時に小鉢が床を突き抜けず正しく接地することを確認
ロボットの ArticulationBody の Stiffness(20,000) / Damping(2,000) には絶対に触れない
小鉢のスケールは約10.5cmとやや小さめ。エラーも出ていたが、Geminiのリスク検知により「MeshColliderではなくBox Colliderで代用するのが安全」という判断が下された。ロボットが接触できる「実体のある小鉢」としてシーンに存在するようになった。
1日を振り返って
朝から夕方まで、ほぼ1日中トラブルと向き合い続けた。
でも振り返ると、全てのトラブルが教訓に変わった。
AIを信頼しすぎると壊れる
でもAIなしでは復元もできなかった
Claude、Gemini、Clineという3つのAIを使い分けながら問題を解決した
R2R2Rプロジェクトのテーマは「Real to Render to Real」——現実をスキャンし、デジタルで再現し、また現実に戻す。
今日のこの1日も、その循環の中にある。失敗して、学んで、また前に進む。それ自体が、このプロジェクトのリアルな記録だ。
