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

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

ただいまの
回答率

87.58%

多角形(六角形)と円の当たり判定の予測方法を知りたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 784

score 20

前提・実現したいこと

unityで六角形の当たり判定を持ったオブジェクトを使って反射の計算をしたいです。
(イメージとしては某スマホアプリのモ○ストっぽいものを作りたいです。。。)

事前に反射の方向を予測(六角形が壁に当たった際の中心点を取得)するために
六角形のraycastが見つからなくどうすればよいか困っています。。。

何か良い方法があれば教えていただけないでしょうか。。。
↓イメージ画像

イメージ説明
イメージ説明

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

現在反射の計算をしようとしている最中ですが線のraycastを用いて
六角形の中心からrayを飛ばして、あたった部分からの反射を計算しているのですが
実際には六角形の枠部分が先に当たるため、若干反射がずれてしまいます。。。

![イメージ説明]

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

勘違いしていたらすみません
やりたいことってこういうことでしょうか?

イメージ説明

            [SerializeField] private Transform[] yellowPoints;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            float distance = -1;
            int no = -1;
            RaycastHit hit = new RaycastHit();

            for (int i = 0; i < yellowPoints.Length; i++) {
                ray.origin = yellowPoints[i].position;
                if (Physics.Raycast(ray, out RaycastHit _hit, 1000)) {
                    if (distance == -1 || distance > _hit.distance) {
                        distance = _hit.distance;
                        hit = _hit;
                        no = i;
                    }
                }
            }

            // 1つでもヒットしたら
            if (distance != -1) {
                Vector3 reflect = Vector3.Reflect(ray.direction, hit.normal);

                Vector3 diff = yellowPoints[no].position - player.position;
                float r = diff.magnitude;
                greenHexagon.position = hit.point - diff.normalized * r;

                line.positionCount = 3;
                line.SetPosition(0, player.position);
                line.SetPosition(1, greenHexagon.position);
                line.SetPosition(2, greenHexagon.position + reflect * 10);
            }


ちょっと汚いですがこんな感じで↑のGifの緑六角形と線を動かしてます

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/12/03 17:41 編集

    lazh様
    ご回答ありがとうございます。
    やりたいことですがその通りです。
    コードまで記載してくださり大変ありがとうございます。
    一応あっているかの確認と一点お聞きしたいことがございます。
    (お時間ある際にご返信いただけると幸いです)
    1、六角形から複数のrayを飛ばし、円に当たったところで一番距離が短いものをhitした場所とする。
    2、ヒットしたポイントに該当する六角形の点と六角形の中心点との距離をdiffとしておく。
    3、緑色の六角形を記載するの中心点を(rayのhitした点)-(diff)で求める。ということでしょうか。

    質問ですが、上記の3に該当する部分でdiffをnormalizeしてrを掛けている部分ですが、これは何をしている部分でしょうか。(diffだけでは求めることはできないでしょうか。)

    キャンセル

  • 2020/12/03 21:23

    >一応あっているかの確認
    あってます!

    >(diffだけでは求めることはできないでしょうか。)
    まったくもってその通りです!!!
    なんか無駄なことしてますね!

    キャンセル

  • 2020/12/03 23:11

    早速のご返信ありがとうございます。
    参考にさせていただいて作成したいと思います。
    困っていたので非常に助かりました。
    今回はお時間いただき大変ありがとうございました。

    キャンセル

0

そもそも以下の方法とはどうなんでしょうか?
どうしてもコライダーを使って計算したいのあれば別ですが..

Trigger+移動アニメションを使う

RigidBody2d MovePosition大きいコライダーに入る前と入る後の移動後の位置をpositionを計算します.
はじめ一定の位置から大きいほうのコライダーにmovepositionで移動します.その後Triggeで検知した瞬間に移動後の位置を計算→MovePositionで移動

Trigger+DOTweenを使う

方法としては上記とほぼ同じです.以下略(詳しくはDOTween移動とかで調べてください)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/11/30 13:28

    ご返信ありがとうございます。
    確かにその通りです。
    中心点はどのように取得すればよいか教えていただけないでしょうか。

    こちらの説明不足で申し訳ありません。
    流れとして
    1、小さいコライダーの打ち出す向きを決定する(実際に打ち出すまでは向きを変更可能)
    2、その際に別のコライダーに当たった際の反射予測線をリアルタイムで(ほぼ遅延がなく)出す。
    予測線をだすために当たった際の中心点が事前に(打ち出す前に)必要。

    何度もお手数をおかけしますがご回答いただけないでしょうか。

    キャンセル

  • 2020/11/30 14:22

    中心点はspriteからいろいろ計算できると思います.
    初めから聞かずにご自身出お調べ手になってから,わからない部分のみを聞いてください

    キャンセル

  • 2020/11/30 21:55

    ayousanz様
    再度ご返信ありがとうございます。
    またまたこちらの言葉不足で大変失礼いたしました。。
    壁に当たった瞬間の中心点の取得方法は存じております。
    そうではなくて、小さいコライダー を打ち出す前に壁に当たった際の中心点を予測して
    知りたいのです。今回、六角形が円に当たるということなのでややこしく聞いている次第でございます。
    (方法がわからず困っているということです。抽象的な質問方法ですので
     具体的なやり方はもちろん自分で調べる予定です。)

    キャンセル

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

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

関連した質問

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