Godot Engineで使用するノードに関しての備忘録です。
この記事はGeminiを活用して作成しました。
1. はじめに
Godot Engineで衝突判定(当たり判定)の形を定義するために必須のノードです
Area2DやPhysicsBody2D(CharacterBody2Dなど)の親ノードとセットで使うことで 初めて衝突判定として機能するノードです
これ自体は目に見えない「判定の枠組み」を設定する役割を持っており ゲーム内のオブジェクトが「どこに当たったら反応するか」を決定するために持ちます
単体では機能しないため 必ず親ノードの警告を解消する形で追加されます
主な用途
- プレイヤーや敵キャラクターの物理的な身体の範囲設定
- 攻撃エフェクトや武器のヒットボックス(当たり判定)の作成
- コインやアイテムを拾う検知エリアの形づくり
- ステージの壁や床などの進入不可領域の定義
⚠️ 注意: CollisionShape2Dは単体では動作しません 必ずArea2DやCharacterBody2Dなどの子ノードとして配置し Shapeプロパティを設定する 必要があります
2. 代表的なプロパティ
インスペクターでよく設定する CollisionShape2Dの重要なプロパティです
| プロパティ | 説明 |
|---|---|
| Shape | 衝突判定の形状(形)を指定します(RectangleShape2DやCircleShape2Dなど) |
| Disabled | trueにすると その衝突判定が一時的に無効化されます(デス演出時などに便利) |
| One Way Collision | trueにすると 上からだけ乗れる床(一方通行の衝突)を作ることができます |
3. 代表的な形状(Shape)
Shapeプロパティで選択できる代表的な形状の特徴です
-
RectangleShape2D(長方形)
- ブロック、壁、プラットフォームなど四角いオブジェクトに最適で 処理負荷が最も軽いです
-
CircleShape2D(円形)
- コイン、弾、丸いキャラクターなどに最適で どの方向からも均等に判定されます
-
CapsuleShape2D(カプセル型)
- 二足歩行するプレイヤーや敵に最適で 段差などをスムーズに乗り越えやすくなります
-
SegmentShape2D(線分) / SeparationRayShape2D(光線)
- 地面との接地判定や 特定の境界線を作るときに使われます
4. 使い方(CharacterBody2Dへの適用例)
ゲーム開発で最もよく使う「動くキャラクター」に当たり判定を設定する基本手順です
🛠️ 設定の全体フロー
- Step 1: 親ノード(CharacterBody2Dなど)にCollisionShape2Dを追加する
- Step 2: Shapeプロパティで形状(カプセル型など)を選択する
- Step 3: スプライト(見た目)に合わせてサイズを調整する
📌 Step 1: ノードの追加
- シーンツリーで
CharacterBody2D(またはArea2D)を選択します -
+ボタン(ノードを追加)を押しCollisionShape2Dを検索して子ノードとして追加します - 追加した直後はノードの横に「⚠️」マーク(形状が未設定の警告)が出ています
📌 Step 2: 形状(Shape)の指定
- 追加した
CollisionShape2Dを選択します - インスペクターの一番上にある
Shapeプロパティの[空]をクリックします - ドロップダウンから
新規 CapsuleShape2D(またはオブジェクトに合う形)を選択します - これで警告マーク「⚠️」が消えます
📌 Step 3: サイズの調整
- 2Dビューポート上にビューアーが表示されます
- 形状の周りにある「赤や中空のドット(ハンドル)」をドラッグして大きさを変えられます
- 背景にあるSprite2D(キャラクター画像)のサイズにぴったり合うように調整します
5. 補足: スクリプトからの有効・無効化
ゲーム中に敵が倒れた瞬間や 無敵時間中に当たり判定を消したい場合のコード例です
extends CharacterBody2D
@onready var collision_shape = $CollisionShape2D
func disable_collision():
# 衝突判定を無効化する
collision_shape.disabled = true
func enable_collision():
# 衝突判定を有効化する
collision_shape.disabled = false
💡 ヒント:
物理演算(Physics)の処理中に disabled を直接変更すると警告が出る場合があります
その場合は set_deferred("disabled", true) を使うことで 安全に次のフレームで無効化できます

