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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

2回答

55572閲覧

衝突判定の複数感知

shimazu

総合スコア38

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

3クリップ

投稿2016/07/11 07:05

編集2016/07/11 08:29

Unityで衝突判定をするときに OnTriggerStay(Collider col) を使っています。
しかし,この関数では一つのオブジェクト(Collider)との衝突しか判定できません。
2つ以上のものが同時に衝突している際に全ての衝突を判定できるようにするにはどうすればいいですか?

例:
Player1
Player2
Player3
の時,Player1がPlayer2とPlayer3の両方にぶつかった時,Player2とPlayer3の両方の攻撃を同時に受ける。

現在のコード

C#

1void OnTriggerStay(Collider col){ 2 // 敵にぶつかる 3 if(col.gameObject.tag == enemyTag){ 4 // ダメージを受ける 5 } 6}

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

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

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

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

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

urahimono

2016/07/11 07:32

一つ質問があります。 2つ以上のものが"同時に"衝突している際の判定が取りたいのでしょうか。
shimazu

2016/07/11 07:38

そうです。ただし,衝突したオブジェクトのタグも複数取得したいです。
guest

回答2

0

ベストアンサー

コリジョンイベントだと複数一括取れると思いますが、
トリガーイベントだと1個しか取れないはずなので
自分で実装する必要があるがあると思います。
(違ったらすみません)

Rigidbody と Collider の関係によっては衝突検知の結果が変わるので、
ドキュメントの衝突アクションマトリクスを合わせてご確認下さい。
http://docs.unity3d.com/ja/current/Manual/CollidersOverview.html

C#

1public class Player1 : MonoBehaviour 2{ 3List<GameObject> colList = new List<GameObject>(); 4int damageIndex = 0; 5 6void OnTriggerEnter2D(Collider2D other) 7{ 8 if (other.gameObject.CompareTag("enemy") && !colList.Contains(other.gameObject)) 9 colList.Add(other.gameObject); 10} 11 12void OnTriggerExit2D(Collider2D other) 13{ 14 if (other.gameObject.CompareTag("enemy") && colList.Contains(other.gameObject)) 15 colList.Remove(other.gameObject); 16} 17 18void Update () 19{ 20 int isDamage = 0; 21 foreach (GameObject go in colList) 22 { 23 isDamage += (go.name == "Player2") ? 1 : 0; 24 isDamage += (go.name == "Player3") ? 1 : 0; 25 } 26 27 if (isDamage == 2) 28 { 29 Debug.Log("Damage!" + (damageIndex++)); 30 } 31} 32}

投稿2016/07/11 08:34

buibui80

総合スコア1033

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

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

0

ちょっと私の知る限りOnTrigger○○やOnCollision○○では、衝突している複数のオブジェクトの同時取得は難しかったと思います。
ただいくつか代替案があります。

1つ目は、Physics.OverlapBox()を使う方法です。
Physics.OverlapBox
この関数では指定した位置や大きさを指定することで、その内部にあるColliderを全て取得することができます。
ただし、自分自身のColliderまで取得してしまう点や、レイヤーマスクの指定は自らで行う必要があります。

csharp

1void FixedUpdate() 2{ 3 // ※ 自分自身にColliderがアタッチされている場合、自分自身も返り値のリストに含まれるので注意が必要です 4 Collider[] collisions = Physics.OverlapBox( transform.position, GetComponent<BoxCollider>().size / 2.0f, transform.rotation ); 5}

球型のPhysics.OverlapSphere()もあります。
Physics.OverlapSphere

2つ目は、OnTriggerStay()で衝突したオブジェクトをリストで管理し、FixedUpdate()で処理する方法です。

csharp

1using UnityEngine; 2using System.Collections.Generic; 3 4public class Test : MonoBehaviour 5{ 6 // 衝突しているオブジェクトリスト 7 private List<GameObject> m_hitObjects = new List<GameObject>(); 8 9 void FixedUpdate() 10 { 11 if( m_hitObjects.Count >= 2 ) 12 { 13 // TODO:2つ以上同時に衝突していた場合の処理 14 } 15 16 // 毎回衝突したオブジェクトリストをクリアする 17 m_hitObjects.Clear(); 18 } 19 20 void OnTriggerStay( Collider i_other ) 21 { 22 // 衝突しているオブジェクトをリストに登録する 23 m_hitObjects.Add( i_other.gameObject ); 24 } 25} 26

ただし、こちらのイベント関数の実行順を見てもらえればわかる通り、1更新分遅れてしまう欠点があるので注意が必要です。
イベント関数の実行順
イメージ説明

ご参考になればと思います。

投稿2016/07/11 08:56

urahimono

総合スコア714

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

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

urahimono

2016/07/11 09:09

ちなみにOnTriggerStay()は毎フレーム処理が走るため、決して軽い処理ではありません。処理の重さが気になる場合は、buibui80さんの回答のように、OnTriggerEnter()とOnTriggerExit()で衝突しているオブジェクトのリストを管理する方法をお勧めします。
退会済みユーザー

退会済みユーザー

2019/10/23 01:40

突然質問ですが自分も全く同じ状況で困っているのですがOnTrigerEnterは使えてもOnCollisionEnterはRigidbodyを入れないと使えないしRigidbodyを使いたくないときはOnTriggerを使うべきというか使うものなのでしょうか?w
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問