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

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

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

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

Unity

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

Q&A

解決済

2回答

4155閲覧

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

UDON3

総合スコア80

C#

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

Unity

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

0グッド

0クリップ

投稿2018/08/08 09:19

現状

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

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class DeassemblyUnit : MonoBehaviour { 6 private int hitSphereID; 7 private float accellspeed = 2; 8 9 private void OnCollisionEnter(Collision collision) 10 { 11 if (collision.gameObject.tag == "Player") 12 { 13 int i = 0; 14 foreach(GameObject Search in MainDataBase.SphereObj) 15 { 16 if (collision.gameObject.name.Contains(Search.name)) 17 { 18 hitSphereID = i; 19 } 20 i++; 21 } 22 Destroy(collision.gameObject); 23 Vector3 Export1 = transform.Find("DiassemblyUnit").gameObject.transform.Find("Output1").gameObject.transform.position; 24 Vector3 Export2 = transform.Find("DiassemblyUnit").gameObject.transform.Find("Output2").gameObject.transform.position; 25 Export1 += new Vector3(0,1f,0); 26 Export2 += new Vector3(0, 1f, 0); 27 GameObject Export1Obj = Instantiate(MainDataBase.SphereObj[hitSphereID - 1], Export1, Quaternion.identity) as GameObject; 28 GameObject Export2Obj = Instantiate(MainDataBase.SphereObj[hitSphereID - 1], Export2, Quaternion.identity) as GameObject; 29 Vector3 Export1accsell = transform.position - Export1; 30 Vector3 Export2accsell = transform.position - Export2; 31 Export1Obj.GetComponent<Rigidbody>().velocity -= Export1accsell * accellspeed; 32 Export2Obj.GetComponent<Rigidbody>().velocity -= Export2accsell * accellspeed; 33 Export1Obj.name = MainDataBase.SphereObj[hitSphereID - 1].name + Controller.SphereID; 34 Controller.SphereID++; 35 Export2Obj.name = MainDataBase.SphereObj[hitSphereID - 1].name + Controller.SphereID; 36 Controller.SphereID++; 37 } 38 } 39}

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

要望

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

環境

Unity2018.2.2f1 Personal(64bit)

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

csharp

1 void Update () 2 { 3 //コライダーを取得する範囲(取得したい範囲の半分の大きさを指定します) 4 Vector3 boxSize = transform.localScale / 2f; 5 6 //コライダー取得(第四引数にレイヤーを指定すれば、特定のレイヤーのみのコライダーを取得できます。) 7 //範囲を展開する中心点, 取得したい範囲, 回転, (レイヤー) 8 Collider[] targets = Physics.OverlapBox(transform.position, boxSize, Quaternion.identity); 9 10 //取得したコライダーの数だけループ 11 for(int i=0; i<targets.Length; i++) 12 { 13 //触れている相手の名前が ”Cube” だったら 14 if(targets[i].name == "Cube") 15 { 16 Debug.Log("Cubeという名前のオブジェクトに触っています。"); 17 } 18 } 19 }

投稿2018/10/12 11:01

rituta

総合スコア41

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

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

UDON3

2018/10/18 22:11

無事に動作しました。 サンプルコードまで書いていただいて本当にありがとうございます。
guest

0

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

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

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

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

投稿2018/08/08 16:33

Linkins

総合スコア82

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

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

UDON3

2018/08/09 03:33 編集

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

2018/08/10 01:32

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

2018/08/10 03:10

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

2018/10/10 14:58

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

2018/10/11 22:20

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

2018/10/12 11:01

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問