AStarGrid2D 基礎編

グリッドベースのパスファインディングを実装する



1. AStarGrid2Dとは?

AStarGrid2Dは、Godot 4.4で導入されたクラスで、2Dグリッド上でのA*パスファインディングを簡単に実装できます。従来のAStar2Dよりも、グリッドベースのゲームに適した設計となっており、TileMapLayerとの連携も容易です。



2. AStarGrid2Dの設定

新しいシーンを作成し、ルートノードとしてNode2Dを追加します。
Node2Dの子として、AStarGrid2Dノードを追加し、名前をAStarGridに変更します。
AStarGridノードのインスペクターで、以下のプロパティを設定します:
cell_size: タイルのサイズ(例:Vector2(16, 16)
offset: グリッドのオフセット(通常はVector2(0, 0)

TileMapLayerとの連携

@onready var map: TileMapLayer = %Map
@export var tile_size: Vector2 = Vector2(16, 16)

var astar: AStarGrid2D = AStarGrid2D.new()

func _ready() -> void:
# マップ範囲をAStarに設定
var map_rect: Rect2i = map.get_used_rect()
astar.region = map_rect
astar.cell_size = tile_size
astar.update()



3. 移動可能・不可能なセルの設定

AStarGrid2Dでは、すべてのセルがデフォルトで移動可能とされています。移動不可能なセル(障害物など)を設定するには、以下のようにします:
# 移動不可能なセルを設定
astar_grid.set_point_solid(Vector2i(x, y), true)

これにより、指定したセルがパスファインディングの対象外となります。



4. パスの計算とユニットの移動

AStarGrid2Dを使用して、ユニットの移動経路を計算し、実際に移動させるには、以下のようにします:
# スタートとターゲットのセル座標
var start = Vector2i(1, 1)
var target = Vector2i(5, 5)

# パスの計算
var path = astar_grid.get_id_path(start, target)

# パスに従ってユニットを移動
for point in path:
var world_position = point * astar_grid.cell_size
# ユニットをworld_positionに移動させる処理

# 斜め移動をやめさせたい時は下記のように設定する
astar.diagonal_mode = AStarGrid2D.DIAGONAL_MODE_NEVER

get_id_path関数は、スタートからターゲットまでの最短経路を計算し、そのセル座標のリストを返します。


このようにしてAStarGrid2Dを活用することで、SRPGやタクティカルゲームのようなマップの表現力と管理性が大幅に向上します。

最終更新日: 2025/06/04 06:09

コメント