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

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

ただいまの
回答率

90.54%

  • C#

    7073questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    3967questions

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

UnityでCollisionが思ったように動かない

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 189

UDON3

score 59

 現状

Unityでスイッチオブジェクトのコライダーに当たった時動作させたいのですが、子オブジェクトのコライダーに当たった時にも反応してしまいます。
これが仕様なのかもしれませんが、
スイッチオブジェクト(コライダー(スイッチ動作用)、トリガー(カメラの侵入検知用)あり)
_レールオブジェクト(レールの当たり判定用コライダー、ブロックの設置補正用トリガー)
__目印オブジェクト
__目印オブジェクト
のようなオブジェクト関係なっていて、どうにか親オブジェクトのコライダーに当たった時のみ反応するようにしたいのです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeassemblyUnit : MonoBehaviour {
    private int hitSphereID;
    private float accellspeed = 2;

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "Player")
        {
            int i = 0;
            foreach(GameObject Search in MainDataBase.SphereObj)
            {
                if (collision.gameObject.name.Contains(Search.name))
                {
                    hitSphereID = i;
                }
                i++;
            }
            Destroy(collision.gameObject);
            Vector3 Export1 = transform.Find("DiassemblyUnit").gameObject.transform.Find("Output1").gameObject.transform.position;
            Vector3 Export2 = transform.Find("DiassemblyUnit").gameObject.transform.Find("Output2").gameObject.transform.position;
            Export1 += new Vector3(0,1f,0);
            Export2 += new Vector3(0, 1f, 0);
            GameObject Export1Obj = Instantiate(MainDataBase.SphereObj[hitSphereID - 1], Export1, Quaternion.identity) as GameObject;
            GameObject Export2Obj = Instantiate(MainDataBase.SphereObj[hitSphereID - 1], Export2, Quaternion.identity) as GameObject;
            Vector3 Export1accsell = transform.position - Export1;
            Vector3 Export2accsell = transform.position - Export2;
            Export1Obj.GetComponent<Rigidbody>().velocity -= Export1accsell * accellspeed;
            Export2Obj.GetComponent<Rigidbody>().velocity -= Export2accsell * accellspeed;
            Export1Obj.name = MainDataBase.SphereObj[hitSphereID - 1].name + Controller.SphereID;
            Controller.SphereID++;
            Export2Obj.name = MainDataBase.SphereObj[hitSphereID - 1].name + Controller.SphereID;
            Controller.SphereID++;
        }
    }
}


念のためソースコードも載せておきます。

 要望

子オブジェクトのコライダーは、判定から外したい。
複数のコライダーのうち指定したコライダーに当たった時のみのみ反応させたい。
出来る限り遅延がないようにしたいです。

 環境

Unity2018.2.2f1 Personal(64bit)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

CollisionがついているオブジェクトのLayerを別々にするのはどうでしょうか?
Edit→Project Settings→Physics→Layer Collision Matrix
のチェックボックスをオン/オフすれば、「このLayerとあのlayerのオブジェクトはCollisionが反応する/しない」という設定ができます。

あるいは、反応させたいオブジェクトのTagを"switch"とでもして、

if(other.tag=="switch"){}


で、この{}内に処理を書くのはどうでしょう。
コード内でこの方法を使ってらっしゃるので、スイッチオブジェに関してのみ使えない事情があるのかもしれませんが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/09 12:29 編集

    物理演算の判定は有効にして、スクリプトの判定は無効にすることはできますか
    子オブジェクトにあたっても反応しないようにはなりましたが、物理演算の際は有効にしたいのです。
    無茶かもしれませんが、何か方法はありますか。tagとGameObject名は既に使用済みです

    キャンセル

  • 2018/08/10 10:32

    うーん、tagで判別する方法で、スクリプトを無効にしつつrigidbodyの物理挙動は有効のまま、というのも問題なくできると思います。
    具体的にどのようにtagでの判別を書きましたか?
    if文を差し込む場所なんかを調整すればうまくいくかもしれません。

    キャンセル

  • 2018/08/10 12:10

    tagも試してみたのです、親オブジェクトのtagが取得されてしまいました。

    キャンセル

  • 2018/10/10 23:58

    衝突の細かい調整は、Physics.OverlapBoxという関数を使ってスクリプトの情報だけで判断するといいかもしれません。1フレームで判別するので遅延も一切ありません。

    キャンセル

  • 2018/10/12 07:20

    Physics.OverlapBoxというものを今までつかったことがなかったのでいろいろ検証してみます。少し返信が遅れるかもしれませんがよろしくお願いします。もし分かりやすい解説等があれば書いていただけるとありがたいです。

    キャンセル

  • 2018/10/12 20:01

    サンプルコードを書いておきましたー

    キャンセル

0

使い方を少し書いてみました。
毎フレーム配列を確保しているため多用すると少し重くなります。
負荷が気になる場合は、NonAllocバージョン(予め用意した配列を流用するもの)があるのでそちらを使うといいかもです。

    void Update ()
    {
        //コライダーを取得する範囲(取得したい範囲の半分の大きさを指定します)
        Vector3 boxSize = transform.localScale / 2f;

        //コライダー取得(第四引数にレイヤーを指定すれば、特定のレイヤーのみのコライダーを取得できます。)
        //範囲を展開する中心点, 取得したい範囲, 回転, (レイヤー)
        Collider[] targets = Physics.OverlapBox(transform.position, boxSize, Quaternion.identity);

        //取得したコライダーの数だけループ
        for(int i=0; i<targets.Length; i++)
        {
            //触れている相手の名前が ”Cube” だったら
            if(targets[i].name == "Cube")
            {
                Debug.Log("Cubeという名前のオブジェクトに触っています。");
            }
        }
    }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.54%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • C#

    7073questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    3967questions

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