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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

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

Q&A

解決済

2回答

1921閲覧

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

sakuramoti

総合スコア20

Unity

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

0グッド

0クリップ

投稿2020/11/29 11:12

編集2020/12/02 11:57

前提・実現したいこと

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

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

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

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

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

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

![イメージ説明]

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

イメージ説明

C#

1 [SerializeField] private Transform[] yellowPoints; 2~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3 float distance = -1; 4 int no = -1; 5 RaycastHit hit = new RaycastHit(); 6 7 for (int i = 0; i < yellowPoints.Length; i++) { 8 ray.origin = yellowPoints[i].position; 9 if (Physics.Raycast(ray, out RaycastHit _hit, 1000)) { 10 if (distance == -1 || distance > _hit.distance) { 11 distance = _hit.distance; 12 hit = _hit; 13 no = i; 14 } 15 } 16 } 17 18 // 1つでもヒットしたら 19 if (distance != -1) { 20 Vector3 reflect = Vector3.Reflect(ray.direction, hit.normal); 21 22 Vector3 diff = yellowPoints[no].position - player.position; 23 float r = diff.magnitude; 24 greenHexagon.position = hit.point - diff.normalized * r; 25 26 line.positionCount = 3; 27 line.SetPosition(0, player.position); 28 line.SetPosition(1, greenHexagon.position); 29 line.SetPosition(2, greenHexagon.position + reflect * 10); 30 }

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

投稿2020/12/02 17:37

lazh

総合スコア300

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

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

sakuramoti

2020/12/03 08:42 編集

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

2020/12/03 12:23

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

2020/12/03 14:11

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

0

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

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

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

Trigger+DOTweenを使う

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

投稿2020/11/29 12:49

ayousanz

総合スコア258

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

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

sakuramoti

2020/11/29 17:22

ayousanz様  ご回答ありがとうございます。 当たった際の反射については教えていただいたもので実現できそうです。 ありがとうございます。 プラスで 事前に反射の予測線を出しておきたいということもあり、 何か良い方法がないかと検討中でした。 そのために大きいコライダー に当たった際の六角形の中心点+そこからの反射線があれば嬉しいのですが、何か良い方法はございませんか。
ayousanz

2020/11/29 20:19

反射する角度は光の屈折角と同等と考えた場合,反射する先は計算できると思います. 中心はそもそもobjectが持っているので,反射先の点と中心点を線で結び描写すればいいのではないでしょうか
sakuramoti

2020/11/30 04:28

ご返信ありがとうございます。 確かにその通りです。 中心点はどのように取得すればよいか教えていただけないでしょうか。 こちらの説明不足で申し訳ありません。 流れとして 1、小さいコライダーの打ち出す向きを決定する(実際に打ち出すまでは向きを変更可能) 2、その際に別のコライダーに当たった際の反射予測線をリアルタイムで(ほぼ遅延がなく)出す。 予測線をだすために当たった際の中心点が事前に(打ち出す前に)必要。 何度もお手数をおかけしますがご回答いただけないでしょうか。
ayousanz

2020/11/30 05:22

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

2020/11/30 12:55

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問