UnityUnityメモ

Unity初心者向け!リジッドボディの抵抗(Drag)を操作して落下速度を調整する方法

Unity

1. はじめに

Unityで物理シミュレーションを使用すると、ゲームのリアルな動きを簡単に表現できます。その中でも「Drag(抵抗)」は、オブジェクトが空気や水などの流体内で動く際に受ける抵抗を再現するための便利なプロパティです。

例えば、風船がゆっくりと地面に落ちるような動きや、パラシュートで落下速度をコントロールするシーンを作りたいときに役立ちます。Dragを調整することで、オブジェクトの落下速度や動きを簡単にカスタマイズできるのです。

この記事では、Unityの「Rigidbody」コンポーネントを使用して、オブジェクトのDragをスクリプトで操作し、リアルな動きを再現する方法を解説します。

Unityを触ったことがないという方はコチラの記事から見てみてください!



2. オブジェクトの準備

このステップでは、シーンに球体(Sphere)オブジェクトを追加し、物理的な特性を持たせるためにRigidbodyコンポーネントをアタッチします。これにより、スクリプトでDrag(抵抗)の値を操作できるようになります。

1. Sphereオブジェクトを作成する

まず、Unityエディターを開き、以下の手順でシーンにSphereオブジェクトを追加しましょう。

  1. ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
  2. 表示されるメニューから「3D Object」→「Sphere」を選択します。
  3. シーン内に球体が追加されます。

この手順を終えると、ヒエラルキーウィンドウに「Sphere」という名前のオブジェクトが表示されているはずです。

2. Rigidbodyコンポーネントをアタッチする

次に、Sphereオブジェクトに物理特性を追加します。これを行うことで、重力やDragなどの設定が有効になります。

  1. ヒエラルキーウィンドウで「Sphere」を選択します。
  2. インスペクター(Inspector)ウィンドウで「Add Component」ボタンをクリックします。
  3. 検索バーに「Rigidbody」と入力し、リストから「Rigidbody」を選択して追加します。

Rigidbodyが追加されると、以下のようなプロパティが表示されます。

  • Mass(質量)
  • Drag(抵抗)
  • Angular Drag(角抵抗)
  • Use Gravity(重力の使用)

このステップでは特に設定を変更する必要はありませんが、Dragの値を変更することでオブジェクトの挙動が変化することを後のステップで確認できます。


これで、シーンに物理的に動作するSphereオブジェクトが準備できました!次はスクリプトを作成して、Dragを動的に操作する方法を学びましょう。



3. スクリプトの作成

ここでは、Unityのスクリプトを作成して、リジッドボディの抵抗(Drag)を変更する方法を解説します。スクリプトを使うことで、空気抵抗のような効果を動的に追加できます。以下の手順に従って進めていきましょう。


ステップ 1: 新しいスクリプトを作成する

  1. プロジェクトウィンドウを開きます。
  2. ウィンドウ内で右クリックし、「Create」→「C# Script」を選択します。
  3. スクリプトの名前を「DragController」に変更します。
    • スクリプト名は後から変更できませんので、正確に入力しましょう。

ステップ 2: スクリプトを編集する

  1. 作成した「DragController」スクリプトをダブルクリックして、スクリプトエディタ(通常はVisual StudioまたはJetBrains Rider)が開きます。
  2. 以下のコードをコピーして、エディタ内に貼り付けます。
using UnityEngine;

public class DragController : MonoBehaviour
{
    Rigidbody rb;

    // 初期設定
    void Start()
    {
        // Rigidbodyの参照を取得
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        // 十字キーの上が押されたらDragの値を10に設定
        if (Input.GetKey(KeyCode.UpArrow))
        {
            rb.drag = 10f;
        }
        else
        {
            // 抵抗が無い状態(通常の速度で落下)
            rb.drag = 0f;
        }
    }
}

ステップ 3: コードの説明

  • Rigidbodyの取得
    rb = GetComponent<Rigidbody>();
    • 現在のオブジェクトにアタッチされているRigidbodyコンポーネントを取得します。これにより、Rigidbodyの設定を操作できるようになります。
  • Dragの値を変更
    rb.drag = 10f;
    • 十字キーの「上」(UpArrow)を押している間、Dragを10に設定します。この値を大きくするほど空気抵抗が強まり、落下速度が遅くなります。
    rb.drag = 0f;
    • キーを離した場合、Dragを0に戻します。これで抵抗がなくなり、通常の速度で落下します。
  • Input.GetKey(KeyCode.UpArrow)
    • ユーザーが特定のキーを押しているかどうかをチェックします。この例では「UpArrow」を検出していますが、他のキーに変更することも可能です。

ステップ 4: スクリプトをオブジェクトにアタッチ

  1. プロジェクトウィンドウで「DragController」を選択し、ヒエラルキーウィンドウの「Sphere」オブジェクトにドラッグ&ドロップします。
  2. スクリプトが正常にアタッチされたら、インスペクターに「DragController」が表示されます。

これでスクリプトの作成と適用は完了です!次に、テストプレイを行って動作を確認しましょう。十字キーの「上」を押している間に、球体の落下速度が遅くなることを確認してください。



4. スクリプトを適用してテストプレイ

ここでは、実際にテストプレイを行う手順を解説します。


テストプレイの手順

  1. 再生ボタンをクリック
    Unityエディターの上部にある「再生ボタン(▶)」をクリックして、プレイモードに入ります。
  2. 十字キーの「上」キーを押す
    プレイモード中にキーボードの「上」キーを押してみましょう。Sphereがゆっくりと落下するようになります。これは、スクリプトでRigidbodyのDrag値を「10」に設定しているためです。
  3. 「上」キーを離す
    「上」キーを離すと、Drag値が「0」に戻り、Sphereが通常の速度で落下します。この動作を繰り返して、Drag値がどのようにオブジェクトの挙動に影響を与えるかを確認してみてください。

注意点

  • Sphereが落下しない場合
    Rigidbodyの「Use Gravity」オプションがチェックされているか確認してください。これがオンになっていないと、重力が働かずSphereは落下しません。
  • スクリプトが適用されない場合
    コンソールウィンドウにエラーが表示されていないか確認してください。エラーがある場合は、スクリプトの記述やアタッチの手順を見直してください。

これで、スクリプトを適用してテストプレイを行う手順は完了です。実際に動かしてみると、Dragの値を調整することでオブジェクトの挙動がリアルタイムで変化するのを体験できるはずです!



5. より深い理解のために

この記事で紹介した「RigidbodyのDragを操作する」方法は、シンプルながらもゲームの物理シミュレーションにおいて重要な要素です。このセクションでは、さらに深く理解するために試してほしい応用例や関連するプロパティを紹介します。

5.1 動的なDragの調整

現在のスクリプトでは、十字キーの「上」キーを押すとDragが固定値(10)に設定される仕様です。ですが、状況に応じてDragの値を徐々に変化させることで、よりリアルな動きを表現できます。以下は、時間経過でDragを滑らかに増減させる例です。

void Update()
{
if (Input.GetKey(KeyCode.UpArrow))
{
// Dragを徐々に増加
rb.drag = Mathf.Lerp(rb.drag, 10f, Time.deltaTime * 2f);
}
else
{
// Dragを徐々に減少(元の状態に戻す)
rb.drag = Mathf.Lerp(rb.drag, 0f, Time.deltaTime * 2f);
}
}

Mathf.Lerpを使用することで、Dragの値がスムーズに変化します。この方法を使うと、キー入力に対するレスポンスが自然になり、プレイヤーにリアルな感覚を提供できます。


5.2 他のRigidbodyプロパティとの組み合わせ

Dragの調整だけでなく、Rigidbodyの他のプロパティを活用することで、さらにリアルな物理挙動を作成できます。以下にいくつかの例を挙げます。

  1. Mass(質量)
    オブジェクトの質量を変更すると、同じDrag値でも挙動が異なります。たとえば、重いオブジェクト(Massが大きい)ほど減速しにくく、軽いオブジェクト(Massが小さい)は空気抵抗の影響を強く受けます。rb.mass = 2f; // 質量を2に設定
  2. Angular Drag(回転抵抗)
    回転運動にも抵抗を設定できます。これを調整することで、例えば、ゆっくり回転しながら落下する羽のような挙動を作れます。rb.angularDrag = 5f; // 回転抵抗を5に設定
  3. Gravity(重力の影響)
    デフォルトでは、Rigidbodyは重力の影響を受けますが、これを無効にすることで浮遊感のある動きを実現できます。rb.useGravity = false; // 重力を無効化

5.3 実際のゲームでの応用例

Dragの調整は、次のようなゲームシステムで活用できます。

  • シューティングゲームの弾道シミュレーション
    弾丸が距離に応じて減速する動きを再現できます。
  • 飛行ゲームの空気抵抗
    高速飛行中にDragを増加させて、プレイヤーが速度を調整する体験を提供します。
  • 水中での動き
    水中ではDragを大きく設定し、オブジェクトがゆっくり動くようにします。

これらの応用例を試すことで、DragだけでなくUnityの物理エンジン全体をより深く理解できるようになります。ぜひ、いろいろなプロパティや数値を調整して、自分だけの物理挙動を作ってみてください!



よくある質問(FAQ)

Q
Dragの値をどのくらいに設定すればいいですか?
A

Dragの値は、オブジェクトがどの程度の抵抗を受けるかを調整するためのものです。値を大きくするほど、オブジェクトの動きが遅くなります。具体的な値はシーンや目的によりますが、以下を参考にしてください:

  • 小さい値(例: 0.1〜1): ゆるやかな減速や軽い空気抵抗を再現したいときに適しています。
  • 中くらいの値(例: 5〜20): 明確に動きを遅らせたい場合に使用します。
  • 大きい値(例: 50以上): ほぼ停止させたい場合に使います。

テストプレイしながら調整してみてください!

Q
Rigidbody以外でオブジェクトを操作する方法はありますか?
A

はい、Rigidbodyを使わずにオブジェクトを操作する方法もあります。例えば、Transformコンポーネントを使用して直接位置を変更する方法です。ただし、物理演算を伴う動き(重力や衝突)は再現できないため、リアルな物理動作が必要な場合はRigidbodyを使用するのがおすすめです。

例: Transformを使った移動コード

void Update()
{
transform.position += Vector3.down * Time.deltaTime;
}
Q
スクリプトが反映されない場合はどうすればいいですか?
A

スクリプトが正しく動作しない場合、以下のポイントを確認してください:

  1. スクリプトがオブジェクトにアタッチされているか
    スクリプトを作成しただけでは動作しません。必ず、オブジェクト(今回の場合はSphere)にアタッチしてください。
  2. エラーが発生していないか
    コンソールウィンドウを確認し、エラーが表示されている場合はコードを修正しましょう。特に、GetComponent<Rigidbody>()が正しく取得できているか確認してください。
  3. Unityのプレイモード中に操作しているか
    プレイモード中でないとスクリプトの動作が確認できません。右上の「▶(再生)」ボタンを押してからテストしてください。

これらをチェックしても解決しない場合は、公式ドキュメントやフォーラムで情報を探すと役立つことがあります!

おすすめのアセット

「Ball Run Shooter – Complete Game Template」は、ランナーとシューティングの要素が融合した3Dゲームテンプレートです。プレイヤーは移動しながらターゲットを撃破し、進むごとに新たなチャレンジが待ち受けます。UnityのBuilt-in、URP、HDRPに対応しており、スマートなスクリプト設計で初心者でも簡単にカスタマイズ可能です。ハイパーカジュアルなゲームのプロトタイプ開発に最適です。