概要
Unityは、3Dゲームだけでなく、2Dゲーム開発のための専用のツールと物理エンジン(Box2D)も搭載しています。3Dの物理演算がRigidbodyやBoxColliderなどで行われるのに対し、2Dの物理演算は、末尾に2Dと付いた専用のコンポーネント群、Rigidbody2D と Collider2D を使って行われます。
3Dと2Dの物理コンポーネントは互いに干渉せず、完全に独立して動作します。そのため、2Dゲームを開発する際は、必ず2D系のコンポーネントを使用する必要があります。間違えて3D用のコンポーネントを追加してしまうのは、初心者がよく陥る間違いの一つです。
この記事では、2D物理演算の心臓部であるRigidbody2Dと、衝突判定の形状を定義するCollider2Dの基本的な使い方について解説します。
Rigidbody2D: 2D物理演算の主役
Rigidbody2Dは、ゲームオブジェクトを2D物理エンジンの管理下に置くためのコンポーネントです。これを追加することで、オブジェクトは重力の影響を受けたり、力に応じて動いたり、他のオブジェクトと衝突したりするようになります。
Rigidbodyとの主な違い
- 2D専用: Z軸方向の移動や回転は行いません。すべての物理計算はXY平面上で完結します。
- 回転: 3Dでは回転が
Quaternion(四元数)で扱われるのに対し、2DではZ軸周りの回転のみなので、単純なfloat値(角度)で扱われます。
Body Type(ボディタイプ)
Rigidbody2Dには、オブジェクトの挙動を大きく変える3つのBody Typeがあります。
- Dynamic: デフォルトのタイプ。物理法則(力、重力、衝突)に完全に従って動きます。プレイヤーキャラクターや、投げられたボールなど、動的なオブジェクトに使用します。
- Kinematic: 物理的な力(重力や衝突による反発)の影響を受けませんが、スクリプトから
velocity(速度)やMovePosition()(位置)を設定することで動かすことができます。他のDynamicなオブジェクトを押したり、衝突イベントを発生させたりすることは可能です。動く床や、スクリプトで厳密に制御したい敵キャラクターなどに使用します。 - Static: 物理演算の影響を一切受けず、空間に完全に固定されます。
Kinematicと似ていますが、スクリプトから動かすことも想定されていません。地面や壁など、全く動かない静的なオブジェクトに使用します。パフォーマンス的には最も軽量です。
Collider2D: 衝突の形状を定義する
Collider2Dは、オブジェクトの物理的な形状を定義するためのコンポーネントです。物理エンジンは、このCollider2Dの形状を使って衝突判定を行います。目に見えるSpriteの形ではなく、Collider2Dの形が物理的な実体となります。
主なCollider2Dの種類
BoxCollider2D: 四角形の形状。最も一般的で、パフォーマンスも良いです。壁、床、キャラクターの基本的な当たり判定などに広く使われます。CircleCollider2D: 円形の形状。ボールや、角のないキャラクターなどに適しています。回転しても当たり判定の形が変わらないという利点があります。CapsuleCollider2D: カプセル(長円)形の形状。プレイヤーキャラクターの当たり判定として非常に人気があります。角がないため、坂道や小さな段差で引っかかりにくいというメリットがあります。PolygonCollider2D: Spriteの形状に合わせて、自動的に多角形の当たり判定を生成してくれます。複雑な地形や、精密な当たり判定が必要なオブジェクトに使用しますが、頂点数が多くなるとパフォーマンスに影響します。CompositeCollider2D: 複数のCollider2Dを一つに結合して、より複雑な形状を作成したり、パフォーマンスを最適化したりするために使用します。例えば、タイルマップで生成された多数のBoxCollider2D