ゲーム開発において、NPCがマップ内の障害物を避けながら目的地へ移動する「賢いAI移動」は、プレイヤーの体験を大きく向上させます。Godot Engineでは、この経路探索と障害物回避を NavigationRegion2D ノードと ナビゲーションメッシュ が担っています。
本記事では、これらのノードの役割と、それら を活用してキャラクターが障害物を避けてスムーズに移動する仕組みを、具体的なコード例とともに解説します。
なぜナビゲーションメッシュが必要なのか
キャラクターの移動に ナビゲーションメッシュ が必要なのは、従来の物理ベースの移動では、キャラクターが障害物に衝突するまでその存在を知ることができないためです。
ナビゲーションメッシュは、エージェントが 安全に移動できる領域 を定義するデータ構造です。物理コリジョンが「通れない場所」を定義するのに対し、ナビゲーションメッシュは「通れる場所」を明確に定義します。これにより、Godotのナビゲーションシステムは、衝突前に最適な経路(パス)を計算できるようになります。
NavigationRegion2Dの役割とメッシュの生成
NavigationRegion2D ノードは、ナビゲーションメッシュのデータ( NavigationMesh リソース)を保持し、そのメッシュをシーン内のどこに配置するかを定義します。
メッシュのベイク(生成)
ナビゲーションメッシュを生成するプロセスを「ベイク(Bake)」と呼びます。最も一般的な方法は、シーン内のコリジョン情報に基づいてメッシュを自動生成することです。
NavigationRegion2D のインスペクターで、以下の主要なプロパティを設定します。
| プロパティ名 | 説明 |
|---|---|
agent_radius | 移動するエージェントの半径。壁や障害物から安全な距離を保った「通れる領域」が計算されます。 |
source_geometry_mode | メッシュ生成の元となるジオメトリ(コリジョン)の取得方法を指定します。 |
これらの設定後、 NavigationRegion2D ノードを選択し、上部のメニューから「Bake Navigation Mesh」を実行することで、ナビゲーションメッシュが生成されます。
実践!障害物を避ける移動の実装
ナビゲーションメッシュ上でキャラクターを移動させるには、 NavigationAgent2D ノードを使用します。これは、移動するキャラクターの子として追加し、経路探索と移動の調整を行います。
スクリプトの実装
# CharacterBody2Dにアタッチするスクリプト
extends CharacterBody2D
@export var speed = 200.0
@onready var navigation_agent = $NavigationAgent2D
var target_position = Vector2.ZERO
func _ready():
navigation_agent.max_speed = speed
func _physics_process(delta):
if target_position != Vector2.ZERO:
navigation_agent.target_position = target_position
var next_location = navigation_agent.get_next_path_position()
var new_velocity = (next_location - global_position).normalized() * speed
velocity = navigation_agent.get_next_velocity()
move_and_slide()
func set_target(new_target: Vector2):
target_position = new_target
経路探索とRVO回避
NavigationAgent2D は、以下の二つの主要な役割を果たします。
- 経路探索:
get_next_path_position()で次の移動ポイントを提供し、キ ャラクターは静的な障害物(メッシュ外の領域)を避けることができます。 - RVO回避:
get_next_velocity()は、 RVO(Reciprocal Velocity Obstacles) に基づき、他の動くエージェントとの衝突を避けるために調整された速度ベクトルを返します。これにより、キャラクターは他のNPCと衝突しない、 協調的な移動 を実現できます。
動的な障害物への対応
ゲーム中に動的に出現する障害物(例: プレイヤーが設置したオブジェクト)を避けさせたい場合は、その障害物に NavigationObstacle2D ノードを追加します。
NavigationObstacle2D は、メッシュを再ベイクすることなく、その周囲に一時的な「回避領域」を設定します。これにより、 NavigationAgent2D を持つ他のエージェントは、この動的な障害物を避けるように動作を調整します。
まとめ
NavigationRegion2D とナビゲーションメッシュは、Godot Engineで賢いAI移動を実現するための基本要素です。
| 要素 | 役割 | 避ける対象 |
|---|---|---|
NavigationRegion2D | 移動可能領域(ナビゲーションメッシュ)の定義と保持 | 静的な壁や地形 |
NavigationAgent2D | 経路探索の実行と移動の調整 | 他 の動くエージェント、 NavigationObstacle2D |
このシステムを理解し活用することで、あなたのゲームのNPCは、マップの構造を理解し、他のキャラクターと協調しながら、賢く目的地へとたどり着くことができるでしょう。