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

はじめに

3Dゲーム開発で最も基本となるノードのひとつがStaticBody3Dです。このノードは物理演算の対象となる「動かない物体」を表現します。床、壁、天井、建物、障害物など、ゲームシーンの背景構造を作るのに欠かせません。本記事では、StaticBody3Dの使い方と活用方法を詳しく解説します。

StaticBody3Dとは?

StaticBody3Dは、物理エンジンに認識されるけれども、自分自身は動かないコリジョンボディです。つまり、他のオブジェクトはStaticBody3Dと衝突・相互作用しますが、重力や力の影響を受けません。

たとえ: ゲームの舞台となる建物や床のように、「プレイヤーやアイテムが触れると反応するが、自分からは動かない」という特性があります。

継承ツリー:
StaticBody3D → PhysicsBody3D → CollisionObject3D → Node3D → Node

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




StaticBody3Dのシーンツリー構造
StaticBody3DにはCollisionShape3Dを子ノードとして追加してコリジョンを定義します

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

使うべき場面:

  • ゲーム背景の構造物: 床、壁、天井、建物などの移動しないコリジョン
  • ダンジョンの柱や障害物: プレイヤーが避けたり乗り越えたりする構造
  • 動く床・エレベーター: constant_linear_velocityで一定速度で移動する床
  • コンベアベルト: constant_angular_velocityで回転する表面
  • 風や水流エリア: RigidBody3Dに力を加える環境オブジェクト

使わない場面:

  • 重力の影響を受けるべきオブジェクト(RigidBody3Dを使用)
  • プレイヤーキャラクター(CharacterBody3Dを使用)

主なプロパティと機能

プロパティ 説明 デフォルト値
constant_linear_velocity 毎フレーム一定の速度で移動(動く床・エレベーター用) Vector3(0, 0, 0)
constant_angular_velocity 毎フレーム一定の角速度で回転(回転床用) Vector3(0, 0, 0)
collision_layer このボディが存在するレイヤー(0〜31) 1
collision_mask このボディが衝突対象とするレイヤー(0〜31) 1
physics_material_override 摩擦係数や反発係数を定義 null

基本的な使用例1:床を作る

extends Node3D

func _ready():
	# StaticBody3Dを作成
	var floor = StaticBody3D.new()
	add_child(floor)

	# CollisionShape3Dを追加
	var collision = CollisionShape3D.new()
	floor.add_child(collision)

	# BoxShape3Dを使って床の形状を定義
	var box_shape = BoxShape3D.new()
	box_shape.size = Vector3(10, 1, 10)
	collision.shape = box_shape

	# ビジュアルも追加
	var mesh_instance = MeshInstance3D.new()
	floor.add_child(mesh_instance)
	var mesh = BoxMesh.new()
	mesh.size = Vector3(10, 1, 10)
	mesh_instance.mesh = mesh

基本的な使用例2:動く床(エレベーター)

extends StaticBody3D

func _ready():
	# 床を上下に移動させる
	constant_linear_velocity = Vector3(0, 2.0, 0)  # 1秒間に2ユニット上昇

	# CollisionShape3Dの子を作成(スクリプトがアタッチされたStaticBody3Dの場合)
	var collision = CollisionShape3D.new()
	add_child(collision)

	var box_shape = BoxShape3D.new()
	box_shape.size = Vector3(4, 1, 4)
	collision.shape = box_shape

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

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

パラメータ 効果 使用例
constant_linear_velocity 毎フレーム指定方向に移動(エレベーター・コンベア) Vector3(3, 0, 0) で毎フレーム右に移動
constant_angular_velocity 毎フレーム指定軸を中心に回転(回転床) Vector3(0, 3, 0) でY軸中心に回転
collision_layer このボディが属するレイヤー(複数選択可) 壁専用レイヤー、床専用レイヤーなど
collision_mask 衝突判定の対象レイヤー 敵は壁と衝突、プレイヤーのみ通す など
physics_material_override PhysicsMaterialで摩擦・反発を制御 氷の床(摩擦低い)、粘着性床(摩擦高い)




collision_layerとcollision_maskの設定
InspectorでCollisionレイヤーを設定し、複雑なゲーム規則を作成できます

まとめ

StaticBody3Dは、3Dゲーム世界の背景構造を定義する基本的かつ強力なノードです。

  • StaticBody3Dは自分では動かず、他のオブジェクトの衝突対象として機能します
  • constant_linear_velocityとconstant_angular_velocityで一定速度の移動・回転を実現できます
  • collision_layerとcollision_maskで細かい衝突規則を設定することで、複雑なゲーム世界を構築します

次回は、重力や力の影響を受けるRigidBody3Dについて解説します。プレイヤーが投げる物、破壊可能なオブジェクト、物理パズルなど、ダイナミックな動きを実現したいときに欠かせないノードです。

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

コメント