はじめに
RigidBody3D、StaticBody3D、Area3D──こうした3D物理ノードは、CollisionShape3Dがなければ何もできません。見えない「形状」を与え、ゲーム世界に物体として存在させます。本記事では、CollisionShape3Dの使い方と各シェイプの選び方を詳しく解説します。
CollisionShape3Dとは?
CollisionShape3Dは、物理ノードに衝突形状を与える「目に見えない枠」です。自分で動いたり衝突したりはせず、親ノード(RigidBody3Dなど)の物理的な形状を定義する役割だけをします。
たとえ: 立体物を箱で梱包するのと同じ。箱そのものは不要な役割を果たしますが、内容物を保護し定義します。
継承ツリー:
CollisionShape3D → Node3D → Node2D版との対応: このノードは2DのCollisionShape2Dと同じ役割を3D空間で果たします。

このノードを使うべき場面
使うべき場面:
- すべての3D物理ノード: RigidBody3D、StaticBody3D、Area3D、CharacterBody3Dなど
- 複雑な形状: 複数のCollisionShape3Dを組み合わせて凹凸を表現
- パフォーマンス最適化: 精密な形状よりもシンプルな形状で CPU負荷を削減
- トリガーゾーン: 見えない当たり判定エリア
- キャラクターコリジョン: プレイヤーの当たり判定をカプセル形状で
使わない場面:
- 物理ノードの親がない場合(効果なし)
主なプロパティと機能
| プロパティ | 説明 | デフォルト値 |
|---|---|---|
| shape | 衝突形状(BoxShape3D、SphereShape3D、CapsuleShape3D など) | BoxShape3D |
| disabled | このコリジョンを無効にする(true = 衝突なし) | false |
| scale | 形状のスケール | Vector3(1, 1, 1) |
| position / rotation | 形状の位置・角度(親ノードからのオフセット) | Vector3(0, 0, 0) / Vector3(0, 0, 0) |
基本的な使用例1:RigidBody3Dに球形の衝突を追加
extends Node3D
func _ready():
# RigidBody3Dを作成
var ball = RigidBody3D.new()
add_child(ball)
# CollisionShape3Dを作成
var collision = CollisionShape3D.new()
ball.add_child(collision)
# SphereShape3Dを設定
var sphere = SphereShape3D.new()
sphere.radius = 1.0
collision.shape = sphere
# ビジュアルも追加
var mesh_instance = MeshInstance3D.new()
ball.add_child(mesh_instance)
var mesh = SphereMesh.new()
mesh.radial_segments = 32
mesh.rings = 16
mesh_instance.mesh = mesh
基本的な使用例2:複雑な形状を複数シェイプで構成
extends StaticBody3D
func _ready():
# 胴体用のカプセルシェイプ
var body_collision = CollisionShape3D.new()
add_child(body_collision)
var capsule = CapsuleShape3D.new()
capsule.height = 2.0
capsule.radius = 0.5
body_collision.shape = capsule
# 頭部用の球形シェイプ
var head_collision = CollisionShape3D.new()
add_child(head_collision)
head_collision.position = Vector3(0, 1.5, 0)
var sphere = SphereShape3D.new()
sphere.radius = 0.6
head_collision.shape = sphere
# 腕パーツは無視(複雑さ軽減)
シェイプの種類と特徴
| シェイプ | 特徴 | 使用例 | CPU負荷 |
|---|---|---|---|
| BoxShape3D | 立方体。最も単純で高速 | 建物、床、壁、箱 | 最低 |
| SphereShape3D | 球体。ボーリングのボール、丸い物体 | ボール、爆弾、惑星 | 低 |
| CapsuleShape3D | 球柱(球 + 柱)。キャラクター向け | プレイヤー、敵、人型キャラ | 低 |
| CylinderShape3D | 円柱。棒状オブジェクト | 柱、樽、パイプ | 低 |
| ConvexPolygonShape3D | 凸多角形。複雑だが精密 | 複雑な小道具、岩 | 中 |
| ConcavePolygonShape3D | 凹多角形。複雑なメッシュ全体 | 地形、建物内部、複雑な静的オブジェクト | 高 |
もっと使いこなす:カスタマイズできるパラメータ
まずは基本を動かしてみてから、余裕が出たら試してみてください。
| パラメータ | 効果 | 使用例 |
|---|---|---|
| disabled | true で一時的に衝突を無効化。ポータルやすり抜け床 | disabled = true で敵をすり抜ける、disabled = false で復帰 |
| position / rotation | 形状のオフセット。複数シェイプの配置調整 | 頭と胴体の複数シェイプを同じボディに配置 |
| scale | 形状を引き伸ばす。メッシュと形状の合わせ調整 | 楕円ボール(非正円)、変形した敵 |
| 自動生成:Create Collision Sibling | メッシュから自動的にコリジョン形状を生成(Inspectorから実行) | 複雑なメッシュの初期化 |
| 複数シェイプ結合 | 複数のCollisionShape3Dを同じ親に追加して複雑形状を構成 | 複雑な敵、建物、機械装置 |

まとめ
CollisionShape3Dは、3D物理ノードに「物質性」を与える不可欠な子ノードです。
- BoxShape3D、SphereShape3D、CapsuleShape3Dなど6種類のシェイプから、用途に応じた形状を選ぶことが重要です
- 複数のCollisionShape3Dを組み合わせることで、複雑なコリジョン形状を実現できます
- disabledプロパティで一時的に衝突を無効化し、ゲームロジックを柔軟に制御できます
次回は、3D世界を照らすOmniLight3Dについて解説します。点光源の設定で、ゲームの雰囲気や見た目がガラッと変わります。
シリーズ:Godot 4 ノード解説
001〜040:各種ノード
041〜060:
041:Node / 042:Node2D / 043:Node3D / 044:Control / 045:Canvas Layer / 046:Sprite2D / 047:Sprite3D / 048:Label / 049:Button / 050:ColorRect / 051:TextureRect / 052:AnimatedSprite2D / 053:AnimationPlayer / 054:CharacterBody3D / 055:PhysicsBody3D / 056:StaticBody3D / 057:RigidBody3D / 058:Area3D / 059:CollisionShape3D / 060:OmniLight3D
この記事はGodot 4.xをもとに執筆しています。


コメント