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 を操作するサーバー。コミュニティ実装が複数あるので、用途に応じて選ぶ。
{ "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" } } }}godot-mcp は OSS コミュニティ実装で、メンテナンス状況や対応 Godot バージョンが実装ごとに違う。GitHub stars / 最終 commit / Issue 件数 をチェックして選ぶ。動かなければ素朴な「Claude Code でファイル編集 + 手動で Godot 起動」 が確実。
3. プロジェクトの初期セットアップ
Godot Editor で空プロジェクトを作成 → ディレクトリを開いて Claude Code を起動。
# Godot Editor で新規プロジェクト作成後cd ~/Projects/my-platformerclaude # Claude Code 起動
# 最初のプロンプト例:# > Godot 4 で 2D プラットフォーマーの叩き台を作って。# > プレイヤー (CharacterBody2D + AnimatedSprite2D) と# > 地形 (TileMap)、ゴール (Area2D) の最小構成で。# > GDScript で書いて、シーン名は Main.tscn にして。4. Claude に書かせる Player スクリプト
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 スクリプト
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 が直接読めるので、「現在のシーン構造を見て、ここにライトを追加して」 のようなお願いができる。
[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 で実行 (起動・終了するだけのスモークテスト)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 -gexit10. 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 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。