Back to Blog
·Summer Team

Godot 4でAIを作る方法:ステップバイステップガイド(2026年版)

Godot 4でAIを構築するための実践的なガイドです。敵のステートマシンやパスファインディングから、LLM駆動のNPCまでを扱います。コピー&ペーストできるGDScriptと、AIを活用した効率的な開発方法も紹介します。

「GodotでAIを作る方法」と調べると、意味によってまったく異なる答えが返ってきます。同じフレーズが、全く別の2つのことを指しているからです。

1つ目は、クラシックなゲームAIです。ゴブリンがプレイヤーを見つけ、柱を回り込みながら追いかけ、近づいたら攻撃するような挙動です。これは意思決定ロジックと移動処理であり、ゲーム開発の世界で何十年も使われてきた基本的な手法です。

2つ目は、言語モデルを使ったAIです。プレイヤーが自分の言葉で話しかけると、キャラクターとして自然に返答してくれる商人NPCのようなものです。これは新しい技術であり、テキストをインターネット越しにモデルへ送ることで実現します。解決する問題も異なります。

ほとんどのゲームでは、ほぼすべての要素に1つ目のAIが必要で、2つ目は会話が重要な一部のキャラクターにのみ使います。このガイドでは両方を順に解説し、Godot 4にそのまま貼り付けて使えるGDScriptも掲載します。最後に、AIネイティブエンジンがこのコードを自動で書いてゲームを実際に動かしてテストする方法を紹介します。これはチュートリアルでよく省略される部分です。

パート1:クラシックゲームAI(最もよく使う種類)

デザイナーが「敵のAIが良い」と言うとき、ニューラルネットワークが動いているという意味はほぼありません。合理的な判断をしている、つまりプレイヤーに気づき、適切な行動を選び、状況に応じて判断を変えるという意味です。コードで表現すると、それがステートマシンです。

ステートマシンとは、状態のリスト(待機・巡回・追跡・攻撃)とそれらの切り替えルールのことです。ゲームAIで最も有用なパターンであり、Godot 4にはそれを構築するために必要なものがすべて揃っています。

ステップ1:敵シーンを準備する

ルートに CharacterBody2D を持つ新しいシーンを作成します(3Dの場合は CharacterBody3D。ロジックは同じです)。以下の子ノードを追加します。

  • 見た目のための Sprite2D または AnimatedSprite2D
  • 物理ボディのための CollisionShape2D
  • 検出範囲として機能する、敵より大きめの CollisionShape2D を持つ Area2D
  • 壁を回り込んで移動するための NavigationAgent2D

検出用の Area2D が「視覚」の役割を果たします。プレイヤーがその範囲に入ったとき、敵が反応を開始します。

ステップ2:ステートマシンを書く

ルートノードに以下のスクリプトをアタッチします。4つの状態を定義し、プレイヤーとの距離に応じて切り替えます。

extends CharacterBody2D

enum State { IDLE, PATROL, CHASE, ATTACK }

@export var move_speed: float = 120.0
@export var attack_range: float = 40.0

var state: State = State.IDLE
var player: Node2D = null

@onready var nav: NavigationAgent2D = $NavigationAgent2D

func _physics_process(_delta: float) -> void:
	match state:
		State.IDLE:
			velocity = Vector2.ZERO
			if player != null:
				state = State.CHASE
		State.CHASE:
			_chase()
		State.ATTACK:
			velocity = Vector2.ZERO
			_attack()
	move_and_slide()

func _chase() -> void:
	if player == null:
		state = State.IDLE
		return
	var distance := global_position.distance_to(player.global_position)
	if distance <= attack_range:
		state = State.ATTACK
		return
	nav.target_position = player.global_position
	var next_point := nav.get_next_path_position()
	velocity = global_position.direction_to(next_point) * move_speed

func _attack() -> void:
	# 攻撃アニメーションを再生し、ダメージを与えてから追跡に戻る
	if player != null and global_position.distance_to(player.global_position) > attack_range:
		state = State.CHASE

# エディタのNodeタブで検出用Area2Dからこれらを接続する
func _on_detection_area_body_entered(body: Node2D) -> void:
	if body.is_in_group("player"):
		player = body

func _on_detection_area_body_exited(body: Node2D) -> void:
	if body.is_in_group("player"):
		player = null
		state = State.IDLE

このスクリプトを機能させる2つのポイントがあります。state に対する match 文によって各挙動が独立して管理されるため、後から新しい状態を追加してもほかの状態が絡み合いません。また、Area2D の body-entered と body-exited シグナル(エディタのNodeタブから接続)により、毎フレームポーリングすることなく敵の認識状態を切り替えられます。

プレイヤーを player グループに追加してください(プレイヤーを選択し、NodeタブのGroupsで「player」を追加)。これで検出チェックが正しく機能します。

ステップ3:壁を回り込めるようパスファインディングを追加する

上記のスクリプトでは NavigationAgent2D を使っていますが、エージェントが動くには床の位置を把握したマップが必要です。レベルシーンに NavigationRegion2D を追加し、歩行可能な地面を覆う NavigationPolygon を設定します(壁の部分は穴を開けます)。Godotがエージェントのルーティングを自動で処理してくれます。

重要な考え方:AIスクリプトが決めるのは目的地(nav.target_position = player.global_position)であり、ナビゲーションシステムがルートを決めます。パスファインディングの計算を自分で書く必要はありません。get_next_path_position() が次のウェイポイントを返してくれるので、そこに向かって移動するだけです。

3Dでも NavigationRegion3DNavigationAgent3D を使って同じ流れになります。ポリゴンを描く代わりにレベルジオメトリにナビゲーションメッシュをベイクしますが、スクリプトのパターンは変わりません。

ステップ4:視線判定を追加する(任意だが効果的)

検出範囲だけでは、敵が壁越しにプレイヤーを見てしまいます。これを修正するには RayCast2D を追加し、追跡を開始する前にプレイヤーへのレイが何かに当たっていないか確認します。

func can_see_player() -> bool:
	if player == null:
		return false
	$RayCast2D.target_position = to_local(player.global_position)
	$RayCast2D.force_raycast_update()
	if $RayCast2D.is_colliding():
		return $RayCast2D.get_collider() == player
	return true

IDLE -> CHASE への遷移に can_see_player() の条件を加えると、敵は実際の視線が通っている場合にのみ追跡を開始するようになります。プレイヤーにとってより公平で知性的な印象を与えます。

これで完成した、実際に使えるレベルの敵AIになります。検出・障害物を避けた追跡・壁による視線遮断・射程内での攻撃が実装されています。巡回ルート・体力低下時の逃走・集団戦術は、すべてこの骨格に新しい状態と遷移を追加するだけで実現できます。

パート2:LLM駆動のAI(会話できるNPC)

「GodotにおけるAI」の2つ目の意味は、プレイヤーが自由に会話できるNPCです。これはまったく別のしくみです。ステートマシンの代わりに、テキストを言語モデルに送り、返ってきた返答をセリフに変換します。

Godot 4には組み込みのモデルはありませんが、HTTPRequest があります。これだけで十分です。

ステップ1:モデルにメッセージを送る

HTTPRequest ノードとスクリプトを追加し、プレイヤーのメッセージと短いキャラクター説明をモデルAPIにPOSTします。

extends Node

@onready var http: HTTPRequest = $HTTPRequest

const ENDPOINT := "https://api.example-model.com/v1/chat"
const API_KEY := "your-key-here" # リリース版のビルドには含めないこと

func ask_npc(player_message: String) -> void:
	var headers := [
		"Content-Type: application/json",
		"Authorization: Bearer " + API_KEY,
	]
	var body := {
		"system": "あなたはブラムという疲れ果てた村の鍛冶屋です。キャラクターを維持してください。返答は2文以内にしてください。",
		"message": player_message,
	}
	http.request(ENDPOINT, headers, HTTPClient.METHOD_POST, JSON.stringify(body))

func _ready() -> void:
	http.request_completed.connect(_on_response)

func _on_response(_result, _code, _headers, response_body: PackedByteArray) -> void:
	var data = JSON.parse_string(response_body.get_string_from_utf8())
	var reply: String = data.get("reply", "...")
	show_dialogue(reply)

func show_dialogue(text: String) -> void:
	# テキストをダイアログUIに渡す
	print(text)

ステップ2:NPCに記憶を持たせる

メモリを持たないモデルは会話のたびにリセットされます。鍛冶屋にプレイヤーのことを覚えさせるには、過去のやり取りのリストを保持し、各リクエストに短い要約を含めます。NPCにリストを持たせて毎ターン追記し、長くなったらモデルに古い内容を1〜2文にまとめてもらうと、プロンプトが際限なく増えるのを防げます。

ステップ3:導入前にトレードオフを把握しておく

LLMダイアログは強力ですが、無料ではありません。メッセージごとにコストがかかり、ネットワーク越しに返答が来るまで時間がかかり、インターネット接続が必要なためオフラインでは動作しません。指示が曖昧だとキャラクターが話題を外れたり、世界観を壊したりすることもあります。

そのため、現実的なパターンはハイブリッド型です。すべてのNPCの挙動にはクラシックAIを使い、自由な会話が本質的に重要なキャラクターにだけLLMダイアログを使う形です。パーソナリティプロンプト・メモリシステム・ゲームの状態と整合させる方法の詳細については、Godot 4でメモリと個性を持つAI NPCを構築する方法で詳しく解説しています。最速でNPCを構築したい場合はAI NPCジェネレーターが便利です。

より速い方法:AIネイティブエンジンに書かせる

上記の内容はすべて手動の方法であり、パターンを理解するために取り組む価値はあります。しかし、ステートマシンを手で書き、接続し、デバッグするのは時間がかかり、バグはゲームを実際に動かしてみるまで気づけません。

これがAIネイティブエンジンが変える部分です。Summer EngineはGodot 4と互換性があり、AIアシスタントがエディタ自体に組み込まれているため、サイドパネルでコードを提案するだけではありません。シーンツリーを読み取り、GDScriptを書き、NavigationAgent と検出用 Area2D を接続し、ゲームを実行してランタイムエラーを読み取り、修正まで行います。挙動を自然言語で説明するだけです。

スケルトンを2点間でパトロールさせ、見つけたらプレイヤーを追いかけ、近づいたら攻撃させてください。壁を回り込めるようナビゲーションを使ってください。

上記で紹介したのと同じステートマシンを生成し、実際の敵シーンにアタッチしたうえで、プレイボタンを押してスケルトンが壁に向かって歩かずに正しく追跡することを確認します。この「書く・動かす・確認する」というサイクルこそが、コードを提案するだけのAIと、実際に動く挙動を届けるAIの違いです。ゲームにおけるAIのバグの多くはランタイムバグであり、チャット画面では見えないからです。

正直に言うと、無料プランでビルド・テスト・エクスポートに対応しており、パターンを習得して最初のAI搭載プロトタイプをリリースするには十分です。有料プランはより多くの使用量と、日常的な開発向けの強力なモデルを提供します。GodotワークフローにおけるAIの選択肢を比較したい場合はGodot AIページをご覧ください。敵が既に組み込まれた状態のプロジェクトから始めて挙動の編集に集中したい場合はテンプレートライブラリが役立ちます。

どこから始めるか

学習中であれば、パート1を手で実装することをおすすめします。ステートマシンと NavigationAgent を組み合わせるだけで、これから作るほぼすべての敵・仲間・生き物に対応できます。そのパターンは1体のゴブリンからフルの戦闘シーンまでスケールします。

パート2は、自由な会話がキャラクターの本質的な価値であるときにのみ使いましょう。コストと遅延を抑えるため、LLMを使うNPCは少数に絞ることをおすすめします。

そして、状態を1つずつ手で入力するよりも速く進めたいなら、挙動を説明してエンジンに構築・テストを任せてください。このガイドで紹介したパターンこそがエンジンが生成するものなので、それを理解しておくことで、どの方法を選んでもより的確に指示できるようになります。

Frequently asked questions

Godot 4で敵AIを作るにはどうすればよいですか?

ステートマシンを構築します。CharacterBody2DまたはCharacterBody3DとNavigationAgentノードを持つ敵シーンを作成し、IDLE・PATROL・CHASE・ATTACKといった状態を列挙型で定義したスクリプトを書きます。各フレームで条件(プレイヤーが近くにいるか、見えているか)をチェックして状態を切り替え、現在の状態に応じた動作を実行します。NavigationAgentのget_next_path_positionを使ってプレイヤーに向かって移動させることで、壁にぶつからずに回り込めるようになります。このガイドには、すぐに使える追跡・攻撃スクリプトが含まれています。

GodotにはAIが組み込まれていますか?

Godot 4にはクラシックなゲームAIを実現するための基盤が備わっていますが、完成したAIブレインは含まれていません。NavigationServerとNavigationAgent2D・NavigationAgent3DによるパスファインディングはビルトインSupportされており、歩行可能エリアのためのNavigationRegionノード、視線判定のためのレイキャスト、検出ゾーン用のAreaノードも利用できます。ただし、意思決定のためのステートマシンやビヘイビアツリーは付属していないため、GDScriptで自分で書くかプラグインを追加する必要があります。言語モデルを使ったAIについては、外部モデルを呼び出すためのHTTPRequestは用意されていますが、組み込みのモデルは存在しません。Summer Engineのようなゴドト4互換のAIネイティブエンジンは、こうした意思決定ロジックをすべて自動で生成することができます。

Godotのゲームにパスファインディングを追加するにはどうすればよいですか?

3Dの場合は、NavigationRegion3Dを追加してレベル上にナビゲーションメッシュをベイクし、Godotが床の位置を認識できるようにします。移動させたいキャラクターにNavigationAgent3Dを追加し、スクリプトでset_target_positionに目的地を設定したあと、毎フィジクスフレームでget_next_path_positionを読み取ってその位置に向かって移動させます。2Dの場合も、NavigationRegion2DとNavigationAgent2Dを使って同じ流れになります。エージェントが障害物を避けたルートを処理してくれるため、AIスクリプトが決めるのは目的地だけであり、ルートを計算する必要はありません。

GodotでChatGPTのように会話できるAI NPCを作ることはできますか?

できます。GodotのHTTPRequestノードを使って、プレイヤーのメッセージとキャラクターを説明する短いシステムプロンプトを言語モデルに送り、返ってきた返答をセリフとして表示します。過去のやり取りをリストとして保持することでNPCに記憶を持たせ、明確な指示でモデルを制約することでキャラクターが逸脱したりゲームのトーンを壊したりしないようにします。注意点は、遅延・メッセージごとのコスト・インターネット接続が必要なため、オフラインでは動作しないことです。これが、LLMダイアログをすべてのNPCではなく、会話が特に重要な一部のキャラクターに限定するのが現実的なパターンである理由です。

GodotでAIを作るのにコーディングが得意である必要はありますか?

クラシックな挙動を実装するには、列挙型・match文・物理プロセスループといったGDScriptの基本が必要です。ガイドに沿って進めれば週末で習得できます。LLMを使ったNPCには、さらにHTTPリクエストとJSONの処理が必要になります。コーディングがネックになるなら、Summer EngineのようなGodot 4互換のAIネイティブエンジンを使えば、挙動を自然言語で説明するだけでステートマシンやナビゲーションコードを自動生成し、実際にゲームを動かして動作確認まで行ってくれます。パターンを理解しておくとより的確に指示できるようになるため、基礎を知ることは無駄になりません。

Summer EngineでAIの挙動を作るのは無料ですか?

Summer Engineには無料プランがあり、ステートマシンやナビゲーションなどのAI挙動コードの作成・テスト・エクスポートに対応しています。有料プランではより多くの使用量、高速なレスポンス、より強力なモデルが利用でき、日常的に開発する場合に有効です。パターンを習得して最初のAI搭載プロトタイプをリリースするには、無料プランで十分です。