質問編集履歴

1 誤字修正をしました

YuzuTf

YuzuTf score 12

2016/06/29 15:26  投稿

Unity2Dで、OntriggerStay2Dの中にあるtrueをfalseに戻したいです。
###前提・実現したいこと
![イメージ説明](6b5d154a62a59cf85be92179732821ca.png)
上の画像の青いブロックとオレンジ色のブロックが接触した際、
青いブロックではHitというフラグがtrueになるプログラムが入っています。
また、青いブロックすべてのフラグがtrueになった際、
下の画像の緑色の枠に接触しているオレンジ色のブロックを消し、
ブロックが消えた場合にはHitの判定をTrueからfalseに戻すというプログラムを組もうとしています。
![イメージ説明](eaf4f89dc6bba204429e2f9ec769dd71.png)
###発生している問題・エラーメッセージ
void ontriggerstay2Dで判定を取り、
Trueとfalseを判断しているのですが、ブロックをDestroyで消した際、falseになりません。
void ontriggerExitを入れてみても、そこまでコードが通りませんでした。
###該当のソースコード
こちらが青色のブロックにアタッチしているコードです。
各青色のブロックにはそれぞれ、Hit01~Hit06の数字が入っています。
```C#
using UnityEngine;
using System.Collections;
public class Destroy01 : MonoBehaviour
{
   //public static bool Hit01;   //ヒットフラグ
   public bool Hit01;
   // Use this for initialization
   void Start()
   {
       Hit01 = false;
   }
   // Update is called once per frame
   void Update()
   {
   }
   //ブロックと接触時に呼ばれる
   void OnTriggerStay2D(Collider2D other)
   {
       Hit01 = true;     
   }
   //ブロックが離れる際に呼ばれる
   void OnTriggerExit2D(Collider2D other)
   {
       Hit01 = false;     
   }
 
}
```
こちらが緑色の枠にアタッチしているコードです。
緑色の枠はCreateEmptyで作成したGameObjectに
Add componentでBoxCollider2Dを作成し、
横長に引き伸ばしたもので作成しました。
is Triggerですり抜けるように設定し、当たり判定をとっています。
```C#
using UnityEngine;
using System.Collections;
public class Delete : MonoBehaviour
{
   public bool ALL_OK;
   // Use this for initialization
   void Start()
   {
   }
   // Update is called once per frame
   void Update()
   { 
   
      GameObject obj1 = GameObject.Find("Cube_00");
      GameObject obj2 = GameObject.Find("Cube_01");
      GameObject obj3 = GameObject.Find("Cube_02");
      GameObject obj4 = GameObject.Find("Cube_03");
      GameObject obj5 = GameObject.Find("Cube_04");
      GameObject obj6 = GameObject.Find("Cube_05");
       Destroy01 d1 = obj1.GetComponent<Destroy01>();
       Destroy02 d2 = obj2.GetComponent<Destroy02>();
       Destroy03 d3 = obj3.GetComponent<Destroy03>();
       Destroy04 d4 = obj4.GetComponent<Destroy04>();
       Destroy05 d5 = obj5.GetComponent<Destroy05>();
       Destroy06 d6 = obj6.GetComponent<Destroy06>();
       if (d1.Hit01 == true && d2.Hit02 == true && d3.Hit03 == true &&
           d4.Hit04 == true && d5.Hit05 == true && d6.Hit06 == true)
       {
         ALL_OK = true;
       }
 
   }
   void OnTriggerEnter2D(Collider2D other)
   void OnTriggerStay2D(Collider2D other)
   {
       while (ALL_OK == true)
       {
           Destroy(other.gameObject);
       }
   }
}
```
###試したこと
breakをif文の処理に入れてみたり、Destroyの後にALL_OKフラグをfalseに変えてみたり、
ifをwhileに変えてみたりしましたが、効果はありませんでした。
また、void ontriggerEnit2Dで処理を抜けようとしましたが、抜けられませんでした。VSTUで確認したところ、ずっとif文の中をループしてしまいます
###補足情報(言語/FW/ツール等のバージョンなど)
使用言語はC#、使用ツールはUnity5.3、Visual Stdio2013を使用しています。
  • C#

    15984 questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity2D

    2784 questions

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る