Unity入門

【Unity】Rigidbodyの使い方|物理挙動・接触判定・スクリプト制御

Unityで物理挙動を実現する際に欠かせないのが「Rigidbody」です。

この記事では、Rigidbodyの基本から、設定方法、最適な使い方、スクリプト制御の方法まで詳しく解説します!

この記事でわかること

  • Rigidbodyの基本的な役割と設定方法
  • 物理挙動を制御するための各種プロパティ
  • 物理演算を活用した移動や回転の方法
  • Rigidbodyを用いたゲーム開発の実践的なテクニック

※ RigidbodyにはColliderを使用することがほとんどなので以下のサイトも参考にしてください。

Rigidbodyの使い方

Rigidbody(リジッドボディ)とは、Unityの物理エンジンを適用するためのコンポーネントです
Rigidbodyを持つオブジェクトは、重力の影響を受けたり、他のオブジェクトと衝突したときに物理演算が適用されるようになります

Rigidbodyの役割
  • オブジェクトを自然に放置させる(重力適用)
  • 衝突判定をリアルに処理(壁や床との当たり判定)
  • 力を加えてオブジェクトを移動(AddForce, AddTorque)

Rigidbodyの設定方法

  1. Hierarchyでオブジェクトを選択
  2. InspectorでAdd Component → Rigidbodyを追加(今回は2Dは省略)
Unity Rigidbodyのコンポーネントの画像

Rigidbodyの設定項目

Rigidbodyには以下のような基本的なパラメータが設定できます。

パラメータ説明
Mass(質量)物オブジェクトの質量を指定
Linear Damping(空気抵抗)速度低下の度合いを指定
Angular Drag(回転抵抗)回転の減衰度合い
Use Gravity(重力の適用)重力の影響を受けるかどうか
Is Kinematic(運動制御の固定化)物理エンジンを無効にするか
Unity Rigidbodyの設定の画像

Rigidbodyのプロパティとその効果

Rigidbodyには、スクリプトからアクセスできるさまざまなプロパティがあります。代表的なものを紹介します。

位置・回転の取得

Vector3 position = rigidbody.position;
Quaternion rotation = rigidbody.rotation;

移動・回転の制御

rigidbody.MovePosition(transform.position + Vector3.forward * Time.deltaTime);
rigidbody.MoveRotation(Quaternion.Euler(0, 30, 0));

力を加える(AddForce)

rigidbody.AddForce(Vector3.up * 500);

ForceModeを指定すると異なる挙動が可能です。

  • Force(通常の力)
  • Impulse(瞬間的な力)
  • VelocityChange(速度変化)
  • Acceleration(加速度)

Rigidbodyを用いた移動と回転

Rigidbodyを使用すると、物理的な挙動を伴った移動や回転が可能です。

① 物理的に自然な移動

以下のコードはAddForceを使って前進させる例です。

void FixedUpdate()
{
    rigidbody.AddForce(transform.forward * 10, ForceMode.Force);
}

② プレイヤーの操作で移動

void FixedUpdate()
{
    float move = Input.GetAxis("Vertical");
    rigidbody.velocity = new Vector3(0, 0, move * 5f);
}

③ 回転の適用

void FixedUpdate()
{
    float rotate = Input.GetAxis("Horizontal");
    rigidbody.MoveRotation(rigidbody.rotation * Quaternion.Euler(0, rotate * 2f, 0));
}

Rigidbodyを活用したゲーム開発テクニック

衝突判定とイベント処理

Rigidbodyを持つオブジェクトが他のオブジェクトと衝突した際に、イベントを発生させることが可能です。

void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.tag == "Enemy")
    {
        Debug.Log("敵と衝突した!");
    }
}

物理ジャンプの実装

if (Input.GetKeyDown(KeyCode.Space))
{
    rigidbody.AddForce(Vector3.up * 300, ForceMode.Impulse);
}

地面との接触判定

bool isGrounded;
void OnCollisionStay(Collision collision)
{
    if (collision.gameObject.tag == "Ground")
    {
        isGrounded = true;
    }
}

void OnCollisionExit(Collision collision)
{
    if (collision.gameObject.tag == "Ground")
    {
        isGrounded = false;
    }
}

まとめ

Rigidbodyを適切に活用することで、物理演算を活かしたゲーム開発が可能になります。本記事で紹介した基本設定や移動方法、応用テクニックを活用しながら、さまざまなゲーム要素を実装してみましょう。

  • Rigidbodyを使うと、物理演算に基づいたリアルな動きを実装できる
  • AddForceやMovePositionを活用して自然な移動を実現
  • 衝突判定や重力を考慮した挙動を工夫することで、よりリアルなゲームが作れる