【Unity】2点間の角度を取得する【2D】
「2点間の角度を取得する」よりも「点Aから見て点Bは何度の位置にあるのかを取得する」みたいな感じに言った方がピンとくるかもしれません。たぶん。
スクリプトはこんな感じ。
GetAngle関数の部分を簡単に説明します。まず、2点(startとtarget)のx座標とy座標の差をそれぞれ求めます。その2つの差を引数としてMathf.Atan2に渡せば2点間の角度がラジアンで返ってくるので、Mathf.Rad2Degで度に変換しておしまい!
ただし、求められる角度はtargetがstartの真右にあるときに0度となります。角度の範囲は-180°~180°です。
Textを使って2点間の角度をリアルタイムに表示してみました。
Mathf.Atan2について
ここで、上のスクリプトにも登場しているMathf.Atan2について少しだけ説明します。
いきなり、数学の復習になりますが、tan(タンジェント)とその逆関数Atan(アークタンジェント)の関係を式で表すと
tanX=Y
X=AtanY
となります。ご覧の通り、tanXの値がわかれば角度Xを求めることができます。
Unityにはtanの値を渡すと角度を返してくれるMathf.Atanという関数が備えられています。
ただし、Mathf.Atanが返してくれる角度は-π/2~π/2で、半周分だけです。
その理由は、Mathf.Atanの引数がtanの値だけだからです。
0°~360°の範囲で、例えば、tanの値が1のとき、角度は45°と225°の2つの場合が考えられます。このとき、sinとcosの値もわかれば、45°なのか225°なのかを判別することができるのですが、Mathf.Atanの引数はtanのみです。sinとcosの値はわからないので、判別できません。
じゃあ、一周分の角度を取得したい場合どうすればいいのでしょう?
そんな時はMathf.Atan2を使いましょう!
Mathf.Atan2もMathf.Atanと同様に角度を返してくれる関数です。
異なるのは、引数です。
Mathf.Atan2には引数としてx座標とy座標を渡します。この2つの引数からtanだけでなく、sinとcosの値も求められるので、一周分の角度を返すことができます。
以下参考サイト。AtanとAtan2の違いについて本記事よりわかりやすく説明しています。
小ネタ atan2 | ++C++; // 未確認飛行 C ブログ
[C++] C ++のatanとatan2の違いは何ですか? math.h | CODE Q&A [日本語]