質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

1994閲覧

Unity 遅れて処理させたい

creatorsGame

総合スコア18

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/12/17 13:25

今、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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y0241-N

2019/12/18 00:28

つまり撃った弾が接触判定の時に「触れたときの処理」よりも「離れたときの処理」が優先的に働く時がある、ということですか? どのようにしてタイルから弾が離れるようにしているか分からないので、何とも言い難いですが「離れたときの処理」に(col.gameObject.tag == "Paint")の判定はなぜ必要なのでしょうか? 恐らくですが、「触れたときの処理」と「離れたときの処理」のどちらにも(col.gameObject.tag == "Paint")の判定が入っているので挙動が怪しいのではないかと思います。
guest

回答1

0

要は「まだ当たっているタイルがあるのに消えようとする」のが問題なので、
「当たっているタイルの数を保存→それが無くなったら消える」という方向性でもいいんじゃないでしょうか。

超雑にやるなら、int hitNum;とメンバ変数作成。
OnTriggerEnter2D(触れた時)にhitNum++;
OnTriggerExit2DhitNum--;
OnTriggerStay2Dは使用しない)
Updateでif (hitNum==0) {Delete();}とか。
(なおこれだけだと起動直後に消えるので「一度でも当たった」ということを示す変数が必要かと)


遅らせるというのもありだとは思います。
コルーチン使うかUpdate内にタイマー仕込む辺りですが、
「unity 遅らせる」などでGoogle検索するとある程度情報が出ると思うのでまず調べてみてください。
質問するときのヒント|teratail(テラテイル)もご参考に。

投稿2019/12/18 01:41

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

creatorsGame

2019/12/19 12:05 編集

コルーチンなどを使った方法などをためしたのですが、思うようにならなかったのでRaycastを使おうと思っています。ですが、2DのRaycastの使い方があまり分かっておらずエラーが起きます。このスクリプトを付けたオブジェクトからRayを飛ばしLayer"Paint"に当たったらDebug.Log("a");をするというプログラムにするには下のプログラムをどう変更すればよいでしょうか? Ray2D ray = new Ray2D(this.transform.position, this.transform.up); int layerMask = LayerMask.GetMask(new string[] {"Paint"}); RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction, 10f, layerMask); if (Physics2D.Raycast(this.transform.position, this.transform.up, ray.distance, layerMask)) { Debug.Log("a"); }
sakura_hana

2019/12/20 05:18

コルーチンとRaycastは全く別の話なのでどうしてそういう発想に至ったのかよく分かりません。 このスクリプトがどこに書かれているかでも話が変わりますし、どんなエラーが起きているのかも分かりません。 (とりあえず今分かる範疇だと「ray.distanceなんて無いよ」というエラーが出ているのでそこが間違いですが、場合によっては別のエラーも出ているかもしれません) 「質問するときのヒント」を今一度読み直してみてください。 ちなみにそもそもRaycastHit2D hit = 〜;の時点で当たり判定は発生しているので、 if (hit != null) { } で「衝突していたら」という意味になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問