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 凹多角形。複雑なメッシュ全体 地形、建物内部、複雑な静的オブジェクト

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

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

パラメータ 効果 使用例
disabled true で一時的に衝突を無効化。ポータルやすり抜け床 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をもとに執筆しています。

コメント