ノード解説「CollisionShape2D」

はじめに

キャラクターが壁に当たったり、アイテムを拾ったり、敵と接触判定を取るゲーム。こうした「物の当たり判定」を扱うとき、どのように実装していますか?ここで登場するのがCollisionShape2Dです。この記事では、CollisionShape2D がどのように機能するのか、そしてゲーム開発で欠かせない役割を担う理由を解説します。

CollisionShape2D とは?

CollisionShape2D は、2D ノードに対して「衝突判定のための形を与える役割を持つノードです。ゲーム内の物体が別の物体と接触したかどうかを判定する仕組みの一部になります。

たとえば、目玉焼きの「形」を決める抜き型のようなもの。ゲームキャラクターの体型を四角や円の形で代表させて、衝突判定を効率よく処理するのです。

CollisionShape2D は Physics2DServer という物理演算システムと連携します。親ノード(CharacterBody2D、RigidBody2D、Area2D など)に衝突判定の形を与えることで、ゲーム内の物理的なインタラクションが成り立ちます。

このノードを使うべき場面

  • キャラクターの衝突判定:プレイヤーが壁に衝突したり、階段を上ったりするとき
  • 敵やアイテムとの接触判定:敵に触れたらゲームオーバー、アイテムに触れたら拾う、といった判定
  • 攻撃判定(ヒットボックス):剣の一撃が敵に当たったかどうかを判定するとき
  • クリック判定:ゲーム画面上のボタンやアイコンに触れたかどうかを判定するとき
  • 範囲判定:「このエリアに敵が入ったら何か起こす」といった範囲チェック

注意:CollisionShape2D だけでは機能しません。必ず親ノードが物理ボディ(CharacterBody2D、RigidBody2D、Area2D など)であることが前提です。

主なプロパティと機能

プロパティ 説明 デフォルト値
shape 衝突判定の形状(CircleShape2D、RectangleShape2D など)
disabled true にすると、この衝突判定を無効化できる false
position 親ノードからの相対位置 (0, 0)
rotation 衝突判定の回転(ラジアン) 0
scale 衝突判定のスケール (1, 1)

CollisionShape2D 自体にはメソッドがほとんどありません。代わりに、親ノード側で衝突判定をハンドルします。

コード例:基本的な設定


# キャラクターノードにCollisionShape2Dの子を追加
var collision_shape = CollisionShape2D.new()
var circle_shape = CircleShape2D.new()
circle_shape.radius = 16.0

collision_shape.shape = circle_shape
add_child(collision_shape)

この例では、半径 16 ピクセルの円形衝突判定をキャラクターに与えています。

もっと使いこなす:カスタマイズできるパラメータ

まずは基本を動かしてみてから、余裕が出たら試してみてください。

1. 衝突判定の形状をゲームに合わせる

形状 適した場面 変更のポイント
CircleShape2D(円) 丸いキャラクター、玉、爆発範囲 circle_shape.radius で半径を変更
RectangleShape2D(矩形) 箱や壁、プラットフォーム rect_shape.size で幅・高さを変更
CapsuleShape2D(カプセル) 立ったキャラクター、縦長のオブジェクト capsule_shape.radiuscapsule_shape.height で調整
PolygonShape2D(多角形) 複雑な形の敵やボス、不規則な地形 polygon_shape.polygon

2. 衝突判定のオフセット

キャラクターの絵柄と衝突判定が合わない場合、CollisionShape2D の position で微調整できます。


var collision_shape = CollisionShape2D.new()
# 親ノードの中心より、少し下に判定をずらす
collision_shape.position = Vector2(0, 8)

3. 動的に衝突判定を有効・無効にする

無敵状態や、特定の条件下では衝突判定が不要な場面があります。disabled プロパティで制御できます。


# 一時的に衝突判定を無視する
collision_shape.disabled = true

# 一定時間後に戻す
await get_tree().create_timer(1.0).timeout
collision_shape.disabled = false

4. 複数の衝突判定を組み合わせる

複雑な形のオブジェクトには、複数の CollisionShape2D を子に持たせることで対応できます。


# 体と頭、2つの円で複合形状を表現
var body = CollisionShape2D.new()
var body_shape = CircleShape2D.new()
body_shape.radius = 12.0
body.shape = body_shape
body.position = Vector2(0, 4)

var head = CollisionShape2D.new()
var head_shape = CircleShape2D.new()
head_shape.radius = 8.0
head.shape = head_shape
head.position = Vector2(0, -8)

add_child(body)
add_child(head)

5. 衝突判定層(collision layer・collision mask)の活用

同じシーンに多数のオブジェクトがあるとき、すべての衝突判定を チェックするのは非効率です。「どの層の物体同士が衝突するか」を指定できます(インスペクタでも設定可能)。


# プレイヤーは層1に属する
collision_layer = 1
# プレイヤーは層2(敵)と層3(壁)の衝突を監視する
collision_mask = 0b0110  # ビット表記で層2と3を有効

まとめ

CollisionShape2D は、2D ゲームの衝突判定を与える基盤です。キャラクターが壁にぶつかり、敵と接触し、アイテムを拾う—これらすべてが CollisionShape2D なしには実現しません。親ノードの種類(CharacterBody2D、RigidBody2D、Area2D)に応じて、衝突判定の結果は異なりますが、「形を与える」という役割は変わりません。

  • 必ず物理ボディノードの子として配置する
  • shape プロパティで衝突判定の形を決める
  • position や rotation で位置や向きを微調整する

次の記事では、CharacterBody2D という、このCollisionShape2D をもっともよく使うノードを詳しく解説します。

シリーズ:Godot 4 ノード解説

この記事は Godot 4.x をもとに執筆しています。

コメント