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

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

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

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

Unity

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

Q&A

1回答

2735閲覧

OnCollisionExit2Dメソッド内で接触した位置の座標を取得するには

takemomk2

総合スコア10

C#

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

Unity

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

0グッド

0クリップ

投稿2018/10/06 10:50

質問内容

OnCollisionExit2Dメソッドでオブジェクトの衝突が起こった際に衝突した位置の
座標を取得したいのですがどのように書けばいいでしょうか?
具体的には長方形の2Dオブジェクトの中央から衝突地点の座標までx座標でどれほど離れているかを
point変数に代入したいのですが
下記のコードだとUnityエディタ上でIndexOutOfRangeException: Array index is out of range.
エラーが起きてしまい正常に処理ができません。
どのように書けばいいでしょうか?

コード

C#

1 void OnCollisionExit2D(Collision2D collision) 2 { 3 var point = collision.contacts[0].point.x - transform.position.x; 4  //以下略 5 }

エラーコード

IndexOutOfRangeException: Array index is out of range.
Bar.OnCollisionExit2D (UnityEngine.Collision2D collision) (at Assets/Scripts/Bar.cs:20)

追記

Unityエディタのバージョンは2018.2.5f1 personalです
以前の質問と重複してしまいますがお願いします<(_ _)>

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

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

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

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

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

guest

回答1

0

unity3d - Unity5.6 Collision2D contact points array index out of range error - Stack Overflowに寄せられたIsukaさんの回答によると、バージョン5.5から5.6にかけて、OnCollisionExit2Dの時点では接触点が取れないように修正が加えられた様子です。

以前似たようなケースを見かけたことがあるのですが、C# - UnityでのOnCollisionExitを用いた衝突位置検出(103368)|teratailではOnCollisionStay内で取得した最後の接触点を使用する案を投稿いたしました。

同様にOnCollisionStay2Dで最終接触点を求めることができそうですが、今回のケースではボールがバーに衝突した後すぐに跳ね返ってお互いが離れるので、OnCollisionEnter2Dにおける衝突点を使っても問題なさそうです。

C#

1 // フィールドを追加し... 2 private float latestContactX; 3 4 void OnCollisionEnter2D(Collision2D collision) 5 { 6 // OnCollisionEnter2D時点での接触点を覚えておき... 7 latestContactX = collision.contacts[0].point.x - transform.position.x; 8 } 9 10 void OnCollisionExit2D( Collision2D collision ) 11 { 12 // OnCollisionExit2Dでは覚えておいた接触点を使用する 13 var rate = latestContactX / (GetComponent<RectTransform>().rect.width * .5f); 14 var ball = collision.collider.GetComponent<Ball>(); 15 // 最大で30度向きを回転させる 16 ball.Rotate( rate * 30 ); 17 }

※関連する質問を複数投稿した場合にどうするべきかについては、私もteratailの作法についてあまり知識がないのですが、たとえば質問本文を編集し、お互いの質問に相互リンクをはるというのも一案かと思います。これなら、閲覧者の方々がどちらのご質問を読んだ場合でも、もう一つの質問を参照しやすくなって解決の助けになりそうです。

投稿2018/10/06 20:53

Bongo

総合スコア10807

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問