[UNITY]2DRPG開発日誌 #25 OnTriggerStayが「呼ばれていない」を検出する方法

OnTriggerStay単体では「呼ばれていない」を検出できない

OnTriggerStay は「自分のコライダーに別のコライダーが重なっている間に発動し続ける」ものです。

では、「OnTriggerStay が呼ばれていないとき」を検出するにはどうすればいいでしょう?

まず思いつくのは OnTriggerExit ですが、

OnTriggerExit は「自分のコライダーから別のコライダーが出ていった時に発動する」ものなので、

例えばプレイヤーのコライダーに2体の敵コライダーが重なっていた場合、2体のうち1体が離れた時点で 、OnTriggerStay が呼ばれている最中にも関わらず OnTriggerExit が呼ばれてしまいます。

 

結論をいうと、OnTriggerStayは「呼ばれた時に発動するメソッド」なので、それ単体では呼ばれていないことを検出することはできません。そのため、

void OnTriggerStay2D(Collider2D collider)
   {
      if(collider == null)
      {
         なんちゃらかんちゃら
      }
   }

みたいに書いてもダメです。そもそも呼ばれないから。

 

解決方法

※私が作ってるのは2DゲームなのでOnTriggerStay2Dになってますが、2DじゃないOnTriggerStayでも一緒だと思います。

float f = 0;
bool isStay;  //ステイが呼ばれてるかどうか

void Update()
   {
      IsTriggerStay();
   }

void OnTriggerStay2D(Collider2D Collider)
   {
         stayCheckCounter += Time.deltaTime; //呼ばれたらカウンターを進める
   }

void IsTriggerStay()
   {
      if (f != stayCheckCounter)     //カウンターが進んでいるとき
      {
         isStay = true;              //ステイが呼ばれてるよ
         f = stayCheckCounter;
      }
      else if(f == stayCheckCounter) //カウンターが進んでいないとき
      {
         isStay = false;             //呼ばれてないね
      }
   }

これが最適解かはわからないけど、動くからいいや…。