質問: キューブが積み重なったステージに、プレイヤーが操作するキューブを転がすゲームを作成しています。 そこで、転がすことが出来る方向を調べるために、複数のキューブの位置を同時に調べるスクリプトが書きたいです。 Physics.OverlapBoxを利用すれば調べられると思ったのですが、同時に選択する方法が分からず困っています。 if (Physics.OverlapBox(transform.position + new Vector3(0, -1, 0), new Vector3(0.1f, 0.1f, 0.1f)).Length > 0) ここに(-1,-1,0)や(-1,0,0)も同時に同時に存在するか調べるためにはどのように書いたらよいでしょうか。 よろしくお願いします。 (補足) ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/2e61bb99af045c941c2773b84eeff34b.png) この画像の1に水色のキューブがある時(水色のキューブから見て(0,-1,0)(-1,-1,0)に白色のキューブがある時)は左に90度転がる 画像の2に水色のキューブがある時(水色のキューブから見て(0,-1,0)(-1,-1,0)(0,-1.0)に白色のキューブがある時)は上に180度転がる 画像の3に水色のキューブがある((水色のキューブの周り(0,-1,0)にのみ白色のキューブがある時は)下に180度転がる このように処理をしたいと考えています。 キューブを転がす処理は出来ているので、あとは周りにあるキューブの位置で転がす処理を変えたいと考えています。 しかし上記の書き方では同時に複数のキューブの位置を調べることが出来なかったので困ってしまいました。 このような場合、どのように書けば同時に複数のオブジェクトの位置を判別して処理を分けることが出来るでしょうか。
回答: 第二引数がボックスサイズの半分=判定する領域を指定しているので、 「現在地からVector3分離れたところにヒットするか」ではなく 「現在地からVector3分の範囲内でヒットするか」と考えた方がいいでしょう。 `Collider[] colList = Physics.OverlapBox(transform.position, new Vector3(1.0f, 1.0f, 1.0f);` これで「現在地から1辺の長さが1unityの立方体の範囲内にあるColliderの配列」が取得出来ます。 (立方体の大きさ(Vector3の大きさ)は適宜変更してください) この後取得したColliderのtransform.positionと自身のtransform.positionの位置を比較したりベクトルを求めれば「存在しているのはどの方向にあるオブジェクトか(=所定の方向にあるオブジェクトの有無)」が分かると思います。 2017/02/24 13:16のコメントと質問編集を受けて追記 他にも方法はありますが、分かりやすい方法で書きます。 ``` //当たっているColliderを全て取得 Collider[] colList = Physics.OverlapBox(transform.position, new Vector3(1.0f, 1.0f, 1.0f); int countA = 0; //説明1 foreach (Collider item in colList) { //説明2 if (item.transform.position == transform.position + Vector3(0, -1, 0)) { countA ++; //説明3 } if (item.transform.position == transform.position + Vector3(-1,-1,0)) { countA ++; } if (item.transform.position == transform.position + Vector3(-1,0,0)) { countA ++; } } if (countA == 3) { //説明4 //処理Aを実行する } ``` 何をしているのかというと...... 1.処理Aの条件は3つあるので、条件を数える「countA」という変数を作ります。 2.「foreach」は「colList(=取得したColliderの配列)を1つ1つitemに入れて{ }内の処理を実行を繰り返す」命令です。 3.「itemの位置」が「自分(=水色のキューブ)の位置+指定位置」だったら、処理Aの条件を1つ満たしたとみなし、countAを1増加させます。 4.全てのColliderの位置を確認後、countAの値を確認して条件を達成していたら処理Aを実行します。 ※「同じ位置に複数のオブジェクトが存在しない」ことを前提にしています。 ※動作確認はしていないので、問題がある場合は適宜修正してください。 ※処理負荷は考慮していません。 処理B、処理Cも同じ要領で行えるので考えてみてください。 (countB、countCという変数と位置を調べる条件分岐を増やしてカウントする) また、if文をもっとスマートに書く方法もあるので慣れてきたら調べてみてください。 なお、丸投げ質問とみなされるので次からは何が分からないのかを具体的に書くとよいと思います。 (例えば「取得したColliderの位置の取得が分からない」「位置の取得は出来るが、比較する方法が分からない」など)