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

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

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

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

Q&A

解決済

1回答

8563閲覧

OnTriggerEnterの条件に関して。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

1グッド

0クリップ

投稿2019/04/05 16:41

前提・実現したいこと

OnTriggerEnterに関して、3点質問があります。

1点目:
OnTriggerEnterが呼び出されるには、Collider同士だけでなく、どちらか片方にRigidbodyも必要ですか?
だいたいのサイトを見ているとそのように書かれているのですが、URLは忘れてしまいましたが、
Collider同士だけでも接触を検知すると書かれたサイトを見かけた気がしたので、
念のため、質問させていただきました。

2点目:
こちらのサイトの、
下記内容間違っていませんか?

なお、Is Trigger チェックがついていて、 かつRigidbodyがアタッチされていないオブジェクトを動かしてぶつけても、衝突検出できません。

3点目:試したことに書いてあります。

試したこと

1点目に関して。
検証した所、やはりRigidbodyは必要な感じがしました。
また、こちらのドキュメントに、
OnTriggerEnterが呼ばれる条件が書かれているみたいですが、
英語がわからなく、Google翻訳も正直信用していないので、
確認の為、ご教示お願いします。

2点目に関して。
「~衝突検出できません。」ここでの衝突検知とは、OnTriggerEnterが呼ばれないということを言っていると思うのですが、

A:[Is Trigger]がtrue。 B:[Is Trigger]がtrueでもfalseでもどちらでもよい。Rigidbodyアタッチ。

という状態だったら、Aが「Is Trigger チェックがついていて、かつRigidbodyがアタッチされていないオブジェクト」
だと思うのですが、この2つを接触させても、A側のOnTriggerEnter呼ばれますよね?

3点目:
2点目に関してまとめると、

A:Colliderのみアタッチ。 B:ColliderとRigidbodyをアタッチ。

この2つのゲームオブジェクトを衝突させると、Aのゲームオブジェクトでも衝突は検知しますよね?
上記の条件において、AとBのどちらかか、もしくは両方に[Is Trigger]がtrueに設定されていれば、
AのゲームオブジェクトでもOnTriggerEnterが呼ばれ(当然BでもOnTriggerEnterが呼ばれ)、
AとBの両方で[Is Trigger]がfalseに設定されていれば、
AのゲームオブジェクトでもOnCollisionEnterが呼ばれる(当然BでもOnCollisionEnterが呼ばれる)
ということで合っていますよね?

ご教示お願いします。

Bongo👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

公式リファレンスは大体合っていますが、時々間違っています(特に日本語版)。
実際の挙動が仕様です。
試してみてそのようになっているのなら、そうなのです。

また、使用しているUnityのバージョンと参考資料のバージョンが合っているかも確認してください。
本件が該当するかは分かりませんが、たまに仕様変更が入っていて話が食い違う可能性があります。

ちなみに公式リファレンスの翻訳に関する問い合わせは該当ページの「フィードバック」から送信出来ます。
個人ブログについては合っている保証は何も無いので、間違っているなと思ったら筆者に問い合わせた方がいいです。


せっかくなので Unity2018.2.3f1 環境で検証しました。

0.片方or両方にCollider無し、Rigidbody問わず
1.両方にRigidbody無し、IsTrigger問わず(以下は全て両方のColliderあり)
→ OnTriggerEnterもOnCollisionEnterも呼ばれない

2.片方or両方にRigidbodyあり、片方or両方のIsTriggerオン
→ OnTriggerEnterは呼ばれる、OnCollisionEnterは呼ばれない

3.両方にRigidbodyあり、両方のIsTriggerオフ
→ OnTriggerEnterは呼ばれない、OnCollisionEnterは呼ばれる

4.片方にRigidbodyあり、両方のIsTriggerオフ
→ **Rigidbodyある方がぶつかった(動いた)場合、**OnTriggerEnterは呼ばれない、OnCollisionEnterは呼ばれる(ただし本来は押すはずが貫通する)
→ **Rigidbody無い方がぶつかった(動いた)場合、**OnTriggerEnterもOnCollisionEnterも呼ばれない

備考:上記の「呼ばれる」は全て、ぶつかった側・ぶつかられた側の双方で発生しています。

よって質問の「2点目」は「サイトの表記が誤り(または当時のバージョンでは正しかったが、最近のバージョンでは違う)」。
「3点目」は「その通り」になります。

投稿2019/04/06 06:28

編集2019/04/06 07:08
sakura_hana

総合スコア11427

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

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

退会済みユーザー

退会済みユーザー

2019/04/07 06:00 編集

ご回答ありがとうございます。 Unityのバージョンと参考資料のバージョンが違うと話が食い違う場合もあるのですね。 勉強になります。 自分の3点目に関しては、 「AとBの両方で[Is Trigger]がfalseに設定されていれば、  AのゲームオブジェクトでもOnCollisionEnterが呼ばれる(当然BでもOnCollisionEnterが呼ばれる)」 としてまして(AはRigidbody無し、BはRigidbody有り)、 これには、Aを動かして静止状態のBにぶつかった場合も含めてまして、 sakura様の4.の「→ Rigidbody無い方がぶつかった(動いた)場合、OnTriggerEnterもOnCollisionEnterも呼ばれない」と異なるのかなと思いました。 試した所、ゲーム実行時にシーンビューの移動ツールで動かしたら、何回か試すと衝突するけど、 スクリプトでTranslateで動かしたら、衝突しないという挙動でした。 なので、 4.のRigidbody無しの動きについてまとめるとすると、 「→ Rigidbody無い方がぶつかった(動いた)場合、OnTriggerEnterは呼ばれず、ほぼOnCollisionEnterも呼ばれない。(シーンビューの移動ツールで動かしたら、何回か試すと呼ばれるけど、 スクリプトでTranslateで動かしたら、呼ばれない可能性が高い)」 みたいな挙動になるのかと思うのですが、いかがですか? 間違っている点等ありましたら、ご教示お願いします。 検証した環境はUnity2018.3.8f1です。
sakura_hana

2019/04/08 06:47

物理演算は「スリープ」します。「一定時間、動かない(=移動が一定値以下である)」状態の場合、それ以上は物理演算の計算を行わないことで負荷を下げる機能です。 他オブジェクトにぶつかられたり、自身にAddForce等することでスリープ状態が解除され移動します。 で、Translateやpotision書き換えでの移動は物理演算のスリープを解除しません。 つまり一度静止した(=スリープ状態に入った)オブジェクトをTranslateで動かしても、物理演算上はスリープのままなので、他のオブジェクトにぶつかっても衝突判定がされない形になるものと思います。 (シーンビューで移動させた場合はどうなっているか正確に把握出来ていませんが、タイミングによって「移動してはいるがまだスリープ中(数フレーム後スリープが解除される)」みたいな状況になるのかもしれません) 無理矢理スリープさせないようにする方法もあるので、試してみるといいかもしれません。 http://inaenomaki.hatenablog.com/entry/2017/01/20/215629 また、Translateやpotision書き換えは物理演算を考慮しない移動なので、そもそも物理演算させたいオブジェクトに対して行うべきではないです。 (例:衝突を考慮せず埋まる→その後通常の物理演算をする→埋まっているので見当違いな動作になる)
退会済みユーザー

退会済みユーザー

2019/04/09 14:57

ご回答ありがとうございます。 なるほど、物理演算に「スリープ」というものがあるのですね。 ご提示のURL拝見しました。 衝突や物理演算に関してとても勉強になりました。 ご教示いただきありがとうございました。 スリープについてもいろいろ試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問