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

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

ただいまの
回答率

90.53%

  • C#

    7076questions

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

  • Unity

    3969questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,026

YYGAME

score 9

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

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度転がる

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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 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のコメントと質問編集を受けて追記

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

//当たっている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の位置の取得が分からない」「位置の取得は出来るが、比較する方法が分からない」など)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/23 21:26

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

    キャンセル

  • 2017/02/23 21:45

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

    キャンセル

  • 2017/02/24 13:16

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

    お手数をおかけしますがよろしくお願いいたします。

    キャンセル

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

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

関連した質問

  • 解決済

    Blender Game Engineでマテリアルを透過したい

    Blenderでゲーム開発をしようとしているものです。 Blender Renderで透過処理したマテリアルをBlender Gameに反映させたいと思っているのですが、透過でき

  • 解決済

    jupyter notebookで起動したWEBインターフェース上に実行ボタンなどが現れない

    質問内容 jupyter notebookで起動したWEBインターフェース上に実行ボタンなどのツールバーが表示されないので、表示されるようにしたい。 詳細は下にあります。

  • 解決済

    xcode Vertical Stack View

    xcodeの基本を学んでいるのですが、 main.storyboardにObject LibraryのVertical Stack Viewを ドラッグ&ドロップし、 そのV

  • 解決済

    cloud9のコマンドラインの出し方

    わからないこと cloud9を使っていて、コマンドラインを消してしまって出し方がわからなくなってしまいました。 いろいろ探してみましたが見つかりませんでした。 とても

  • 解決済

    PyCharmとGitLabの連携方法について

    PyCharm2017.1 を使っております https://plugins.jetbrains.com/plugin/7319-gitlab-integration 上記のG

  • 解決済

    IntelliJ IDEA でKotlinの実行ができない

    実現したいこと IntelliJ IDEAで Kotlinのプログラムを実行したいです。 しかしエラーが表示されてしまいます。 ソースコード package sampl

  • 解決済

    vb2017でexcel2016操作

    vb2017を使っています。 communityです。 excel2016を開いてセルのデータを読み込みたいと思っています。 参考にしているサイトです。 http://d.

  • 解決済

    cloud9 エディタ、ターミナルが表示されない

    ###前提・実現したいこと cloud9で作業中、どこか変なところを押したのかエディタが表示されなくなりました。 戻すために更に色々いじると何も表示されなくなりました。 元の画

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

  • C#

    7076questions

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

  • Unity

    3969questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。