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

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

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

Q&A

解決済

3回答

534閲覧

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

chankane

総合スコア139

0グッド

0クリップ

投稿2018/04/25 11:04

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

前提・実現したいこと

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

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

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

IndexOutOfRangeException: Array index is out of range.

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

該当のソースコード

c#

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

質問

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

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

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

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

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

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

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

guest

回答3

0

ベストアンサー

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

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

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

投稿2018/04/26 10:18

編集2018/04/26 10:23
MMashiro

総合スコア2378

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

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

MMashiro

2018/04/26 10:32

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

2018/04/26 10:34

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

2018/04/26 22:15

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

0

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

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

投稿2018/04/25 13:59

fiveHundred

総合スコア9803

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

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

chankane

2018/04/25 23:41

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

2018/04/26 10:29

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

0

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

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

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

投稿2018/04/25 11:57

MMashiro

総合スコア2378

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

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

chankane

2018/04/25 12:27

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

2018/04/25 13:10 編集

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

2018/04/25 13:18

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

2018/04/25 17:12

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問