はじめに
2Dゲームを作るとき、主人公は動きますが、地面や壁、障害物は動きませんよね。こうした「動かない物理オブジェクト」を実装するのがStaticBody2Dです。
この記事では、以下を学べます:
- StaticBody2Dとはどういうノードか
- 地面・壁・障害物の作り方
- コンベアベルトなど特殊な使い方
- 物理演算との連携

StaticBody2Dとは?
StaticBody2Dは、シーンに配置された「動かない」2D物理ボディです。
ゲームの壁や地面、岩などの「ぶつかることはできるが動かされない物体」を実装するのに最適なノードです。
継承ツリー:
StaticBody2D
↑
PhysicsBody2D
↑
CollisionObject2D
↑
Node2D
↑
Node
↑
Object
StaticBody2Dを使うには、必ず子ノードにCollisionShape2Dを配置して、当たり判定の形状(矩形・円形など)を設定します。
このノードを使うべき場面
使う場面:
- ゲームの地面や床
- 壁や障害物(プレイヤーが押して動かせない)
- 動かない足場やプラットフォーム
- コンベアベルト(velocity設定で動く床のような効果)
- 一方通行の壁や仕掛け
使わない場面:
- 敵や動く物体 → CharacterBody2DやRigidBody2Dを使う
- プレイヤーキャラクター → CharacterBody2Dを使う
主なプロパティと機能
| プロパティ名 | 型 | 説明 |
|---|---|---|
constant_linear_velocity | Vector2 | 物理演算上、常に一定の速度で動いているとみなす。コンベアベルトの実装に使う |
constant_angular_velocity | float | 常に一定の角速度で回転しているとみなす |
collision_layer | int | このボディがどのレイヤーに属するか(1〜32層から選択) |
collision_mask | int | このボディが衝突判定の対象とするレイヤー |
physics_material_override | PhysicsMaterial | 摩擦係数や反発係数を設定 |
コード例1:地面と壁の設置
extends StaticBody2D
func _ready():
# StaticBody2Dは自動的に静止状態を保つ
# CollisionShape2Dを子ノードに追加すること
pass
# スクリプトはほぼ不要。配置して形状を決めるだけ
コード例2:コンベアベルトの実装
extends StaticBody2D
@export var conveyor_speed: float = 200.0
func _ready():
# 右方向に移動するコンベアベルト
constant_linear_velocity = Vector2(conveyor_speed, 0)
func _process(_delta):
# 動的に速度を変更する場合
constant_linear_velocity = Vector2(conveyor_speed, 0)

もっと使いこなす:カスタマイズできるパラメータ
| パラメータ | 設定値の例 | 用途 |
|---|---|---|
constant_linear_velocity | Vector2(200, 0) | 毎フレーム右へ200ピクセル分のベロシティを持つ(ただしBody自体は移動しない) |
constant_angular_velocity | 2.0(ラジアン/秒) | 回転する障害物や装置の実装 |
physics_material_override.friction | 0.5〜1.0 | 床の滑りやすさ。大きいほど滑りにくい |
physics_material_override.bounce | 0.0〜1.0 | ボールが当たったときの反発力 |
collision_layer | 1, 2, 4, 8, … (2のべき乗) | このオブジェクトがどのレイヤーに属するか |
まとめ
一言要約:StaticBody2Dは、動かない物理オブジェクト(地面・壁・障害物)を簡単に実装できるノードです。
ポイント:
- CollisionShape2Dを子ノードに追加して形状を定義する
- constant_linear_velocityで「動いているような」効果(コンベアベルト)を作れる
- collision_layer/maskで、どのオブジェクトと衝突するかを制御する
次回予告:次はTileMapLayerを解説します。多数のタイルを効率的に敷き詰めて2Dステージを構築する方法が分かります。



コメント