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

はじめに

2Dゲームを作るとき、主人公は動きますが、地面や壁、障害物は動きませんよね。こうした「動かない物理オブジェクト」を実装するのがStaticBody2Dです。

この記事では、以下を学べます:

  • StaticBody2Dとはどういうノードか
  • 地面・壁・障害物の作り方
  • コンベアベルトなど特殊な使い方
  • 物理演算との連携




StaticBody2Dの基本概念
StaticBody2Dは動かない物理オブジェクトを表現する

StaticBody2Dとは?

StaticBody2Dは、シーンに配置された「動かない」2D物理ボディです。

ゲームの壁や地面、岩などの「ぶつかることはできるが動かされない物体」を実装するのに最適なノードです。

継承ツリー:


StaticBody2D
  ↑
PhysicsBody2D
  ↑
CollisionObject2D
  ↑
Node2D
  ↑
Node
  ↑
Object

StaticBody2Dを使うには、必ず子ノードにCollisionShape2Dを配置して、当たり判定の形状(矩形・円形など)を設定します。

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

使う場面:

  • ゲームの地面や床
  • 壁や障害物(プレイヤーが押して動かせない)
  • 動かない足場やプラットフォーム
  • コンベアベルト(velocity設定で動く床のような効果)
  • 一方通行の壁や仕掛け

使わない場面:

  • 敵や動く物体 → CharacterBody2DRigidBody2Dを使う
  • プレイヤーキャラクター → 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)




StaticBody2Dのプロパティパネル
インスペクターでプロパティを調整する

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

パラメータ 設定値の例 用途
constant_linear_velocity Vector2(200, 0) 毎フレーム右へ200ピクセル分のベロシティを持つ(ただしBody自体は移動しない)
constant_angular_velocity 2.0(ラジアン/秒) 回転する障害物や装置の実装
physics_material_override.friction 0.51.0 床の滑りやすさ。大きいほど滑りにくい
physics_material_override.bounce 0.01.0 ボールが当たったときの反発力
collision_layer 1, 2, 4, 8, … (2のべき乗) このオブジェクトがどのレイヤーに属するか

まとめ

一言要約:StaticBody2Dは、動かない物理オブジェクト(地面・壁・障害物)を簡単に実装できるノードです。

ポイント:

  • CollisionShape2Dを子ノードに追加して形状を定義する
  • constant_linear_velocityで「動いているような」効果(コンベアベルト)を作れる
  • collision_layer/maskで、どのオブジェクトと衝突するかを制御する

次回予告:次はTileMapLayerを解説します。多数のタイルを効率的に敷き詰めて2Dステージを構築する方法が分かります。

シリーズ:Godot 4 ノード解説

  • 001-040: 基本ノード(準備中)
  • 041:StaticBody2D
  • 042:TileMapLayer
  • 043:AnimationPlayer
  • 044:AnimationTree
  • 045:AudioStreamPlayer
  • 046:AudioStreamPlayer2D
  • 047:GPUParticles2D
  • 048:CPUParticles2D
  • 049:Line2D
  • 050:CanvasLayer

この記事はGodot 4.xをもとに執筆しています。

コメント