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

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

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

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

Unity

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

Q&A

1回答

8035閲覧

Physics.OverlapBoxの書き方を教えてください

YYGAME

総合スコア15

C#

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

Unity

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

0グッド

1クリップ

投稿2017/02/23 09:00

編集2022/01/12 10:55

キューブが積み重なったステージに、プレイヤーが操作するキューブを転がすゲームを作成しています。
そこで、転がすことが出来る方向を調べるために、複数のキューブの位置を同時に調べるスクリプトが書きたいです。

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)も同時に同時に存在するか調べるためにはどのように書いたらよいでしょうか。

よろしくお願いします。

(補足)
イメージ説明

この画像の1に水色のキューブがある時(水色のキューブから見て(0,-1,0)(-1,-1,0)に白色のキューブがある時)は左に90度転がる

画像の2に水色のキューブがある時(水色のキューブから見て(0,-1,0)(-1,-1,0)(0,-1.0)に白色のキューブがある時)は上に180度転がる

画像の3に水色のキューブがある((水色のキューブの周り(0,-1,0)にのみ白色のキューブがある時は)下に180度転がる

このように処理をしたいと考えています。
キューブを転がす処理は出来ているので、あとは周りにあるキューブの位置で転がす処理を変えたいと考えています。
しかし上記の書き方では同時に複数のキューブの位置を調べることが出来なかったので困ってしまいました。

このような場合、どのように書けば同時に複数のオブジェクトの位置を判別して処理を分けることが出来るでしょうか。

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

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

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

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

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

guest

回答1

0

第二引数がボックスサイズの半分=判定する領域を指定しているので、
「現在地から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のコメントと質問編集を受けて追記

他にも方法はありますが、分かりやすい方法で書きます。

C#

1//当たっているColliderを全て取得 2Collider[] colList = Physics.OverlapBox(transform.position, new Vector3(1.0f, 1.0f, 1.0f); 3 4int countA = 0; //説明1 5foreach (Collider item in colList) { //説明2 6 if (item.transform.position == transform.position + Vector3(0, -1, 0)) { 7 countA ++; //説明3 8 } 9 if (item.transform.position == transform.position + Vector3(-1,-1,0)) { 10 countA ++; 11 } 12 if (item.transform.position == transform.position + Vector3(-1,0,0)) { 13 countA ++; 14 } 15} 16 17if (countA == 3) { //説明4 18 //処理Aを実行する 19}

何をしているのかというと……
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の位置の取得が分からない」「位置の取得は出来るが、比較する方法が分からない」など)

投稿2017/02/23 11:16

編集2017/02/24 06:17
sakura_hana

総合スコア11425

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

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

YYGAME

2017/02/23 12:26

丁寧な回答ありがとうございます。 Colliderの配列の取得をした後に自分のキューブから見て(0, -1, 0)(-1,-1,0)(-1,0,0)の位置にオブジェクトのキューブがあるときは処理A (0, -1, 0)(-1,-1,0)の時は処理B (0, -1, 0)の時は処理Cというように書きたいのですがどのように書いたらいいですか?
sakura_hana

2017/02/23 12:45

既に回答内に記載していますが、どこがわかりませんか?
YYGAME

2017/02/24 04:16

親切な回答をしていただいたにも関わらず理解できず申し訳ありません。 質問を編集、補足させていただきました。 言葉足らずな質問で申し訳ありませんでした。 キューブの位置の取得後の処理が分からず困っています。 お手数をおかけしますがよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問