2020年11月28日2 分

【Unity小技集 Vol.001】OnTriggerStay OnCollisionstay が期待通り機能しないときに確認すること

最終更新: 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 の動きが止まってから、スリープ状態になるまでに経過する時間 (秒単位)

以下の方法でパラメーターを調整しましょう。

  1. メニュー「Edit」 から「Project Settings」=> 「Physics 2D」を選択。

  2. 表示されたパラメーターの「Time To Sleep」を必要に応じ調整。今回は3秒にしてみました。

以上です。

ではこれで動かしてみましょう。

下のように、3秒までカウントして、Waterのオブジェクトが消えたことが確認できました。

Unity 問題が解決すると、ホントすっきりしますよね。楽しい!

教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。

お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。

お問い合わせは こちら から。

体験授業のお申込みは こちら から。

    5