はじめに
3Dゲーム開発で最も基本となるノードのひとつがStaticBody3Dです。このノードは物理演算の対象となる「動かない物体」を表現します。床、壁、天井、建物、障害物など、ゲームシーンの背景構造を作るのに欠かせません。本記事では、StaticBody3Dの使い方と活用方法を詳しく解説します。
StaticBody3Dとは?
StaticBody3Dは、物理エンジンに認識されるけれども、自分自身は動かないコリジョンボディです。つまり、他のオブジェクトはStaticBody3Dと衝突・相互作用しますが、重力や力の影響を受けません。
たとえ: ゲームの舞台となる建物や床のように、「プレイヤーやアイテムが触れると反応するが、自分からは動かない」という特性があります。
継承ツリー:
StaticBody3D → PhysicsBody3D → CollisionObject3D → Node3D → Node2D版との対応: このノードは2DのStaticBody2Dと同じ役割を3D空間で果たします。

このノードを使うべき場面
使うべき場面:
- ゲーム背景の構造物: 床、壁、天井、建物などの移動しないコリジョン
- ダンジョンの柱や障害物: プレイヤーが避けたり乗り越えたりする構造
- 動く床・エレベーター: 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で摩擦・反発を制御 | 氷の床(摩擦低い)、粘着性床(摩擦高い) |

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


コメント