リンドくん
先生、Unityでゲームを作ってるんですけど、オブジェクトを落としたり、ぶつけたりする方法がわからなくて...
たなべ
なるほど、それは物理シミュレーションの出番だね!
Unityには「Rigidbody」という便利なコンポーネントがあって、これを使うと重力や衝突をリアルに再現できるんだよ。
リンドくん
Rigidbodyですか?なんだか難しそうな名前ですね...
たなべ
大丈夫、名前は難しそうだけど考え方はシンプルなんだ。
今日はRigidbodyの基本から実際の使い方まで、しっかり解説していくよ。
ゲーム開発において、物理シミュレーションは非常に重要な要素です。
ボールが転がる、キャラクターがジャンプする、敵にぶつかって跳ね返るなど、ゲームの「リアルさ」や「面白さ」を支えているのが物理演算なのです。
Unityでは、この物理シミュレーションを簡単に実現するためにRigidbodyというコンポーネントが用意されています。
Rigidbodyを使えば、複雑な計算式を自分で書かなくても、重力や衝突、力の作用といった物理現象をゲームに取り入れることができます。
この記事では、Unityの物理シミュレーションの基礎となるRigidbodyの概念と使い方について、初心者の方でも理解できるよう丁寧に解説していきます。
HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。
✓ 質問し放題
✓ β版公開中(2025年内の特別割引)
Rigidbodyとは、Unityのゲームオブジェクトに「物理的な性質」を持たせるためのコンポーネントです。
日本語に訳すと「剛体」という意味になります。
剛体とは、力を加えても形が変わらない理想的な物体のことです。
ゲームでいえば、ボールやキャラクター、車など、形を保ったまま動くオブジェクトをイメージしてください。
Rigidbodyをオブジェクトに追加すると、以下のような物理的な振る舞いが自動的に適用されます。
「オブジェクトを動かすだけなら、Transform.positionを直接変更すればいいのでは?」と思う方もいるかもしれません。
確かに、Transformを直接操作することでオブジェクトを移動させることは可能です。
しかし、この方法では物理的な整合性が取れないという問題があります。
例えば、Transformで直接移動させた場合、壁をすり抜けてしまったり、衝突判定が正しく行われなかったりします。
Rigidbodyを使えば、Unityの物理エンジンがこれらの計算を自動的に行ってくれるため、自然で違和感のない動きを実現できるのです。
UnityはPhysX(NVIDIA製の物理エンジン)を内部で使用しており、Rigidbodyを持つオブジェクトに対して以下の処理を行っています。
これらの処理はFixedUpdateというタイミングで一定間隔(デフォルトは0.02秒ごと)に実行されます。
通常のUpdate(フレームごと)とは異なるタイミングで処理されるため、物理演算は安定した結果を得られるようになっています。
Rigidbodyの追加方法はとてもシンプルです。
これだけで、オブジェクトに物理的な性質が付与されます。
3Dオブジェクトには「Rigidbody」、2Dオブジェクトには「Rigidbody2D」を使用します。
Rigidbodyを追加すると、Inspectorにいくつかのプロパティが表示されます。
初心者が最初に理解しておくべき重要なプロパティを紹介します。
Mass(質量) → オブジェクトの重さを設定します。単位はキログラムです。質量が大きいほど、同じ力を加えても動きにくくなります。
Drag(抵抗) → 空気抵抗のような減速効果を設定します。値が大きいほど、オブジェクトは早く減速します。
Angular Drag(回転抵抗) → 回転に対する抵抗です。値が大きいほど、回転が早く止まります。
Use Gravity(重力を使用) → チェックを入れると、オブジェクトが重力の影響を受けます。
Is Kinematic(キネマティック) → チェックを入れると、物理演算の影響を受けなくなります。スクリプトやアニメーションで直接制御したい場合に使用します。
Rigidbodyだけでは衝突判定は行われません。
衝突を検出するためには、Collider(コライダー)というコンポーネントも必要です。
Colliderはオブジェクトの「当たり判定の形状」を定義するもので、以下のような種類があります。
基本的なプリミティブオブジェクト(Cube、Sphereなど)を作成すると、自動的に対応するColliderが追加されます。
RigidbodyとColliderの両方がそろって初めて、物理的な衝突が機能するということを覚えておきましょう。
リンドくん
設定はわかりましたが、実際にスクリプトからRigidbodyを操作するにはどうすればいいんですか?
たなべ
いい質問だね!
Rigidbodyはスクリプトから力を加えたり、速度を変更したりできるんだ。具体的なコードを見ていこう。
最も基本的な操作は、オブジェクトに力を加えることです。
以下のサンプルコードでは、ゲーム開始時にオブジェクトが上にジャンプします。
AddForceメソッドは、指定した方向と大きさの力をオブジェクトに加えます。
第二引数のForceModeには以下の種類があります。
ジャンプのような瞬間的な動きにはImpulse、ロケットの推進力のような継続的な力にはForceを使うのが一般的です。
力ではなく、速度を直接設定することも可能です。
ここで重要なのは、物理演算に関するコードはFixedUpdate内に書くという点です。
Updateはフレームレートによって呼び出し頻度が変わりますが、FixedUpdateは一定間隔で呼び出されるため、物理演算が安定します。
オブジェクト同士がぶつかったときに処理を行いたい場合は、OnCollision系のメソッドを使用します。
衝突検出が機能するためには、両方のオブジェクトにColliderがあり、少なくとも一方にRigidbodyがある必要があります。
Rigidbodyを持つオブジェクトのTransformを直接操作すると、物理演算と干渉して予期しない動作を引き起こすことがあります。
位置を直接変更したい場合は、MovePositionメソッドを使用しましょう。
Rigidbodyは物理演算を行うため、大量に使用するとパフォーマンスに影響します。
以下の点に注意しましょう。
rb.Sleep()で休止状態にするIs Kinematicをオンにすると、そのRigidbodyは物理演算の影響を受けなくなります。
これは以下のような場合に便利です。
ただし、Kinematicなオブジェクト同士は衝突しないため、用途に応じて使い分けることが重要です。
リンドくん
なるほど!Rigidbodyって思ったより奥が深いんですね。でも基本的な使い方はわかりました!
たなべ
その通り!最初は基本をしっかり押さえることが大切なんだ。
あとは実際に色々なゲームを作りながら、経験を積んでいこう。
今回は、UnityのRigidbodyと物理シミュレーションの基礎について解説しました。
ここまでの重要なポイントを整理しておきましょう。
物理シミュレーションは、ゲームに「リアルさ」と「楽しさ」を加える重要な要素です。
最初は難しく感じるかもしれませんが、実際に手を動かしながら試していくことで、徐々に理解が深まっていきます。
ぜひ今回学んだ内容を活かして、ボールを転がしたり、キャラクターをジャンプさせたり、さまざまな物理表現に挑戦してみてください。
Unityの物理シミュレーションをマスターすれば、ゲーム開発の幅が大きく広がるはずです。