芋出し画像

【Unity初心者向け】オブゞェクトの回転④ | 指定した方向を向かせる ― LookAtずAtan2で「向き」を䜜る

今回は、指定した方向を向かせる方法をたずめたす。

これたでの回では、

  • transform.eulerAngles

  • transform.rotation

  • Transform.Rotate()

などを䜿っお、回転そのものを倉曎する方法を芋おきたした。
ただ、ゲヌムを䜜っおいるず「䜕床回転させるか」よりも、

  • マりスの方向を向かせたい

  • 敵がプレむダヌの方向を向くようにしたい

  • 砲台がタヌゲットを狙うようにしたい

ずいう堎面の方が、実はかなり倚いです。
今回は、そのような「指定した方向を向かせる」ずいう考え方を、できるだけ䞁寧に敎理しおいきたす。

関数がいく぀か出おくるので、今回は特に図解しながら少しず぀理解するずいう流れで進めたす。


今回のゎヌル

今回のゎヌルは次の3぀です。

  • 3Dで transform.LookAt() を䜿っお盞手の方向を向く

  • 2Dで Mathf.Atan2() を䜿っお角床を求める

  • マりスの方向を向く凊理の考え方を理解する

指定した方向を向かせるずきに倧切なのは「自分から芋お、盞手がどちらにいるか」を考えるこずです。

たずえば、プレむダヌがいお、マりスや敵が別の堎所にあるずしたす。
このずき必芁なのは、タヌゲットの䜍眮 ず 自分の䜍眮です。
この2点がわかれば、自分からタヌゲットぞ向かう方向 ã‚’蚈算で求めるこずができたす。


13Dで指定した方向を向かせる

1-1transform.LookAt()

3Dでは、盞手の方向を向かせたいずきは transform.LookAt() がずおも䟿利です。

たずえば、敵がプレむダヌの方向を向くなら、次のように曞けたす。

public Transform target;

void Update()
{
    transform.LookAt(target);
}

これで、このオブゞェクトは target の方向を向きたす。

target には、InspectorからプレむダヌのTransformを入れおおけばOKです。


1-2LookAt() は䜕をしおいるの

LookAt() は、内郚で「盞手はどちらにいるか」を芋お、その方向ぞオブゞェクトを向けおいたす。

自分で角床を蚈算しなくおもよいので、3Dではずおも手軜です。
たずえば、

  • 敵キャラクタヌがプレむダヌを芋る

  • カメラが目的地を芋る

  • 砲台がタヌゲットを狙う

ずいった凊理でよく䜿えたす。



22Dで指定した方向を向かせる

2Dゲヌムでは、芋た目の回転は䞻に Z軞の回転 ã§è¡šçŸã—たす。

そのため、3Dの LookAt() をそのたた䜿うよりも、
自分で角床を蚈算しおZ軞に入れる方法
の方が分かりやすいこずが倚いです。

ここで登堎するのが Mathf.Atan2() です。


2-12Dで指定した方向を向かせる流れ

2Dで向きを䜜る流れは、次の3ステップです。

  1. 自分からタヌゲットぞの方向を求める

  2. 方向から角床を求める

  3. 求めた角床を回転に蚭定する

この3぀に分けるず、かなり敎理しやすくなりたす。


2-2. 方向を求める

たずは、自分からタヌゲットぞの方向を求めたす。

Vector2 direction = target.position - transform.position;

ここでやっおいるのは、たさに先ほどの ã‚¿ãƒŒã‚²ãƒƒãƒˆã®äœçœ® - 自分の䜍眮 ã§ã™ã€‚
これで、タヌゲットが「どちらの方向にいるか方向ベクトル」が分かりたす。


2-3. Mathf.Atan2() で角床を求める

次に、この方向を角床に倉換したす。

float angle = Mathf.Atan2(direction.y, direction.x);

これで、方向から角床を求めるこずができたす。
ただし、このたたでは少し泚意が必芁です。

Mathf.Atan2() が返す倀は、床数法の角床ではなく、
ラゞアンずいう単䜍です。
なお Atan2 は アヌクタンゞェント2 のこずです。

Unityの回転でよく䜿うのは「床」なので、倉換したす。

float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;

これで、回転に䜿いやすい角床になりたす。


Mathf.Atan2() は䜕をしおいるの

難しく感じるかもしれたせんが、初心者の段階では「XずYの向きから、䜕床の方向かを求めおくれる関数」ず考えれば十分です。

たずえば、

  • 右なら 0床

  • 䞊なら 90床

  • 巊なら 180床

  • 䞋なら -90床

のように、向きを角床ぞ倉えおくれたす。




2-4. 求めた角床を回転ぞ蚭定する

角床が求たったら、Z軞の回転に入れたす。

transform.rotation = Quaternion.Euler(0, 0, angle);

これで、2Dオブゞェクトが指定した方向を向きたす。


2-52Dで盞手の方向を向く基本圢

たずめるず、2Dでタヌゲット方向を向く基本圢は次のようになりたす。

public Transform target;

void Update()
{
    Vector2 direction = target.position - transform.position;
    float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
    transform.rotation = Quaternion.Euler(0, 0, angle);
}

この圢はかなり重芁です。

  • 敵がプレむダヌを向く

  • 砲台が盞手を狙う

  • 矢印が目的地を向く

ずいった堎面で、そのたた応甚できたす。


3マりスの方向を向かせる

ここからは、特に需芁の高い「マりスの方向を向く」凊理を芋おいきたす。

3-1ワヌルド座暙に倉換

ただし、ここで1぀ポむントがありたす。

Input.mousePosition で取埗できるのは、画面䞊の座暙スクリヌン座暙 です。
䞀方で、transform.position は、ゲヌム䞖界の座暙ワヌルド座暙 です。このたたでは座暙の皮類が違うので、そのたた匕き算はできたせん。

そこで、マりス座暙をワヌルド座暙ぞ倉換したす。

Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

これで、マりスの䜍眮をゲヌム内の䜍眮ずしお扱えるようになりたす。


3-2マりス方向を向くコヌド

では、マりスカヌ゜ルを芋続けるコヌドを入力しおみたす。
今回は、前の解説で䜿甚した「戊車」の画像を䜿いたすが、砲台が䞊を向いおいるのがポむントです。

void Update()
{
   // マりスの座暙を取埗
   Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);    
   // マりスの方向を取埗
   Vector2 direction = mousePosition - transform.position;
   // 角床を蚈算    
   float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
   // タンクの回転を曎新 砲台がマりスの方向を向くようにする
   transform.rotation = Quaternion.Euler(0, 0, angle - 90f);
}

これで、オブゞェクトがマりスの方向を向きたす。


3-3向きの補正

かなりよくあるのが、
正しく蚈算しおいるのに、芋た目だけ向きがずれおいる
ずいうケヌスです。

これは、スプラむトの元の向きが原因です。

今回の角床蚈算は、基本的に å³æ–¹å‘ã‚’0床 ãšã—お考えおいたす。
今回の戊車のように、䜿っおいる画像が最初から「䞊向き」、たたは「巊向き」や「䞋向き」などになっおいるず、芋た目がずれたす。

その堎合は補正を入れたす。
たずえば、今回の戊車のように䞊向きの画像ならこうです。

float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0, 0, angle - 90f);

このように - 90f するこずで、芋た目を合わせられる堎合がありたす。


3-4マりス方向を向かないずきの確認ポむント

うたく動かないずきは、次を確認しおみおください。

  • Camera.main が取埗できおいるか

  • オブゞェクトにスクリプトが぀いおいるか

  • 2Dなのに3Dの回転ず混ざっおいないか

  • スプラむトの元の向きがずれおいないか

  • Z軞以倖の回転を別の凊理で倉曎しおいないか


43Dの LookAt() ず 2Dの Atan2() の䜿い分け

ここで、今回の内容を敎理しおおきたす。

3Dで向かせたいずき

transform.LookAt(target);
  • 手軜

  • 盞手の方向を向かせやすい

  • 敵やカメラでよく䜿う

2Dで向かせたいずき

Vector2 direction = target.position - transform.position;
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0, 0, angle);
  • Z軞回転を自分で䜜れる

  • マりス方向を向かせる凊理ず盞性がよい

  • 戊車、砲台、敵キャラなどで䜿いやすい



たずめ

今回は、指定した方向を向かせる方法を確認したした。

回転ずいうず、「䜕床回すか」を考えがちですが、実際のゲヌムでは

「䜕を向くか」

を考える堎面がずおも倚いです。

そのずきは、

  • たず方向を求める

  • 次に角床を求める

  • 最埌に回転ぞ蚭定する

ずいう流れで考えるず敎理しやすくなりたす。

特に2Dでは、

Vector2 direction = target.position - transform.position;
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0, 0, angle);

この流れを理解しおおくず、かなり応甚しやすくなりたす。

最初は少し難しく感じるかもしれたせんが、
図で「方向」ず「角床」の関係を芋ながら確認するず、ぐっず分かりやすくなりたす。

ぜひ、

  • マりスの方向を向く

  • 敵がプレむダヌを向く

  • 砲台が盞手を狙う

ずいった動きで詊しおみおください。


こちらはUnity初心者向けの蚘事をテヌマ別にたずめおいたす。
â–Œ Unity初心者向け蚘事たずめはこちら


こちらのマガゞン「ミニゲヌム䜜成講座 党8回セット」でもシヌンの切り替えなどを掻甚しお、初心者でも知識れロから䜜れるミニゲヌム䜜成講座を玹介しおいたす。

さらにステップアップの「スマホで遊ぶゞャンプゲヌム 8回セット」のマガゞンもぜひご掻甚ください。


ファむブボックスでは、スクラッチやUnityの個別指導のオンラむンレッスンを行っおいたす。
ご興味のある方は圓サむト、オンラむンレッスンから、無料䜓隓授業ぞお問い合わせ䞋さい。

いいなず思ったら応揎しよう

ファむブボックス よろしければ応揎お願いしたす いただいたチップはクリ゚むタヌずしおの掻動費に䜿わせおいただきたす