今、2D版スプラトゥーンみたいなゲームを開発していて、プレイヤーが弾を撃ってプレイヤーの周りのコライダーを離れると弾が消去され、タイルが生成され、弾がタイルに触れている間は弾が消去されず、タイルから離れたら弾が消去されるようにしています。ですが、下の画像のようにタイル同士が近くにある場合、弾がタイルに触れているのにも関わらずたまにちょうど良いところで"触れるのをやめた時"の処理をしてしまします。
なので、"触れるのをやめた時"の処理を遅らせて、"触れている時"のStay=trueだった場合、遅らせた処理をなかったことにする方法、もしくはそれ以外で良い方法があれば教えてください。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PaintBullets : MonoBehaviour 6{ 7 public GameObject Tile; 8 public ColorRandom currentColor; 9 private bool Stay; 10 11 void Start() 12 { 13 Stay = true; 14 } 15 16 //触れるのをやめた時 17 void OnTriggerExit2D(Collider2D col) 18 { 19 if ((col.gameObject.tag == "Player") || (col.gameObject.tag == "Paint")) 20 { 21 Stay = false; 22 } 23 } 24 25 //触れている時 26 void OnTriggerStay2D(Collider2D col) 27 { 28 if (col.gameObject.tag == "Paint") 29 { 30 Stay = true; 31 } 32 } 33 34 void Update() 35 { 36 if (!Stay) 37 { 38 Delete(); 39 } 40 } 41 42 void Delete() 43 { 44 currentColor = GameObject.FindWithTag("Player").GetComponent<ColorRandom>(); ; 45 GameObject Tileclone = Instantiate(Tile, this.transform.position, Quaternion.identity); 46 Tileclone.GetComponent<Renderer>().material.color = currentColor.playerColor; 47 Destroy(this.gameObject); 48 } 49}
つまり撃った弾が接触判定の時に「触れたときの処理」よりも「離れたときの処理」が優先的に働く時がある、ということですか?
どのようにしてタイルから弾が離れるようにしているか分からないので、何とも言い難いですが「離れたときの処理」に(col.gameObject.tag == "Paint")の判定はなぜ必要なのでしょうか?
恐らくですが、「触れたときの処理」と「離れたときの処理」のどちらにも(col.gameObject.tag == "Paint")の判定が入っているので挙動が怪しいのではないかと思います。