入る・出る
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 20/71。
トリガーは、さらに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回実行されます。
チャレンジ
簡単荷積み場に何かがある間、ランプを点灯させましょう。
int inBay;フィールドを追加します。Start()で、lamp.enabled = false;に設定します。OnTriggerEnterで、inBayに 1 を加え、lamp.enabled = true;に設定します。OnTriggerExitで、inBayから 1 を引き、値が 0 のときだけランプを消します。
「プレイ」を押して、木箱を出し入れします。荷積み場が空になるまでランプは点灯したままです。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class LoadingBay : MonoBehaviour
{
public Light lamp;
// ベイ内に何かがある間はlampが点灯し、ベイが空になると消灯する
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド