0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Godot 4 で AI に書かせた GDScript が静かに壊れる5つのパターン

0
Posted at

はじめに

ChatGPT、Claude、Cursor などで GDScript を書かせると、構文的には正しい、コンパイルも通る、表面的には動く、というコードがほぼ確実に出力されます。しかし Godot 4 で実際にゲームを動かすと、エラーは出ないのに動作が間違っているという「サイレント失敗」が頻繁に発生します。

Sonarsource State of Code 2026 レポート によると、AI 生成コードの障害の60%はサイレント失敗です。Godot のような複雑なランタイムを持つエンジンでは、この比率はさらに高くなります。

私たちが Godot 専用の AI エージェントを開発する中で、ユーザーログから繰り返し見つかった5つの典型的な失敗パターンを共有します。

1. シグナル受信側が freed されているのに connect が残っている

# AI が書きがちなコード
func setup_enemy(enemy):
    enemy.died.connect(_on_enemy_died)

setup_enemy() を呼んだ親ノードが敵が死ぬ前に queue_free() されると、connect された receiver が dangling 状態になります。Godot はエラーを出しません。シグナルは emit されるが、コールバックは無音でスキップされます。

防御策は connect 時に is_instance_valid() ガードを入れること、または receiver の tree_exited シグナルで明示的に disconnect することです。

2. AnimationTree のパラメータパスが文字列ミス

# AI はパスを覚えで書く
anim_tree.set("parameters/playback/state", "run")

実際のパス名は parameters/playback だけで、状態は travel() メソッド経由で操作します。AI は他のプロジェクトで見たパスをそのままコピーすることがあり、文字列が間違っていてもエラーは出ず、無音で何も起こりません。

防御策は、起動時に anim_tree.get("parameters/playback") != null を assert することです。

3. autoload を参照する前にプロジェクト設定で登録忘れ

# AI コード
func _on_hit():
    AudioManager.play("hit")

AudioManager が project.godot に autoload として登録されていないと、これは NIL リファレンス エラーを起こします。ただし、_on_hit() が呼ばれる経路を実際にプレイテストしないと、エラーは表面化しません。30秒のテストプレイでは見つからない経路で起きやすいです。

4. シーンパスのハードコーディング

# AI の出力
var player_scene = load("res://scenes/Player.tscn")

プロジェクトのフォルダ構造が res://entities/ だった場合、load()null を返しますが、エラーは出ません。player_scene.instantiate() で初めて Null reference エラーが出ます。

AI は最初に学習したプロジェクト構造を仮定するので、現在のプロジェクトと一致しない場合があります。@export var player_scene: PackedScene で明示的に注入するパターンが安全です。

5. tween チェーンが再エントリで壊れる

# AI コード
func attack():
    var tween = create_tween()
    tween.tween_property(self, "modulate", Color.RED, 0.1)
    tween.tween_property(self, "modulate", Color.WHITE, 0.1)

attack() が連続で呼ばれる (ボタン連打、AI からの指示など) と、複数の tween が同時に走り、互いを上書きします。アニメーションが「微妙にカクつく」程度の症状で、エラーは出ません。

防御策は tween.kill() を先頭に入れるか、tween_property の代わりに set を併用することです。

なぜ AI ツールはこれを直せないのか

これらのパターンに共通するのは、すべてランタイムでしか観察できないことです。ソースコードを読むだけでは検出不可能です。

  • 1番のシグナル dangling は、receiver を free してから signal を emit して初めて見える
  • 2番のパス間違いは、AnimationTree のインスペクタを見るか、実際に animation が走らないと判らない
  • 3番の autoload 抜けは、プロジェクト設定を見ないと判らない
  • 4番のパスハードコードは、load() が null を返すまで判らない
  • 5番の tween 重複は、連打で初めて発生する

Stack Overflow 2025 開発者調査 によると、AI 出力への信頼度は40%から29%に下落、66%の開発者が「ほぼ正しいが完全ではない AI コード」を最大の不満として挙げています。Godot 開発はこのカテゴリに完全に該当します。

対策

3つあります。

1つ目: AI が書いたコードは、必ず Godot を起動して F5 を押す。コミット前に。出力パネルがほとんどのサイレント失敗を数秒で表示します。

2つ目: is_connected() ガード、is_instance_valid() ガード、assert(get(path) != null) を AI 生成コードに自動的に追加する習慣をつける。これは最も安いディフェンシブパターンです。

3つ目: エンジン統合型の AI ツール (例: Godot 専用の Ziva) を試す。エージェント自体がシーンを実行してテストできるので、ソースコードを生成した瞬間にサイレント失敗を検出できます。

まとめ

AI が書いた GDScript が「動いてるように見える」のと「実際に動く」のは別物です。Godot のような scene tree と signal を持つエンジンでは、静的解析だけでは検出できないバグが多数発生します。

「コンパイルが通った」を「動く」と勘違いしないこと。これが Godot で AI コードを使うときの最も重要なルールです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?