【UnityMCP】Claude Desktopを使ってコードを一切書かずに5時間でゲームを作った話

# 概要

unityroomのゲームジャムイベント、unity1weekに参加しました。

https://unityroom.com/unity1weeks

今回Claude DesktopとUnity用のMCPサーバーを利用し、1日でゲームを作りました。
その備忘録を残しておこうと思います。

作ったゲームは[こちら](https://unityroom.com/games/i-escape )


## 経緯

- unity1weekに久々に参加したい
- ただしUnity使うの久々すぎてUnityの操作もC#も何も覚えてない
- そもそも大してスキルもない
- Unityの操作をClaudeからできるらしい
- → じゃあこれを使えば速攻でゲームを作れるんじゃないか！？

そういう気持ちで始めました。

しかし、実は一週間以上色々試して**うまくいきませんでした**。

気づけば締め切りも**5日過ぎて**金曜日。
(何がどううまくいかなかったのか、の経緯は一旦後回しにします)

「とにかく投稿したい！」という気持ちの元、今まで作ったものを**全部ナシにして**、全く別のコンセプトで1からゲームを作りなおすことにしました。

そこから**1日で完成するまでの流れ**を説明していきたいと思います。

## Claude Desktopを導入する

以下からClaude Desktopをダウンロードします。アカウントとかの設定は省略。

https://claude.ai/download

無料プランでもある程度利用できますが、プロプランでは月間20ドルでClaude3.7を利用できます。定額制なのでそれ以上の課金は発生せず、他にも色々なことに利用できるので使ってない方はぜひ試してみてください。

今回は課金してClaudeを利用しました。

## UnityMCPを導入する

Unityを操作できるMCPサーバーは現状いくつか出ています。みんな`Unity MCP`を名乗っているので正直区別がつきません。

今回は[いすずさん](https://x.com/Shiranui_Isuzu_)の制作のものを使用させていただきました。

https://github.com/isuzu-shiranui/UnityMCP/tree/v1.0.0

他のと比べて
- 日本製なのでドキュメント読むのが楽
- サーバー接続が途中で切れるなどの問題が発生しなかった
- シンプルな導入手順で動く

という利点があり、これを利用させていただきました。

自分が↓の3つと合わせて試した現状の時点ではこれがオススメです。

- https://github.com/justinpbarnett/unity-mcp
- https://github.com/Arodoid/UnityMCP
- https://github.com/CoderGamester/mcp-unity

とはいえ、いつかUnity公式の機能として対応してほしいところです。

### 導入方法

ドキュメントの手順をそのまま実行してください。

https://github.com/isuzu-shiranui/UnityMCP/tree/v1.0.0?tab=readme-ov-file#-%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB

トンカチのマークの数字が増えていたらOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/cba6383e-e07b-406c-823b-0db34190a403.png)

ただし、試した限りではファイル操作がちょっと難しいようです。UnityMCPの機能としては存在するのですが、Unityを一度経由してファイル作成を行う都合上、うまくいかないことがありました。

そこで、Claudeから直接ローカルファイルを操作するためのMCPサーバー`@modelcontextprotocol/server-filesystem`も導入しました。多分これを使った方がスムーズ。

https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem

以下のコマンドを入れます。

```
npm install -g @modelcontextprotocol/server-filesystem
```

claude_desktop_config.jsonを以下のように書き換えます。
指定したフォルダ下のファイルをclaudeが自由に操作できるようになります。

```
{
    "mcpServers": {
      "unity-mcp": {
         "command": "node",
         "args": [
            "<リリースページからダウンロードしたUnity-MCPのパス>/unity-mcp-build/index.js"
         ]
      },
      "filesystem": {
        "command": "npx",
        "args": [
          "-y",
          "@modelcontextprotocol/server-filesystem",
          "<操作したいUnityプロジェクトのパス>/Assets"
        ]
      }
   }
}
```

Claudeを再起動させてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/cf2536a0-1c00-4135-bac0-3d46fc60c76b.png)


unity-mcpとfilesystem、2つのMCPサーバーをClaudeが起動させ、認識していることがわかります。

## 実装作業

期間の短さ(締め切りまで**あと-5日**)や、グラフィックを用意する手段も時間もないことから、シンプルな単色のグラフィックだけで成立するゲームを考えます。unity1weekのゲームテーマは**ほとんど無視**(すいません)。10分くらいでこんなコンセプトを決めました。

* 主人公がI(アイ)。これでテーマ要素終わり
* Unityの2Dゲーム。3D表現は一切使用しない
* 縦向きの棒が一定速度で横方向に動き続ける
* 棒はタップやクリックで移動方向を逆向きに変更する
* 棒が他のオブジェクトに触れるとゲームオーバー。初期状態に戻る
* 周りをオブジェクトが動く。これを避け続けなければいけない
* 一定時間耐えたらクリア

こんな指示を出しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/f2ee3ff5-cb10-4656-8774-eaaaeaedcce4.png)

ポイントとしては以下の点です。
- 短期間の個人開発であること、テストも省略することまで明言
- 動作確認をベースに進めていくことを明示
- 必ず手順を説明→人間の確認のもと動くように指定
- まず動く最小限の構成を作ることから始める

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/44dddc0d-78b8-4e11-b957-d3281b48f88b.png)

こうした内容を元に、1つずつやることを指定していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/f2f6fd67-7547-468f-9803-583411b0cc11.png)

なお、コードに関してはclaudeが好きに操作できますが、Unity側で必要な操作に関してはそうとも限りません。オブジェクトを作るくらいなら勝手にやってくれますが、ゲームシーン上でコンポーネントをオブジェクトにattatchするとかの作業などは手動で操作するように要求されました。


しかし、それすら面倒だと説明したらC#コード上で勝手にやるように処理を追加してくれました。

```
        // Box Collider 2Dがなければ追加
        if (GetComponent<BoxCollider2D>() == null)
        {
            BoxCollider2D collider = gameObject.AddComponent<BoxCollider2D>();
        }
```

障害物作成のためのprefabの作成面倒くさいな～とか思ってたら、それを自動で作るためのヘルパーまで作ってくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/74547226-067c-4ef1-9f5b-113afd2ea7d0.png)

ボタンを押すとprefabが自動生成され、保存されます。もちろん三角形だとか四角形だとかの画像もちゃんと作られている。すごい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/3a61f119-cc02-4b38-9e58-0b0bcc4e3ca5.png)

最終的にはこのヘルパーすら人力では使わず、コード上でこれを叩いてprefabを作ってgameObjectを取得するようにしてくれました。マジで人力の操作ほとんどしてません。

障害物の出現パターンも人力で配置するのが面倒だったので、日本語で説明したものを勝手に配置するようにしてもらいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/82961cd5-73ff-4b07-82b6-5d5c0a9b2d4f.png)

感覚的な位置調整もかなりうまいことやってくれます。微調整はちょこちょこ必要になり、さすがにそれは人力でコード編集した方が早かったですが。

「やっぱりこういう機能追加してー」という要望をしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/4ec740f5-0341-4c05-8941-7a1450946dbc.png)

既存のコードにできるだけ影響を与えないことも配慮しながら、実装してくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/38875e54-cd40-472a-af17-48fa0340de5b.png)

最後に**タイトルを決めてなかったので**これも決めてもらいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/14f8c446-0892-49b5-a8c6-8dffd4ac6dd3.png)

(これはボツになりました)

## 完成したゲーム

ワンボタンで向きを変える自機を移動させ、60秒間逃げ続けるゲームです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/655b78fa-52c3-4fd6-b752-4708bccd1e7c.png)

最短1分で遊べるので、ぜひ遊んでみてください
リンクは以下↓

[【耐久ゲーム】60秒の過酷なアイ | フリーゲーム投稿サイトunityroom](https://unityroom.com/games/i-escape )

手抜きのわりにはそれなりに楽しいのができたと思い、個人的には気に入っています。

## 感想

1日の仕事前の朝と仕事後の夜だけでゲームができました。コードはパラメータの微調整程度の編集しかしていません。Unityでのポチポチ操作もほとんどしていないし、もし必要でもそこも丁寧に教えてくれます。

これでもう、エンジニアのスキルなんていらない！

とも言いたいですが、現状では実際のところそうともいきません。

## うまくいかなかった話

冒頭で説明したとおり、この5時間の前に1週間以上かけた失敗があります。何も動かないままコード量だけが膨らみ続け、最後は収集が付かない状態になってしまいました。

その備忘録も簡単に…

- パズルゲームを作ろうとした
- テスト駆動開発をベースに進めることを指示した
- 考えたゲームの内容を全て指示したところ、まず勝手に全部のロジックを作りはじめ、コードが膨らみ続けた
- 大量に生成されたコンパイルエラーを吐きまくるコードと、それに付随する動かないテストたち。もう嫌。
- コンパイルエラーはclaudeが直してくれても、何がどうなっているのか認知負荷が高くて俺の頭が追い付かない。今何をしているんだ。
- 何よりテストの失敗を検知する機能が現状の構成では存在しない。エラーを頑張って読んだり、Claudeに手動でコピペする必要がある。
- そんなことをしていると、いつまでも動くものができない。これが何よりストレス。
- ある程度人力でのUnity上での操作も必要になるが、何をどう操作すればいいのかもはやまったくわからない。
- なんで個人開発で負債解消をしなければいけないんだ。俺はゲームを作りたいんだ


反省としては以下になります。

- 自分の認知速度を超える速度で作られたコードは動かない
    - とにかく「最小単位」で「動くものを作る」ことを優先する
    - ある程度コードは読む必要があるし、読める範囲の量を作ることを意識するべき
    - すごい人ならもっと高速で実装させることができるんだろうけど、自分の能力では無理。
- LLMはちょっとした指示で暴走した実装を行い続ける。必ず確認を挟ませる
- テストを実装する意味はこの場合はない
    - メンテナンスとか機能追加とかない短期間の個人開発なので
    - 多分、**テスト実装を指示した段階**で勝手に**規模のデカいプロジェクト扱い**されてる気がする。しないでほしい
    - 何よりテスト実行時のエラーをclaudeが取得する機能がないので、現状のUnityでは不便

今回の手順はこれを意識しています。今後ももっとアップデートしていきたい

# ほか

こんなツイートを見かけました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">軽い気持ちで「テスト容易性の観点から改善を加えてください」と投げかけると FizzBuzzEnterpriseEdition みたいなコードが大量に出てきてしまい、「ごめんな。メチャクチャやる気を出しているところにごめんな。頑張るところと手を抜いてもいいところのメリハリをつけよう」という指示を出すパターン <a href="https://t.co/2wfTTsjPNo">pic.twitter.com/2wfTTsjPNo</a></p>&mdash; Takuto Wada (@t_wada) <a href="https://twitter.com/t_wada/status/1915331840753442841?ref_src=twsrc%5Etfw">April 24, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

強く実感。とにかく暴走させないことは普段の仕事から意識したいと思いました。