UnityのRigidbody.AddForceを使いこなす方法

ゲーム開発

はじめに

皆さんがUnityでゲームを作ろうとするとき、物理演算を活用する機会は多いのではないでしょうか。 重力や衝突判定などを考えずとも、Rigidbodyコンポーネントが手軽に役立ってくれます。

とはいえ、Rigidbodyの機能をいざ使おうとすると、どう設定すれば思い通りの動きを実現できるのか迷う方もいるかもしれません。 加速度や衝撃を与えるメソッドにもいくつかの種類があり、それぞれの特徴を理解しないまま使うと結果が予想と違うことがあります。

Rigidbody.AddForce は、物理演算において動的に力を与えるための代表的なメソッドです。 あらゆる方向に力を加えられるので、ゲームオブジェクトを直感的に動かすうえで欠かせない存在になりやすいでしょう。

このAddForceを適切に使えるようになると、ジャンプや弾丸の発射といったシンプルな動きから、乗り物の加速や重力を無視した特殊な挙動まで表現しやすくなります。 つまり、物体に与える力の仕組みを抑えておくことで、動きにバリエーションが増えやすくなるということです。

今回は、最新バージョンのUnityを前提に、AddForceの基本的な仕組みから、よく使うForceModeの解説、実際のコード例などを踏まえて詳しく紹介します。 これを読めば、物理演算を使ったアクションやリアルな移動を作る際の「どうすればいいか」が見えてくるかもしれません。

最終的に、AddForceの特徴や注意点を理解しておくことで、プログラミング初心者でもスムーズに物理挙動を活用しやすくなります。 それでは、まずはRigidbody.AddForceの背景や、どういった場面で便利なのかを見てみましょう。

UnityでRigidbody.AddForceを使う背景

Unityでは、オブジェクトを動かす方法としてTransformを直接操作するやり方と、Rigidbodyを使って物理的な動きを表現するやり方があります。 Transformを直接変更する場合は即座に位置を切り替えるのに便利ですが、リアルな慣性や衝突反応は自動で再現されにくいです。

一方でRigidbodyを使う場合は、Unityが用意している物理演算エンジンが動きを計算してくれます。 物体の質量や重力、衝突時の反発などを踏まえた動きが得られるので、ゲーム内のリアリティや予測不能な挙動を作り込みたいときにも役立つでしょう。

実務でもRigidbodyはさまざまなジャンルのゲームで利用され、特にアクションやシューティング、レースなどのシーンで重宝されます。 ジャンプ挙動を細かく調整したり、弾丸や物体を飛ばしたりといった演出が簡単に行えるのもRigidbodyを活用する利点のひとつです。

AddForce はRigidbodyを用いた力の加え方としてはオーソドックスなメソッドです。 オブジェクトに継続的な力を加えたり、瞬間的に大きな力を与えたりと、力の加え方を多彩にコントロールできます。

ただし、どのForceModeを選ぶかや、どのタイミングで力を加えるかで挙動が変わりやすいです。 誤った使い方をするとまったく動かなかったり、想定以上に強く飛んでいくことがありえます。

そこで、これからAddForceの基本仕組みを解説し、ForceModeの違いを整理しつつ、実際にコードでどのように使うかを見ていきましょう。 こうした背景を理解するだけでも、ゲーム制作の物理演算に対するイメージが明確になりやすいはずです。

Rigidbody.AddForceの基本的な仕組み

Rigidbody.AddForceは、Rigidbodyが付与されたオブジェクトに対して、加速度衝撃などの形で力を加えるメソッドです。 引数としてはVector3型の方向や強さ、そしてForceModeと呼ばれるオプションを指定できます。

実行するタイミングとしては、FixedUpdateで呼ぶのが基本的には推奨されています。 なぜなら、物理演算はフレームレートとは独立した物理ステップで処理されるため、FixedUpdateで力を加えると物理演算との整合性が保ちやすいからです。

AddForceを連続的に呼び出すと、その分だけ力が積み重なっていきます。 ゆるやかに推進するような動きから瞬発的な跳躍まで、力の加え方によってバリエーションをつけられるわけです。

一方で、力を加えすぎると制御しにくい挙動になったり、オブジェクトが想定外の速度に達することがあります。 また、Rigidbodyを使うならisKinematicをオフにしておく必要がある点に注意しましょう。 isKinematicがオンのオブジェクトには物理演算が働かないので、AddForceを呼んでも動かないままになりやすいです。

ForceModeオプション

AddForceの第2引数として指定できるForceModeは、力のかけ方を大きく左右します。 ここでは代表的な4種類をまとめました。

ForceMode説明
Force物体の質量を考慮した力を加えます。連続的な推進力として扱う場合に役立ちます。
Impulse短い時間で大きな力を与えます。ジャンプや爆発のような瞬間的な動作に適しています。
VelocityChange速度を直接変化させます。質量の影響を受けないため、小さい質量のオブジェクトでもすぐに加速できます。
Acceleration質量を無視して継続的に加速度を与えます。外力による加速を一定に保ちたいときに便利です。

これらを正しく使い分けることで、オブジェクトの動きに個性を出しやすくなります。 例えば、ロケットの推進にはForceを使い、弾丸の発射にはImpulseやVelocityChangeを活用するといった具合です。

Vector3と向き

AddForceではVector3 で力の向きと大きさを指定します。 たとえば、Vector3.up なら上方向に、Vector3.forward なら前方向に、という具合に方向ベクトルを利用できます。

ただし、前方向といってもカメラやプレイヤーの向きがバラバラだと混乱しやすいので、オブジェクトのTransform.forwardTransform.upを使って、オブジェクト基準で方向を決める方法もよく使われます。 また、スクリプト内で適切にベクトルを組み立てる工夫をすると、狙った軸へ力を加えやすくなるでしょう。

実用的な使用例

ここでは、実際にRigidbody.AddForceを使ううえで役立つコード例を見てみます。 まずは最もシンプルなジャンプ処理から始めましょう。

シンプルなジャンプ

以下は、プレイヤーキャラクターがスペースキーを押したら上方向へジャンプするようなコード例です。

using UnityEngine;

public class PlayerJump : MonoBehaviour
{
    public float jumpForce = 300f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }
    }
}

この例では、ForceMode.Impulse を使うことで瞬間的に強い力を与えています。 「質量も考慮した推進力」というよりは「弾けるような動き」を実現できるのがポイントです。

もし、着地時にもう少し緩やかにアニメーションしたいなら、RigidbodyのDragMassなどを調整するとよいでしょう。 こうすることで、着地や落下速度を微調整しながら自然な動きを付けられます。

方向を指定する移動

次は、キー入力によって前後左右へ加速させるケースを考えてみます。 たとえばWキーで前進、Sキーで後退、Aキーで左、Dキーで右というように、キャラクターを動かす例です。

using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    public float speed = 10f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        Vector3 direction = new Vector3(x, 0f, z);
        rb.AddForce(direction * speed, ForceMode.Force);
    }
}

ここではForceMode.Force を指定し、連続的な推進力を与えています。 入力に応じて力を加えることで、前進方向へじわじわと加速するような動きを作りやすいです。

もし瞬間的に向きを変えたいなら、VelocityChange を使って速度そのものを直接変更する方法も考えられます。 しかし、VelocityChangeは質量を無視して速度を変えるので、慣性や重みを表現したいときには注意が必要です。

実務での活用シーン

Rigidbody.AddForceを使った動きは、実務でも多くのジャンルで応用が期待できます。 たとえばプラットフォーマーゲームなら、プレイヤーのジャンプ挙動にAddForceを組み合わせて奥行きのあるアクションを演出しやすくなります。

また、レースゲームでは車やバイクなどの乗り物に連続的にForceを与えることで、加速や減速を自然な流れで再現できます。 リアルなハンドリングを表現したい場合は、AddTorque(回転方向の力)と組み合わせるとより多彩な表現が可能です。

シューティングゲームでは、弾丸やロケット弾をImpulseやVelocityChangeで一気に発射するやり方が多いでしょう。 弾速の調整やエフェクトとの連動次第で、射撃感のある動きを作りやすくなります。

他にも、物理パズルゲームやサンドボックス系ゲームなど、オブジェクトのリアルな動きを見せたいシーンでAddForceは活躍します。 オブジェクト同士が衝突したときに、受けた衝撃分だけAddForceで跳ね返す処理を入れるといった使い方もあります。

このようにAddForceは、物体に「流れ」や「勢い」を与えたい場面で効果的です。 数値を地道に調整する必要はありますが、それも物理演算の醍醐味だと言えるかもしれません。

よくある注意点

AddForceの挙動が期待どおりにならないと感じる場面では、いくつか見直すべきポイントがあります。 たとえば、RigidbodyのUse Gravityがオフになっている、またはisKinematicがオンになっていると、思ったように力が加わりません。

また、AddForceをUpdateで呼び出している場合、物理演算のタイミングとずれて動きが不自然になることがあります。 基本的にFixedUpdateで呼び出すか、必要に応じてTime.deltaTimeを掛け合わせる工夫をするといった調整が大切です。

Rigidbodyの制御は、オブジェクト同士の衝突や摩擦、Dragなどさまざまなパラメータに左右されます。 思わぬバグや予期せぬ挙動を防ぐためにも、一つずつパラメータを確認しながら調整するのが望ましいです。

力の方向がずれていると狙った方向に動かないケースも多いです。 シーンビューを使ってベクトルの向きを可視化したり、デバッグログで力の数値を確認するなどの方法で逐次チェックしてみてください。

さらに、Impulseを連続で与えすぎるとオブジェクトが大きく飛び出すなど、制御が難しくなりがちです。 ジャンプや衝撃を与える仕組みを作る場合は、地面に接地しているときだけ動かすといった条件を設けるのもひとつの手です。

また、実行環境のフレームレートやネットワーク同期に影響される可能性を想定することも大事です。 動きの再現性を高めたいなら、FixedUpdateと物理演算のステップを意識したコーディングが必要になるでしょう。

まとめ

ここまで、Rigidbody.AddForce の基本的な使い方や、ForceModeごとの違い、具体的なコード例などを紹介しました。 向きやForceModeの選択次第で、オブジェクトは滑らかに動き、あるいは瞬発的に動くことがわかります。

物理挙動を取り入れると、ゲーム全体に奥行きやリアリティが生まれやすいですが、その反面、微調整には手間がかかることもあります。 力の大きさやRigidbodyのパラメータを変えながら、狙った動きを実現する過程を楽しんでみるのが良いかもしれません。

Unityでは、このAddForceを土台にいろいろなアクションや仕掛けを作りやすくなります。 自分が作るゲームのコンセプトに合わせて、加速や衝撃、慣性をうまくコントロールしていきましょう。

初心者の皆さんが物理挙動を取り入れる際は、まずはシンプルなシーンから始めてみるのがおすすめです。 数値を少しずつ変えながら違いを確かめていくうちに、AddForceの特徴をより理解できるはずです。

ぜひ、皆さんのゲームにRigidbody.AddForceを積極的に取り入れてみてください。 思い通りの動きや意外なシチュエーションを実現しやすくなるでしょう。

Unityをマスターしよう

この記事で学んだUnityの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。