質問: false; } } } //オレンジ色のブロックと接触した際、カウントをプラスする void OnTriggerEnter2D(Collider2D other) { Count += 1; } } ``` ### 試したこと 現在上のコードでコメントにしている ``` //ここで一番下に作った当たり判定に接触している //ブロックをすべて消す Destroy(other.gameObject); ``` という処理を正常に動かすため、 void Updateのかっこに(Collider2D other)と記述してみましたが ALL_OKがtrueになるはずの状況でもfalseのまま残ってしまったり、 Countがマイナスされなかったので、現在コメント化しています。 void OnTrigger2D(Collider2D other) の中で処理を入れた際には一回しか回らず、 目的のオブジェクトを消しきれなかったので、 ブロックを消す処理はvoid Updateに入れて複数回回すようにしています。 OnTriggerEnterとStayの二つを試しました。 ### 補足情報(言語/FW/ツール等のバージョンなど) 言語はC#、使用ツールはUnity ver5.3、MonoDevelopです。
回答: (7/15 09:41のコメントを受けて追記) なるほど、消すのはオレンジ色のブロックだったんですね。 それであれば、下記のように変更すればよいかと思います。 Destroyクラス(02〜06も同様) ``` using UnityEngine; using System.Collections; public class Destroy01 : MonoBehaviour { //public static bool Hit01; //ヒットフラグ public bool Hit01; //当たった相手オブジェクト public GameObject hitObj; // Use this for initialization void Start() { Hit01 = false; } // Update is called once per frame void Update() { } //ブロックと接触時に呼ばれる void OnTriggerEnter2D(Collider2D other) { Hit01 = true; hitObj = other.gameObject; } //ブロックが離れる際に呼ばれる void OnTriggerExit2D(Collider2D other) { Hit01 = false; hitObj = null; } } ``` Deleteクラス(if(ALL_OK == true && Count>0)の部分を差し替え) ``` if(ALL_OK == true) { //ここで一番下に作った当たり判定に接触している //ブロックをすべて消す if (d1.hitObj != null) { Destroy(d1.hitObj); } if (d2.hitObj != null) { Destroy(d2.hitObj); } if (d3.hitObj != null) { Destroy(d3.hitObj); } if (d4.hitObj != null) { Destroy(d4.hitObj); } if (d5.hitObj != null) { Destroy(d5.hitObj); } if (d6.hitObj != null) { Destroy(d6.hitObj); } d1.Hit01 = false; d2.Hit01 = false; d3.Hit01 = false; d4.Hit01 = false; d5.Hit01 = false; d6.Hit01 = false; } ``` (初期投稿分) まず、UpdateではなくFixedUpdateを使いましょう。 Updateが「1フレームに1回(フレームレートによって逐次変動)」呼ばれるのに対し、FixedUpdateは「一定周期(物理演算と同周期)」で呼ばれます。 OnTriggerEnter2Dなどの物理演算に伴うメソッドはFixedUpdateと同周期で呼ばれる為、Updateと齟齬が発生する場合があります。 大きな処理をさせるとUpdateは遅れるので、例えば以下のような状態になる訳です。 こうなると、両者でカウントを共有している場合は当然ズレます。 Update1回目 → → → → → → →Update2回目 FixedUpdate1回目→FixedUpdate2回目→FixedUpdate3回目 但し今回の場合、「全ての青キューブがオレンジのオブジェクトと衝突していたら、全ての青キューブを消去する」ということでしたら、カウントは必要無いように思います。 以下だけで目的は達成出来るのではないかと。(if(ALL_OK == true && Count>0)の部分を差し替え) ``` if(ALL_OK == true) { Destroy(obj1); Destroy(obj2); Destroy(obj3); Destroy(obj4); Destroy(obj5); Destroy(obj6); } ``` なお、Destroy後はFindもGetComponentも効かなくなるので、nullチェックを挟む必要が出て来ます。 更に言うとUpdateの中でFindやGetComponentは使うべきではありません。 Startで行っておいてUpdate(FixedUpdate)の中ではnullチェックのみ実行、存在していたらフラグを取得、などとやるべきかと思います。 (もっと言えばDestroy01などのクラスをわざわざ6種類作る意味があるのかな?という気がしますが......)