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

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

ただいまの
回答率

91.77%

  • Unity

    1914questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    657questions

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

衝突判定の複数感知

解決済

回答 2

投稿 2016/07/11 16:05 ・編集 2016/07/11 17:29

  • 評価
  • クリップ 0
  • VIEW 8,742

shimazu

score 20

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

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

現在のコード

void OnTriggerStay(Collider col){
 // 敵にぶつかる
 if(col.gameObject.tag == enemyTag){
  // ダメージを受ける
 }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • urahimono

    2016/07/11 16:32

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

    キャンセル

  • shimazu

    2016/07/11 16:38

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

    キャンセル

回答 2

checkベストアンサー

+1

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

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

public class Player1 : MonoBehaviour
{
List<GameObject> colList = new List<GameObject>();
int damageIndex    = 0;

void OnTriggerEnter2D(Collider2D other)
{
  if (other.gameObject.CompareTag("enemy") && !colList.Contains(other.gameObject))
    colList.Add(other.gameObject);
}

void OnTriggerExit2D(Collider2D other)
{
  if (other.gameObject.CompareTag("enemy") && colList.Contains(other.gameObject))
    colList.Remove(other.gameObject);
}

void Update ()
{
  int isDamage = 0;
  foreach (GameObject go in colList)
  {
    isDamage += (go.name == "Player2") ? 1 : 0;
    isDamage += (go.name == "Player3") ? 1 : 0;
  }

  if (isDamage == 2)
  {
    Debug.Log("Damage!" + (damageIndex++));
  }
}
}

投稿 2016/07/11 17:34

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

0

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

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

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


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

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

using UnityEngine;
using System.Collections.Generic;

public class Test : MonoBehaviour
{
    // 衝突しているオブジェクトリスト
    private List<GameObject> m_hitObjects    = new List<GameObject>();

    void FixedUpdate()
    {
        if( m_hitObjects.Count >= 2 )
        {
            // TODO:2つ以上同時に衝突していた場合の処理
        }

        // 毎回衝突したオブジェクトリストをクリアする
        m_hitObjects.Clear();
    }

    void OnTriggerStay( Collider i_other )
    {
        // 衝突しているオブジェクトをリストに登録する
        m_hitObjects.Add( i_other.gameObject );
    }
}

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

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

投稿 2016/07/11 17:56

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2016/07/11 18:09

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

    キャンセル

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

ただいまの回答率

91.77%

関連した質問

  • 解決済

    unityで鏡

    unityで対戦ゲームを作っていています。 こちらのサイトを参考にして(http://atsushishi.com/blog/2016/04/unity-mirror/)アイテム

  • 解決済

    UnityのRayについて

    前提・実現したいこと Unityにて敵からプレイヤーに対してRayを飛ばしプレイヤーまでの間に壁などの障害物がないかを確認したいです しかしプレイヤーに対してRayを飛ばしてい

  • 解決済

    [unity]JavaScriptからC#への変換

    前提・実現したいこと 今unityでゲームを作っていますがjavascriptからc#へ変更したいプログラムがあります.しかしunityもc#もまだ勉強途中でお手数ですが助けてい

  • 解決済

    Unity ワープした先のキャラクターの向き

    キャラクターをワープさせるプログラムはできたのですが、飛んだ先でのキャラクターの向きがうまくいきません。 WarpPointオブジェクトを作って、それに衝突するとキャラクターが指

  • 受付中

    このスクリプトの修正点を教えて下さい

    using UnityEngine; using System.Collections; using UnityEngine.UI; public class TextC

  • 解決済

    Bootstrapで、カラムが横に並ばない

    <!Doctype html> <head><https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstr

  • 解決済

    bootstrap3 でimg-responsive 指定した画像が中央寄せにならない

    Bootstrap3 で画像にレスポンシブと丸型を適応しているのですが。 モバイルの時に中央寄せにしたいと考えて設定したつもりが、 上手く真ん中に配置されません。 ど

  • 受付中

    unityのCube四方向判定

    今playerの四方向を当たり判定を別々で 取ろうとしていますが上手く行きません 今やろうとしてるのは player(Cube)の上下左右がtrueなら playerを

同じタグがついた質問を見る

  • Unity

    1914questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    657questions

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