ふくふくHukuhuku Inc.
EP.02LLM Gamedev 13分公開: 2026-05-26

Godot 4 × Claude Code ── godot-mcp で 2D プラットフォーマーを生成させる

Godot 4 + Claude Code + godot-mcp の組合せで、2D プラットフォーマーの叩き台を LLM にゼロから作らせる手順。MCP サーバーの導入、プロジェクト構造の渡し方、生成された GDScript の品質と限界。

#Godot#Claude Code#MCP#GDScript#プラットフォーマー
執筆 / 監修
松尾 亮合同会社ふくふく 代表社員

データ基盤・データパイプライン構築 / BI / 生成 AI 活用支援を専門とするエンジニア (28 年)。 本記事は AI 利用ポリシーに基づき、生成 AI の補助で執筆 → 人間が監修・編集して公開しています。

プロフィール詳細
シェア

EP.01 で「 連動の主役候補」と書きました。本 EP では実際に 4 + + godot- の環境を組み、2D プラットフォーマーの叩き台を でゼロから作らせる流れを示します。

1. 必要なもの

  • Godot 4.x (公式 godotengine.org からダウンロード、無料)
  • Claude Code (`npm install -g @anthropic-ai/claude-code` → `claude` コマンド)
  • godot-mcp (GitHub コミュニティ実装、後述)
  • OS: macOS / Linux / Windows いずれも可

2. godot-mcp の導入

godot-mcp は MCP プロトコルで Godot を操作するサーバー。コミュニティ実装が複数あるので、用途に応じて選ぶ。

Claude Desktop / Claude Code 設定 (~/.config/claude/claude_desktop_config.json または ~/.claude/mcp.json)
JSON
{  "mcpServers": {    "godot": {      "command": "node",      "args": ["/path/to/godot-mcp/build/index.js"],      "env": {        "GODOT_PATH": "/Applications/Godot.app/Contents/MacOS/Godot",        "GODOT_PROJECT_DIR": "/Users/you/Projects/my-game"      }    }  }}
MCP サーバー選定の注意

godot-mcp は OSS コミュニティ実装で、メンテナンス状況や対応 Godot バージョンが実装ごとに違う。GitHub stars / 最終 commit / Issue 件数 をチェックして選ぶ。動かなければ素朴な「Claude Code でファイル編集 + 手動で Godot 起動」 が確実。

3. プロジェクトの初期セットアップ

Godot Editor で空プロジェクトを作成 → ディレクトリを開いて Claude Code を起動。

プロジェクト初期化
Bash
# Godot Editor で新規プロジェクト作成後cd ~/Projects/my-platformerclaude   # Claude Code 起動
# 最初のプロンプト例:# > Godot 4 で 2D プラットフォーマーの叩き台を作って。# > プレイヤー (CharacterBody2D + AnimatedSprite2D) と# > 地形 (TileMap)、ゴール (Area2D) の最小構成で。# > GDScript で書いて、シーン名は Main.tscn にして。

4. Claude に書かせる Player スクリプト

Claude が生成する典型的な Player.gd (Godot 4)
Code
extends CharacterBody2D
# プレイヤー設定@export var speed: float = 300.0@export var jump_velocity: float = -400.0
# 重力 (プロジェクト設定の Gravity から取得)var gravity: float = ProjectSettings.get_setting("physics/2d/default_gravity")
@onready var animated_sprite: AnimatedSprite2D = $AnimatedSprite2D
func _physics_process(delta: float) -> void:    # 重力適用    if not is_on_floor():        velocity.y += gravity * delta
    # ジャンプ    if Input.is_action_just_pressed("ui_accept") and is_on_floor():        velocity.y = jump_velocity
    # 横移動 (ui_left / ui_right はプロジェクト設定の default)    var direction: float = Input.get_axis("ui_left", "ui_right")    if direction != 0:        velocity.x = direction * speed        animated_sprite.flip_h = direction < 0        animated_sprite.play("run")    else:        velocity.x = move_toward(velocity.x, 0, speed)        animated_sprite.play("idle")
    move_and_slide()

5. ゴール判定の Area2D スクリプト

Goal.gd
Code
extends Area2D
signal goal_reached
func _ready() -> void:    body_entered.connect(_on_body_entered)
func _on_body_entered(body: Node2D) -> void:    if body.is_in_group("player"):        goal_reached.emit()        # クリア演出 → 次レベル or 再スタート        get_tree().reload_current_scene()

6. .tscn ファイルが LLM に読める

Godot のシーンファイル (.tscn) は INI 風のテキスト。Claude が直接読めるので、「現在のシーン構造を見て、ここにライトを追加して」 のようなお願いができる。

Main.tscn (抜粋)
Code
[gd_scene load_steps=4 format=3 uid="uid://abc123"]
[ext_resource type="Script" path="res://scripts/Player.gd" id="1_player"][ext_resource type="Script" path="res://scripts/Goal.gd" id="2_goal"]
[node name="Main" type="Node2D"]
[node name="Player" type="CharacterBody2D" parent="."]position = Vector2(100, 300)script = ExtResource("1_player")
[node name="CollisionShape2D" type="CollisionShape2D" parent="Player"]shape = SubResource("CapsuleShape2D_xyz")
[node name="TileMap" type="TileMap" parent="."]tile_set = ExtResource("3_tileset")
[node name="Goal" type="Area2D" parent="."]position = Vector2(800, 300)script = ExtResource("2_goal")

7. プロンプト設計のコツ

  • Godot のバージョンを毎回明示: 「Godot 4 で」 と書かないと 3.x の API が混ざる
  • ノード型を具体に: 「Player を作って」より「Player (CharacterBody2D) を作って、子に AnimatedSprite2D と CollisionShape2D」
  • API 変更点を覚えてもらう: 初回プロンプトで「move_and_slide() は引数なし、velocity は property、is_on_floor() でチェック」と明記
  • .tscn を貼って文脈共有: 修正依頼時は該当ノード周辺の .tscn を貼る
  • 生成後の Project Settings 設定漏れを指摘: input map / gravity / window size 等は Claude が勝手に推定するので食い違うことあり

8. ハマりやすい落とし穴

落とし穴症状対処
Godot 3 ↔ 4 API 混在KinematicBody2D not found 等プロンプトに Godot 4 を明示
Input map 未設定ui_left が反応しないProject Settings → Input Map を確認
default_gravity 取得式数値直書きで挙動が変わるProjectSettings.get_setting で取得
シーン保存忘れClaude の変更が反映されないEditor でシーンを再ロード
.tscn の UID 衝突リソース読み込み失敗Editor で再保存すると UID 振り直し
Signal の接続漏れイベントが発火しない_ready() で connect、または Editor で接続

9. headless 実行で自動テスト

Godot は CLI で headless 実行可 (画面なしで動かす)。Claude が書いたスクリプトの動作を、人手なしで通せる。

headless 実行と GUT (GDScript テストフレームワーク)
Bash
# シーンを headless で実行 (起動・終了するだけのスモークテスト)godot --headless --quit-after 3 --path . res://Main.tscn
# GUT (Godot Unit Test) によるテスト実行 (要 addon)godot --headless --path . -s addons/gut/gut_cmdln.gd \  -gtest=res://test/unit/test_player.gd -gexit

10. 1 セッションで作れる規模感

Claude Opus と 30 分 で「2D プラットフォーマーのコア部分」が動く程度のものは作れる。アセット (キャラ画像 / タイル) は別途用意するか、Stable Diffusion で生成する EP.07 と組合せる。

  • プレイヤー移動 (歩く / ジャンプ / 落下死)
  • TileMap の地形 + Hazard (棘等)
  • コイン収集 (Area2D + Counter UI)
  • ゴール判定 + シーン遷移
  • BGM + 効果音 (再生制御だけ)

11. 関連 EP

  • EP.07: アセット生成 ── Player スプライトを Stable Diffusion で
  • EP.08: NPC を実行時 LLM で動かす
  • EP.10: プロシージャル生成で TileMap を自動生成

次の話

EP.03 は Unity 6 × Cursor ── C# script の生成と、Asset Store / Muse との付き合い方を扱います。Godot との設計思想の違い、prefab がバイナリだから困る点とその回避策。

シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp