【学習】Rigidbody2D クラス(物理演算)
Unity 入門シリーズでは、
- 当たり判定に Rigidbody2D を設定した
- AddForce でジャンプを実装した
という形で物理演算を学びました。
しかし、Rigidbody2D には他にも重要なプロパティやメソッドがあります。
Rigidbody2D クラス
の主な API をまとめて押さえましょう。
今回は Rigidbody2D のよく使うプロパティとメソッドを解説します。
今日学ぶこと
- velocity … 速度を直接設定する
- AddForce … 力を加える
- Body Type … Dynamic、Kinematic、Static
- gravityScale … 重力の強さ
- constraints … 回転・移動の固定
Rigidbody2D とは
Rigidbody2D は、2D の物理演算を適用するコンポーネントです。重力や衝突の影響を受けます。GetComponent で取得して使います。
private Rigidbody2D rb;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}velocity(速度)
velocity は、オブジェクトの現在の速度(Vector2)です。直接設定すると、その速度で動きます。
// 左右に移動(Y はそのまま=ジャンプ中も維持)
rb.velocity = new Vector2(moveX * speed, rb.velocity.y);
// 完全に止める
rb.velocity = Vector2.zero;AddForce より即効性があり、入力に素直に反応します。横スクロールのプレイヤー移動でよく使います。
AddForce(力を加える)
AddForce は、オブジェクトに力を加えます。慣性があるため、徐々に加速します。
// 右方向に力を加える
rb.AddForce(new Vector2(10, 0));
// ジャンプ(瞬間的に力を加える)
rb.AddForce(new Vector2(0, jumpForce), ForceMode2D.Impulse);| ForceMode2D | 説明 |
|---|---|
| Force | 質量を考慮した連続的な力(デフォルト) |
| Impulse | 瞬間的に速度を加える。ジャンプに適している |
Body Type(挙動の種類)
Inspector の Body Type で、物理演算の挙動を変えられます。
| Body Type | 説明 | 用途 |
|---|---|---|
| Dynamic | 重力・衝突の影響を受ける | プレイヤー、落下物、弾 |
| Kinematic | スクリプトで動かす。物理の影響を受けない | 動く床、エレベーター |
| Static | 動かない。当たり判定のみ | 壁、床 |
// スクリプトから変更(あまりしない)
rb.bodyType = RigidbodyType2D.Dynamic;gravityScale(重力の強さ)
gravityScale は、重力の倍率です。0 にすると重力がかかりません。
rb.gravityScale = 0; // 重力なし(横スクロールのプレイヤーなど)
rb.gravityScale = 1; // デフォルトの重力
rb.gravityScale = 2; // 2倍の重力constraints(固定)
constraints で、回転や特定軸の移動を固定できます。
// Z 軸の回転を固定(2D でキャラが傾かないように)
rb.constraints = RigidbodyConstraints2D.FreezeRotation;
// X 軸の移動も固定する場合
rb.constraints = RigidbodyConstraints2D.FreezePositionX | RigidbodyConstraints2D.FreezeRotation;| 定数 | 説明 |
|---|---|
| None | 固定なし |
| FreezePositionX | X 方向の移動を固定 |
| FreezePositionY | Y 方向の移動を固定 |
| FreezeRotation | 回転を固定 |
完成コード例(velocity で移動+ジャンプ)
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerMove : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpForce = 12f;
private Rigidbody2D rb;
private Vector2 moveInput;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void OnMove(InputValue value)
{
moveInput = value.Get<Vector2>();
}
void OnJump(InputValue value)
{
if (value.isPressed)
{
rb.AddForce(new Vector2(0, jumpForce), ForceMode2D.Impulse);
}
}
void Update()
{
float moveX = moveInput.x * speed;
rb.velocity = new Vector2(moveX, rb.velocity.y);
}
}重要ポイント
Rigidbody2D は 2D の物理演算を担当します。
- velocity … 速度を直接設定。入力に素直に反応
- AddForce … 力を加える。Impulse でジャンプ
- Body Type … Dynamic(動く)、Kinematic(スクリプトで動かす)、Static(動かない)
- gravityScale … 0 で重力なし
- constraints … 回転や軸の移動を固定
発展アイデア
- FixedUpdate … 物理演算は FixedUpdate で行うと安定しやすい(Update でも動く)
- MovePosition … Kinematic で滑らかに移動する
- OnCollisionEnter2D … 衝突時の処理
Rigidbody2D は 物理演算の要 です。当たり判定と組み合わせてゲームの動きを作ります。