Godot入門:CollisionShape3Dの使い方と活用法

はじめに

RigidBody3D、StaticBody3D、Area3D──こうした3D物理ノードは、CollisionShape3Dがなければ何もできません。見えない「形状」を与え、ゲーム世界に物体として存在させます。本記事では、CollisionShape3Dの使い方と各シェイプの選び方を詳しく解説します。

CollisionShape3Dとは?

CollisionShape3Dは、物理ノードに衝突形状を与える「目に見えない枠」です。自分で動いたり衝突したりはせず、親ノード(RigidBody3Dなど)の物理的な形状を定義する役割だけをします。

たとえ: 立体物を箱で梱包するのと同じ。箱そのものは不要な役割を果たしますが、内容物を保護し定義します。

継承ツリー:

CollisionShape3D → Node3D → Node

2D版との対応: このノードは2DのCollisionShape2Dと同じ役割を3D空間で果たします。

CollisionShape3Dの各シェイプタイプ
用途に応じて、最適なシェイプを選ぶことが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凹多角形。複雑なメッシュ全体地形、建物内部、複雑な静的オブジェクト

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

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

パラメータ効果使用例
disabledtrue で一時的に衝突を無効化。ポータルやすり抜け床disabled = true で敵をすり抜ける、disabled = false で復帰
position / rotation形状のオフセット。複数シェイプの配置調整頭と胴体の複数シェイプを同じボディに配置
scale形状を引き伸ばす。メッシュと形状の合わせ調整楕円ボール(非正円)、変形した敵
自動生成:Create Collision Siblingメッシュから自動的にコリジョン形状を生成(Inspectorから実行)複雑なメッシュの初期化
複数シェイプ結合複数のCollisionShape3Dを同じ親に追加して複雑形状を構成複雑な敵、建物、機械装置
CollisionShape3Dのインスペクター設定
InspectorでShape プロパティを選択し、各シェイプタイプを設定できます

まとめ

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をもとに執筆しています。

コメント