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

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

ただいまの
回答率

88.78%

OnTriggerEnterの条件に関して。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,817

tkmnusr

score 320

前提・実現したいこと

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が呼ばれる)
ということで合っていますよね?

ご教示お願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

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

また、使用している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/07 14:41 編集

    ご回答ありがとうございます。
    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です。

    キャンセル

  • 2019/04/08 15:47

    物理演算は「スリープ」します。「一定時間、動かない(=移動が一定値以下である)」状態の場合、それ以上は物理演算の計算を行わないことで負荷を下げる機能です。
    他オブジェクトにぶつかられたり、自身にAddForce等することでスリープ状態が解除され移動します。

    で、Translateやpotision書き換えでの移動は物理演算のスリープを解除しません。
    つまり一度静止した(=スリープ状態に入った)オブジェクトをTranslateで動かしても、物理演算上はスリープのままなので、他のオブジェクトにぶつかっても衝突判定がされない形になるものと思います。
    (シーンビューで移動させた場合はどうなっているか正確に把握出来ていませんが、タイミングによって「移動してはいるがまだスリープ中(数フレーム後スリープが解除される)」みたいな状況になるのかもしれません)

    無理矢理スリープさせないようにする方法もあるので、試してみるといいかもしれません。
    http://inaenomaki.hatenablog.com/entry/2017/01/20/215629

    また、Translateやpotision書き換えは物理演算を考慮しない移動なので、そもそも物理演算させたいオブジェクトに対して行うべきではないです。
    (例:衝突を考慮せず埋まる→その後通常の物理演算をする→埋まっているので見当違いな動作になる)

    キャンセル

  • 2019/04/09 23:57

    ご回答ありがとうございます。
    なるほど、物理演算に「スリープ」というものがあるのですね。
    ご提示のURL拝見しました。

    衝突や物理演算に関してとても勉強になりました。
    ご教示いただきありがとうございました。
    スリープについてもいろいろ試してみたいと思います。

    キャンセル

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

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

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