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


コメント