Unity 6の2DでAddForceを使って物理的に移動する方法(慣性とLinear Damping)
この記事は「Unity 6 2D移動の総合ガイド」の一部です。前の記事までは、座標や速度を直接指定して動かしていました。最後は、力を加えて動かす方法です。ボールや乗り物など、慣性を伴う動きに利用できます。
この記事で分かること
Rigidbody2D.AddForce()で、力を加えて動かす方法- 力を加えると、慣性で動き続ける理由
Linear Dampingで、速度を徐々に減らす方法- 速度を指定する方法との違い
1. 完成する動き
WASDキーで、オブジェクトに力を加えます。キーを押し続けると徐々に加速し、キーを離してもすぐには止まらず、慣性で滑ってから停止します。
2. 準備
共通の準備は総合ガイドの「共通の準備」をご覧ください。Playerに、次のコンポーネントと設定を用意します。
- Rigidbody 2D
- Box Collider 2D
| 項目 | 設定値の例 | 理由 |
|---|---|---|
| Body Type | Dynamic | 物理演算に従って動くオブジェクトにする |
| Gravity Scale | 0 | 重力で落ちないようにする(上下も自由に動かすため) |
| Linear Damping | 3 | 速度を徐々に減らす強さ |
| 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. 練習問題
forceを変更して、動きがどう変わるか見てみましょう- Linear Dampingを0、3、10に変更して、キーを離したときの動きを比べてみましょう
- Mass(質量)を1から5に変更して、加速がどう変わるか見てみましょう
- 壁(Colliderを持つSquare)を置いて、ぶつかったときの動きを確かめてみましょう
観察のポイント
- 2つ目では、キーを離してから止まるまでの時間に注目しましょう。
- 3つ目では、「同じ力でも重いと動きにくい」という感覚を確かめましょう。
- 4つ目では、④と同じように、物理演算が衝突を扱うことを確認できます。
8. 発展:ノックバックとImpulse
ForceMode2D.Impulseを使うと、一瞬だけ強い力を加えられます。ノックバックや、ボールを蹴る動きに向いています。総合ガイドの「さらに学びたい移動の仕組み」でも紹介しています。
9. まとめ
AddForce()は、力を加えて動かす方法で、慣性を伴うLinear Dampingで、速度を徐々に減らせる- 速度を指定する方法と、力を加える方法は、動きの性格が違う
- 「見た目の動き」から連想して、どの方法を選ぶかを決める
次の記事では、物理を使いつつプログラムで動かすKinematicとMovePositionを紹介します。










ディスカッション
コメント一覧
まだ、コメントがありません