進入と退出
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 19/63。
トリガーはさらに2種類のメッセージを送ります。OnTriggerExit(Collider other)は、重なりが終了した物理ステップで、その終了の仕方にかかわらず1回実行されます。OnTriggerStay(Collider other)は、重なりが続いている間、デフォルトでは1秒間に50回、FixedUpdate()と同じように、物理ステップごとに実行されます。3つとも同じColliderを受け取ります。
この上昇気流は、中に浮かんでいるものを持ち上げ、出ていったときに通知します。
public float lift = 15f;
void OnTriggerStay(Collider other)
{
other.attachedRigidbody.AddForce(Vector3.up * lift);
}
void OnTriggerExit(Collider other)
{
Debug.Log(other.name + " left the updraft");
}力は物理ステップ内で加えるものなので、OnTriggerStayが適しています。ボールが中にある間はステップごとに1回押し上げ、ボールが出た瞬間に止まります。上昇気流にはRigidbodyがないため、訪れるオブジェクトはすべてRigidbodyを持っている必要があり、ここでattachedRigidbodyがnullになることはありません。OnTriggerStay内で1秒あたりの量を指定する場合は、Time.deltaTimeを掛けます。物理ステップ中のこの値はステップの長さで、0.02です。オブジェクトが入るたびにOnTriggerEnterが1回呼び出され、その後、同じコライダーに対してOnTriggerExitが1回呼び出されます。
チャレンジ
簡単倉庫の床に描かれた黄色いBayはトリガーで、lampはその隣の柱にある警告灯です。ベイに何かがあるかどうかをランプで示すように、LoadingBayを書きましょう。
- ゲーム開始時、ベイは空なので、ランプは消灯しています(
lamp.enabled = false)。 - ベイに少なくとも1つのオブジェクトがある間、ランプは点灯します。
- 最後のオブジェクトが出ていくと、ランプは再び消灯します。
クレート2個とプレイヤーは同時にベイに入ることがあるため、1つが出ていってもベイが空になったとは限りません。Playを押して、矢印キーでクレートを出し入れし、次にCheckを押しましょう。
自分で試してみよう
using UnityEngine;
public class LoadingBay : MonoBehaviour
{
public Light lamp;
// ベイ内に何かがある間はランプが点灯し、ベイが空になると消灯する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。