トリガーコライダー
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 15/71。
「Is Trigger」にチェックを入れたコライダーは、もはや固体ではありません。Rigidbodyはそのまま通り抜け、代わりにUnityは、両方のオブジェクトのスクリプトでOnTriggerEnterを呼び出して、重なりを通知します。ゴールライン、アイテム、危険地帯にはトリガーを使います。コードでは、このチェックボックスはコライダーのisTriggerプロパティにあたります。
この金庫室の警報ゾーンは、ゲーム開始時にコライダーをトリガーに切り替えます。これはチェックボックスにチェックを入れるのと同じで、警備員が中に入ると警報を鳴らします。
void Start()
{
GetComponent<Collider>().isTrigger = true;
}
void OnTriggerEnter(Collider other)
{
Debug.Log("Alarm!");
}トリガーにも衝突と同じルールが適用されます。Unityが2つのオブジェクトの組み合わせを調べるのは、少なくとも一方にRigidbodyがある場合だけです。Rigidbodyのない2つのオブジェクトは、トリガーかどうかにかかわらず、互いを検知しません。警備員はスクリプトで巡回するため、各警備員にはキネマティックRigidbody(「コンポーネントを追加」からRigidbodyを追加し、「Is Kinematic」にチェックを入れる)を付けます。これにより、重力や衝突の影響を受けなくなり、それでもRigidbodyとして扱われます。警備員にRigidbodyがなければ、警備員はゾーンを通り抜け、コンソールには何も表示されません。isTriggerがなければ、ゾーンは固体の箱です。また、キネマティックボディはRigidbodyのないコライダーには決して接触しないため、この場合も何も記録されません。組み合わせのどちらか一方のオブジェクトにRigidbodyがあれば十分です。次のレッスンでは、侵入してきたコライダーであるotherについて学びます。
チャレンジ
簡単ドローンをリングの中を通過させ、各リングからドローンを報告させましょう。
Drone.csのStart()で、body = gameObject.AddComponent<Rigidbody>();とbody.isKinematic = true;を設定し、水平に飛ぶようにします。Ring.csのStart()で、GetComponent<Collider>().isTrigger = true;を設定します。
「プレイ」を押すと、ドローンが通過し、ConsoleにRing1 passed、Ring2 passed、Ring3 passedと表示されます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Ring : MonoBehaviour
{
void Start()
{
// このリングのコライダーをトリガーにする
}
void OnTriggerEnter(Collider other)
{
Debug.Log(name + " passed");
}
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド