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

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

ただいまの
回答率

90.62%

  • Unity2D

    826questions

Unity の OnCollisionEnter2D 内での処理について

解決済

回答 3

投稿

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

chankane

score 117

お疲れ様です、久しぶりにお世話になります

 前提・実現したいこと

OnCollisionEnter2D(Collision2D col)関数内でcol.contacts[0].pointを取得したい

 発生している問題・エラーメッセージ

たまに、contacts配列の長さが0になります。そのため、

IndexOutOfRangeException: Array index is out of range.


このようなエラーが出てしまいます

 該当のソースコード

    void OnCollisionEnter2D(Collision2D col){
        Vector2 point = col.contacts [0].point;
        Debug.Log(col.contacts.Length);
    }

 質問

私は、
「衝突したときに呼ばれる関数なら、衝突地点が最低1つは存在するはず」
col.contacts [0].pointは必ず存在する
と考えています。

なぜそうならないのか、また、衝突座標を取得する方法はないのか
以上の2点を知りたいです。よろしくお願い致します

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

0

Unity 2017.4.0f1 で再現ができました。
不定期に0や2が帰ってきますね…
但し2018では治っているようで、2018では同じプロジェクトでも0が帰ってくることはありませんでした。
また、Enter2Dに入る度にログを吐くようにしてみたのですが、2017と2018で明らかにログの出力される量が違ったため(5倍程2018の方が多い)
ちょっとここの仮説は怪しいので無しで
Collision Detection→Continuousの動きがちょっと変わったのかもしれません

2017に依存する必要が無いのでしたらまだβ版ですが一度使ってみると良いかもしれません

なにか進展がありましたらまた補足回答します

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/26 19:32

    これはちょっと応急処置的ですが2017で0が出る可能性を減らす方法を見つけました
    Edit→Project Settings→TimeからFixed Timestepをデフォルトの0.0167より小さな値にしてみてください
    物理演算の計算回数が上がり0が出にくくなります(完全に0には出来なかったですが…)

    キャンセル

  • 2018/04/26 19:34

    承知いたしました。最終手段として参考いたします
    というのも私事ではございますが、最近引っ越しをした関係でテザリング環境になっております
    また、fiveHundred様がご回答なされた内容より、対象を削除させない設計にいたしましたが、効果はありませんでした(´・ω・`)
    以上が進展です

    キャンセル

  • 2018/04/27 07:15

    結局β版に移行することとなりました
    大変ご丁寧なご対応、ありがとうございました!!
    お二人ともなるほど!というご回答をいただきましたが、解決に致ったMMashiro様をベストアンサーとさせていただきました

    キャンセル

0

Unity 2018.2で色々試してみましたが再現できませんでした
海外のフォーラムでも似たような事象を見つけましたがどれも解決には至ってなかったです

https://forum.unity.com/threads/collision-triggered-but-no-contact.189556/

とりあえず応急処置的ですが0の時は無視する形が良いかもしれません
(それで挙動に支障が出るようなら他の方法を考えないと駄目ですが…)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/25 21:27

    すみませんバージョンに関する情報がなかったですね(..;)
    Unity 2017.4.1f1です
    バージョンの問題なのでしょうかね...(;´Д`)
    ちなみにゲームの性質上無視できません

    キャンセル

  • 2018/04/25 22:10 編集

    再現できるミニマムなプロジェクト等があれば調査のしようもあるのですがこちらの環境では再現しないので・…

    キャンセル

  • 2018/04/25 22:18

    多分ですが、
    1.BOXを4つ使って額縁のようなオブジェクトを作る
    2.その中でボールを超高速移動させる(反発係数1、CollisionDetectionはContinuous)
    私はこの条件下で発生しました

    キャンセル

  • 2018/04/26 02:12

    同じように作成してみましたが1を下回ることはありませんでした…
    ちなみにですが額縁のようなオブジェクトはStaticになっていますでしょうか?
    (関係ないかもしれませんが一応衝突判定の精度に関わる事なので)
    あとボールのColliderは何を使っているか教えてくださると助かります

    キャンセル

0

質問の状況とは違うかもかもしれませんが、接触相手のオブジェクトのOnCollisionEnter2D()で、Destroy(gameObject);(接触相手のオブジェクト自身を削除)をすると、同様な状況になりました。
そのため、「接触相手が削除されてしまったので、衝突地点も存在しなくなってしまった」のが原因かもしれません。

もし、それが正しいのであれば、接触相手のオブジェクトでcol.contacts [0].pointを取得すると解決できるかもしれません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/26 08:41

    おはようございます
    そうです消しております(性格には、相手側のOnCollisionEnter2Dで自分自身を削除させている)
    あくまでも仮定ですが、衝突した相手側と自分側のOnCollisionEnter2Dのどちらが先に実行されるかでエラーが出るか出ないか決定してくるということだと思います
    会社から帰ったあと試してみたいと思います

    キャンセル

  • 2018/04/26 19:29

    削除がないケースでも同様の現象が起きました
    すみません...(´・ω・`)

    キャンセル

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

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

関連した質問

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

  • Unity2D

    826questions