ノード解説「RigidBody2D」

はじめに

2Dゲームでキャラクターが地面に立ったり、ボールが転がったり、障害物にぶつかったりする動きを実装するとき、RigidBody2Dが活躍します。このノードについて見ていきましょう。

RigidBody2Dとは?

RigidBody2Dは、物理演算に基づいて動く2Dオブジェクトを表すノードです。重力や衝突の影響を受けながら、リアルな挙動をします。

たとえるなら、ゲーム画面に現実世界の「物体」を置いた感じ。木箱、ボール、落下する敵キャラなど、「物理法則に従って動く」ものはだいたいRigidBody2Dです。

RigidBody2DはPhysicsBody2Dを継承しており、Godot 4の物理エンジン(2D Physics Engine)と連携して、衝突判定や力の計算を自動で処理します。

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

  • プレイヤーキャラクターの移動:ジャンプ、落下、着地といった重力に影響される動きが必要な場合
  • 敵キャラクター:敵も重力や壁にぶつかる挙動をしてほしいとき
  • ボールや投げ物:放物線を描いて落ちるボール、斜め方向に飛ぶ矢など
  • 移動する障害物:床や足場が上下左右に動く場面
  • 複数オブジェクトの相互作用:複数の物体が衝突し合うシミュレーション

逆に、こんなときは別のノードが適切です:

  • 単に画面を移動するだけで物理演算が不要→CharacterBody2Dが使いやすい
  • 固定された背景や装飾→Node2Dの直下にSprite2Dを置く

主なプロパティと機能

プロパティ 意味 デフォルト値
Mass 物体の質量。重いぷど落下が遅く、衝突の影響を受けにくい 1.0
Gravity Scale このオブジェクトに働く重力の強さ。1.0が標準 1.0
Linear Velocity 現在の速度(ベクトル)。x, y方向の速度を数値で表現 (0, 0)
Freeze 特定の軸の動きを固定。チェックボックスで自由度を制限 チェックなし
Body Type 「Dynamic」「Static」「Kinematic」を選択。ほとんどはDynamic Dynamic

よく使うメソッドの例:


# 力を加える(物理演算で計算される)
rigid_body_2d.apply_force(Vector2(100, 0))

# 速度を直接設定
rigid_body_2d.linear_velocity = Vector2(50, -300)

# 角速度(回転速度)を設定
rigid_body_2d.angular_velocity = 2.5

# 瞬間的なインパルスを加える
rigid_body_2d.apply_impulse(Vector2(0, -500))

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

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

1. 重力の調整(Gravity Scale)

RigidBody2Dが受ける重力の強さを調整します。デフォルトは1.0ですが、変更することでゲームの感覚を大きく変えられます。

効果
0.5 月面のようにゆっくり落下。ジャンプが高く、ふわふわした感触
1.0 標準的な重力。Godot内で予め設定された重力値を使用
2.0 重力が2倍。素早い落下。アクションゲームに向く
0.0 無重力状態。横スクロールシューティングのような動きに

2. 質量(Mass)の活用

異なるオブジェクト同士が衝突したときの挙動に影響します。軽い敵は軽くぶっ飛び、重い敵はどっしりしています。

質量の値 挙動
0.5 軽い。衝突で大きく動く。矢や小石向け
1.0 標準。バランスの取れた動き
5.0以上 重い。ほぼ動かない。ボス敵や巨大な物体向け

3. 移動の制限(Freeze)

特定の軸の動きを止めることができます。例えばX軸をFreezeすると、左右には動かず上下だけ移動します。


# スクリプトから設定する場合
rigid_body_2d.freeze = true  # すべての動きを止める
rigid_body_2d.freeze_mode = RigidBody2D.FreezeModeEnum.KINEMATIC  # キネマティックモード

# または個別に軸を指定
rigid_body_2d.axis_lock_linear_x = true  # X軸方向の移動を禁止

4. ダンピング(減衰)で空気抵抗を表現

Linear DampingとAngular Dampingを調整すると、速度が徐々に落ちていく感覚が出ます。

ダンピング値 効果
0.0 ダンピングなし。一度動き始めたら永遠に進む
0.1~0.3 軽いダンピング。徐々に減速
1.0以上 強いダンピング。すぐに止まる。泥の中を動く感覚

5. 衝突レイヤーとマスク

どのオブジェクト同士が衝突するかを細かく制御できます。プレイヤーと敵は衝突するが、敵同士は衝突しないといった設定が可能です。


# スクリプトから衝突レイヤーを設定
rigid_body_2d.collision_layer = 1  # このオブジェクトはレイヤー1に属する
rigid_body_2d.collision_mask = 2   # レイヤー2のオブジェクトと衝突する

# または複数レイヤーの組み合わせ
rigid_body_2d.set_collision_layer_value(1, true)  # レイヤー1を有効
rigid_body_2d.set_collision_mask_value(2, true)   # レイヤー2を検知

6. 初速度を与える

ゲーム開始時や特定の瞬間に、RigidBody2Dに初速度を与えることでダイナミックな動きを作れます。


# プレイヤーがジャンプボタンを押したとき
if Input.is_action_just_pressed("jump"):
    rigid_body_2d.linear_velocity.y = -400  # 上方向の速度を設定

# インパルスで瞬間的な力を加える
if Input.is_action_just_pressed("dash"):
    rigid_body_2d.apply_impulse(Vector2(500, 0))  # 右方向にダッシュ

まとめ

RigidBody2Dは、物理演算に基づいて自然な動きをする2Dオブジェクト。キャラクターから小道具まで、ほぼすべての動く要素で活躍します。

  • 重力、衝突、速度の計算が自動で行われる
  • 質量やダンピングを調整してゲームの手触りを作り込める
  • CollisionShape2Dと組み合わせて、当たり判定の形を決める

次は、RigidBody2Dと組み合わせて使うCollisionShape2Dについて見ていきます。当たり判定の形を細かく制御する方法が分かると、ゲーム作りがぐっと楽になります。

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

  • 001. ノード解説「Node」
  • 002. ノード解説「Node2D」
  • 003. ノード解説「Sprite2D」
  • 004. ノード解説「AnimatedSprite2D」
  • 005. ノード解説「CharacterBody2D」
  • 006. ノード解説「CollisionShape2D」
  • 007. ノード解説「Area2D」
  • 008. ノード解説「RigidBody2D」
  • 009. ノード解説「TileMap」
  • 010. ノード解説「Timer」

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

コメント