2020年11月28日2 分
最終更新: 2021年4月12日
以前はこんなことなかったのですが、最近のアップデートで仕様が変わったのかもしれません。「OnTriggerStay」 もしくは「OnCollisionstay 」を使って時間をカウントするプログラムを作った時、なんかうまく動かないなぁ、何てことありませんか?
例えば「オブジェクトに3秒接触していたら、対象のオブジェクトを消す」なんてプログラム。
public float limitTime = 3.0f; //消えるまでの時間
float currentTime = 0; //秒数をカウントする変数
void OnTriggerStay2D(Collider2D collision) //侵入判定
{
if (collision.tag == "Water") //侵入の対象のタグが"Water"なら
{
currentTime += Time.deltaTime; //フレームごとに時間を加算
Debug.Log(currentTime);
if (currentTime >= limitTime) //limitTime を超えたら
{
//"Wate"のWater Classを呼び出し、Water を削除する関数を発動
collision.gameObject.GetComponent<Water>().DrinkWater();
}
}
}
Water Class には自分自身を削除するプログラムを作っておきます
public void DrinkWater()
{
Destroy(gameObject);
}
起動させると、本来、変数:imitTime で指定した3秒後に関数:DrinkWater() が呼び出されてWaterというゲームオブジェクトは消えるはず。
Debug.Log(currentTime); で今の時間を表示させると、なぜか途中で止まっている。
これはUnityの「Time to Sleep」というパラメーターが影響しているようです。Unity側が、プロジェクトの負荷を軽減させるために、Rigidbody を管理する時間に制限を付けたようです。
公式のUnityマニュアルには以下のような記述があります。
Time to Sleep
Rigidbody 2D の動きが止まってから、スリープ状態になるまでに経過する時間 (秒単位)
以下の方法でパラメーターを調整しましょう。
メニュー「Edit」 から「Project Settings」=> 「Physics 2D」を選択。
表示されたパラメーターの「Time To Sleep」を必要に応じ調整。今回は3秒にしてみました。
以上です。
ではこれで動かしてみましょう。
下のように、3秒までカウントして、Waterのオブジェクトが消えたことが確認できました。