Unity の機能の中でも、基礎中の基礎とも言える Collision。
参考書の通りにやれば、物理演算に基づいたそれらしい挙動は作れるのですが、実際のところ『Rigidbody』や『Collider』の設定によって細かく挙動の種類分けがなされており、これらをいじっていると、オブジェクト同士が衝突したりしなかったりで苦戦することがあります。
今回は、これらの設定によって変化する『当たり判定の性質の種別』をまとめてみます。
試行環境:Unity 2017.2.1p2
『前編』である本稿は、前準備としての基礎知識。
『後編』は↓の公式ドキュメントにある内容の一部について取り上げます。
1. Rigidbody と Collider について
Unity の当たり判定において基礎となる2つの Component。
どちらがどういった要素を持っているか混同してしまうこともあるかも知れませんが、ざっくりとした認識は以下のような感じ。
- Rigidbody:『物理的性質』(質量、重力影響、回転可能軸、etc…)
- Collider:『当たり判定の座標情報』(当たり判定の 中心、大きさ、etc…)
『Collider』は当たり判定の形によって『Box Collider』や『Sphere Collider』など様々な種類があり、重複も含めて1つのオブジェクトに複数の『Collider』を持たせることもできるようです。対して『Rigidbody』は、1つのオブジェクトに1つしか持たせることはできません。
またそれぞれに対応する形で、厚みを持たない 2D 用の『Rigidbody 2D』や『Collider 2D』各種も存在します。
1.1. Rigidbody がもつ要素
全部解説するとキリが無いので、それぞれ知りたい方は公式ドキュメントへ。
今回注目したいのは『Is Kinematic』。これのチェック状況によって、オブジェクトの挙動が大きく変化します。
具体的には『Is Kinematic』のチェックが
- OFF:物理演算に支配された挙動
- ON:スクリプトに支配された挙動
になります。もう少し詳しい内容は後編で。
ちなみに『Rigidbody 2D』では『Is Kinematic』のチェックボックスは存在せず、『Body Type』という項目で選択式となっています。
『Rigidbody』における『Is Kinematic』のチェック状況と対応づけると、
- Dynamic:『Is Kinematic』の チェック OFF
- Kinematic:『Is Kinematic』のチェック ON
にそれぞれ対応します。『Static』については後編で。
1.2. Collider がもつ要素
こちらも同様に、一部の要素のみ取り上げます。公式ドキュメントはこちら(一例として Box Collider のもの)。
こちらで注目したいのは『Is Trigger』。
これを ON にすると、物理演算の支配下において「実体を持たない = 他のオブジェクトが当たり判定に入っても、衝突や反発をしない」ようなオブジェクトとして扱われます。
『Is Trigger』という名前からもわかる通り、Unity 側としては「この範囲にキャラクターが入ったら~」→「会話イベントが発生する、敵が動き出す、etc…」といった『発生トリガー』的な使い方を想定していると思われます。
また Unity に慣れないプログラマが気を付けないといけないのが、スクリプト側で呼び出されるコールバック関数が『Is Trigger』の ON/OFF 状況 によって異なる、という点です。
- OFF:『OnCollision ~』系の関数
- ON:『OnTrigger ~』系の関数
↓具体的にはこんな感じ。
using UnityEngine;
public class CollisionTest : MonoBehaviour
{
// Is Trigger : OFF.
private void OnCollisionEnter(Collision collision)
{
Debug.Log("Is Trigger : OFF で, 当たり判定に入ったとき.");
}
private void OnCollisionStay(Collision collision)
{
Debug.Log("Is Trigger : OFF で, 当たり判定に入っている間.");
}
private void OnCollisionExit(Collision collision)
{
Debug.Log("Is Trigger : OFF で, 当たり判定から抜けたとき.");
}
// Is Trigger : ON.
private void OnTriggerEnter(Collider other)
{
Debug.Log("Is Trigger : ON で, 当たり判定に入ったとき.");
}
private void OnTriggerStay(Collider other)
{
Debug.Log("Is Trigger : ON で, 当たり判定に入っている間.");
}
private void OnTriggerExit(Collider other)
{
Debug.Log("Is Trigger : ON で, 当たり判定から抜けたとき.");
}
}
『OnCollision ~』系と『OnTrigger ~』系で、渡される引数の型が異なる点に気を付けましょう。
- OnCollision ~:Collision 型
- OnTrigger ~:Collider 型
↓それぞれの詳しい内容は、公式ドキュメントへ。
後編では、本題である「Rigidbody の設定による挙動の分岐」について、もう少し詳しく取り上げます。