Unity 6の2DでAddForceを使って物理的に移動する方法(慣性とLinear Damping)

広告

この記事は「Unity 6 2D移動の総合ガイド」の一部です。前の記事までは、座標や速度を直接指定して動かしていました。最後は、力を加えて動かす方法です。ボールや乗り物など、慣性を伴う動きに利用できます。

この記事で分かること

  • Rigidbody2D.AddForce()で、力を加えて動かす方法
  • 力を加えると、慣性で動き続ける理由
  • Linear Dampingで、速度を徐々に減らす方法
  • 速度を指定する方法との違い

1. 完成する動き

WASDキーで、オブジェクトに力を加えます。キーを押し続けると徐々に加速し、キーを離してもすぐには止まらず、慣性で滑ってから停止します。

力を加えると四角いオブジェクトが加速して動き、やがて減速して止まる動き

2. 準備

共通の準備は総合ガイドの「共通の準備」をご覧ください。Playerに、次のコンポーネントと設定を用意します。

  • Rigidbody 2D
  • Box Collider 2D
項目設定値の例理由
Body TypeDynamic物理演算に従って動くオブジェクトにする
Gravity Scale0重力で落ちないようにする(上下も自由に動かすため)
Linear Damping3速度を徐々に減らす強さ
Freeze Rotation Z有効回転しないようにする

前の記事のClickMoveなど、他の移動スクリプトが付いている場合は、取り外してください。

Linear Dampingは、以前のUnityではDragという名前でした。古い解説記事でDragという項目を見かけたときは、Linear Dampingと読み替えてください。

3. スクリプトを作る

ForceMoveという名前でスクリプトを作り、Playerに取り付けます。

ForceMove.cs

using UnityEngine;
using UnityEngine.InputSystem;

public class ForceMove : MonoBehaviour
{
    [SerializeField] float force = 10f;

    Rigidbody2D rb;
    Vector2 direction;

    void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        direction = Vector2.zero;

        if (Keyboard.current == null)
            return;

        if (Keyboard.current.aKey.isPressed)
            direction.x -= 1f;

        if (Keyboard.current.dKey.isPressed)
            direction.x += 1f;

        if (Keyboard.current.sKey.isPressed)
            direction.y -= 1f;

        if (Keyboard.current.wKey.isPressed)
            direction.y += 1f;

        direction.Normalize();
    }

    void FixedUpdate()
    {
        rb.AddForce(
            direction * force,
            ForceMode2D.Force
        );
    }
}

ゲームを再生して、WASDキーで動かしてみましょう。キーを離しても、すぐには止まらないことが分かります。

4. コードの解説

① AddForce()

rb.AddForce(direction * force, ForceMode2D.Force);

AddForce()は、Rigidbody2Dに力を加えます。まず、「方向×力の強さ」を渡しています。第2引数のForceMode2D.Forceは、継続的に加える力として扱う指定です。この指定は省略しても同じ動きになりますが、学習用に明示しています。

② 力を加えると、なぜ加速するのか

力は、「速度を変化させるもの」です。キーを押し続けると、毎回の物理更新で力が加えられ、速度が少しずつ増えていきます。キーを離しても、その時点の速度は残るため、慣性で動き続けます。

③ Linear Damping

力を加え続けるだけでは、速度がどこまでも増えてしまい、キーを離しても止まりません。Linear Dampingを設定すると、速度が徐々に減衰するようになり、次の2つの効果があります。

  • キーを離したあと、徐々に減速して停止する
  • キーを押し続けている間も、ある速さで頭打ちになる(力と減衰がつり合うところまでしか速くならない)

このサンプルでは、最高速度の目安は、約10 ÷ 3 ≈ 3.3です(質量が1の場合)。

④ パラメータの関係

変えるもの動きの変化
forceを大きくする加速が速くなり、最高速度も上がる
Linear Dampingを大きくする最高速度が下がり、すぐ止まる
Linear Dampingを0にする最高速度の上限がなく、滑り続ける
Rigidbody 2DのMass(質量)を大きくする同じ力でも、加速が遅くなる

5. 速度を指定する方法との違い

ここまでに学んだ物理的な移動を、比べてみましょう。

linearVelocity(④)MoveTowards(⑤)AddForce(⑫)
コードで指定するもの速度速度(少しずつ変化)力
キーを離すとすぐ止まる設定した減速で止まる慣性で動き続ける
動きの決め方コードで直接コードで加減速量を決める物理演算(質量やDamping)が決める
向いている用途プレイヤー、敵慣性のある操作ボール、乗り物

特に、⑤のMathf.MoveTowards()は「コードで加速・減速の強さを決める」方法です。一方、AddForce()は、物理エンジンに任せる方法です。これが大きな違いです。キャラクターを思い通りに、キビキビ動かしたいときは速度を指定する方法、物理らしい動きを作りたいときはAddForce()が向いています。

6. よくあるつまずき

症状確認すること
あまり動かないforceがLinear Dampingに対して小さすぎないか。Massが大きすぎないか
いつまでも滑り続けるLinear Dampingが0になっていないか
ゲーム開始と同時に落ちるGravity Scaleが0になっているか
動かないBody TypeがDynamicか。他の移動スクリプトと競合していないか
壁に当たって回転するFreeze Rotation Zにチェックが入っているか

7. 練習問題

  1. forceを変更して、動きがどう変わるか見てみましょう
  2. Linear Dampingを0、3、10に変更して、キーを離したときの動きを比べてみましょう
  3. Mass(質量)を1から5に変更して、加速がどう変わるか見てみましょう
  4. 壁(Colliderを持つSquare)を置いて、ぶつかったときの動きを確かめてみましょう

観察のポイント

  • 2つ目では、キーを離してから止まるまでの時間に注目しましょう。
  • 3つ目では、「同じ力でも重いと動きにくい」という感覚を確かめましょう。
  • 4つ目では、④と同じように、物理演算が衝突を扱うことを確認できます。

8. 発展:ノックバックとImpulse

ForceMode2D.Impulseを使うと、一瞬だけ強い力を加えられます。ノックバックや、ボールを蹴る動きに向いています。総合ガイドの「さらに学びたい移動の仕組み」でも紹介しています。

9. まとめ

  • AddForce()は、力を加えて動かす方法で、慣性を伴う
  • Linear Dampingで、速度を徐々に減らせる
  • 速度を指定する方法と、力を加える方法は、動きの性格が違う
  • 「見た目の動き」から連想して、どの方法を選ぶかを決める

次の記事では、物理を使いつつプログラムで動かすKinematicとMovePositionを紹介します。

訪問数 5 回, 今日の訪問数 1回

広告