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

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

新規登録して質問してみよう
ただいま回答率
85.50%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Q&A

解決済

1回答

2205閲覧

オブジェクト同士が重なったときにオブジェクトを破壊したい

itirou

総合スコア3

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

0グッド

0クリップ

投稿2020/07/01 12:59

編集2020/07/02 06:36

前提・実現したいこと

unity2Dにて将棋の様なゲームを制作しています。

駒をタグでAoチーム、Orangeチームに分けて、それぞれ当たり判定を付けています。
以下のスクリプトをOrangeタグの駒にアタッチし、Orangeの駒がAoに重なったときにAoの駒がDestroyされるようにしたいです。

発生している問題・エラーメッセージ

AoとOrangeの駒が重なっても何も起こらず、Debug.Logなどを試しても何も起きませんでした。
「onTriggerStay」の書き方が間違っているのか、if文が間違っているのかがわからない状況です。

エラーメッセージ

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class battle : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } private void OnTriggerStay2D(Collider2D collision) { { if (collision.gameObject.tag == "Ao") { Destroy(gameObject); } }}

試したこと

Debug.Logを使ってオブジェクトが重なったときに発生しているか試してみたのですがなにもおきませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

sakura_hana

2020/07/02 00:07

「問題点」を記載してください。 重なってもどちらも消えない→OnTriggerStay2Dの中、if文の外に「Debug.Log(collision.gameObject.tag);」を入れて衝突しているか&衝突相手のタグを確認してください。 Ao駒ではなくOrange駒が消える→「Destroy(gameObject);」にしているので当然です。相手側を消したいなら「Destroy(collision.gameObject);」です。
itirou

2020/07/02 06:48

申し訳ありません。問題点の記載が出来ていませんでした。 Tagの確認、Debug.Logを試してみたのですが、何も起きませんでした。 オブジェクト同士が重なったときに発生するのは「OnTriggerStay」であっていますでしょうか? Destroy(gameObject);でAoが消えるように指定できるのですね。ありがとうございます。
sakura_hana

2020/07/02 11:57

>オブジェクト同士が重なったときに発生するのは「OnTriggerStay」で間違いないんでしょうか? 2Dの場合は「OnTriggerStay2D」かもしれません(何のコンポーネントを使っているかによります)。「OnTriggerStay2D 呼ばれない」などでググってください。 また、本当に重なっているのかも確認してみてください(ある角度から見れば重なっていても、別角度から見ると重なっていない等も考えられます)。 >Destroy(〜);でAoが消えるように指定できる 「gameObject」と「collision.gameObject」がそれぞれ何を指すのかをしっかり把握してください。
itirou

2020/07/02 14:37

調べたところ「OnTriggerStay」などは「Rigidbody」を付けないと機能しないのですね。 「Rigidbody」を付けるとうまく動作しました。ありがとうございます、勉強になりました。 ですが「Rigidbody」を駒につけると動作が重くなくなります。 「OnTriggerStay」のほかにオブジェクトが重なると発生する方法などはないでしょうか?
sakura_hana

2020/07/03 01:38

Rigidbody2D、Collider2Dにすると負荷軽減されるかもしれません。(1軸分の判定が消えるので) あとはisKinematicをオンにする、衝突するColliderを限定させる(https://docs.unity3d.com/ja/current/Manual/LayerBasedCollision.html)などでも変わるかもしれません。 物理衝突を使わない方法としてはRaycastAllやインターフェースによる入力(「unity ドラッグ」などで検索)を行ったり等が考えられます。(「オブジェクト同士が重なっているか」ではなく「マウスの特定の位置にオブジェクト2つがあるか」という考え方です)
itirou

2020/07/03 02:04

Kinematic、レイヤーベースの設定を変えることで動作が軽くなり解決しました。 丁寧にありがとうございました。
itirou

2020/07/03 02:08

この度は丁寧な説明ありがとうございました。 回答にしていただいたらベストアンサーにさせていただきます。
guest

回答1

0

ベストアンサー

(「質問への追記・修正の依頼」より)

■質問文には「問題点」を記載してください

  • 重なってもどちらも消えない→OnTriggerStay2Dの中、if文の外に「Debug.Log(collision.gameObject.tag);」を入れて衝突しているか&衝突相手のタグを確認してください。
  • Ao駒ではなくOrange駒が消える→「Destroy(gameObject);」にしているので当然です。相手側を消したいなら「Destroy(collision.gameObject);」です。(「gameObject」と「collision.gameObject」がそれぞれ何を指すのかをしっかり把握してください)

■衝突していないと判明した
2Dの場合は「OnTriggerStay2D」かもしれません(何のコンポーネントを使っているかによります)。「OnTriggerStay2D 呼ばれない」などでググってください。
また、本当に重なっているのかも確認してみてください(ある角度から見れば重なっていても、別角度から見ると重なっていない等も考えられます)。
→「Rigidbody」を付けるとうまく動作しました。

■「Rigidbody」を駒につけると動作が重くなる
Rigidbody2D、Collider2Dにすると負荷軽減されるかもしれません。(1軸分の判定が消えるので)
あとはisKinematicをオンにする、衝突するColliderを限定させるなどでも変わるかもしれません。

ちなみに物理衝突を使わない方法としてはRaycastAllやインターフェースによる入力(「unity ドラッグ」などで検索)を行ったり等が考えられます。(「オブジェクト同士が重なっているか」ではなく「マウスの特定の位置にオブジェクト2つがあるか」という考え方です)

投稿2020/07/06 00:24

sakura_hana

総合スコア11425

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問