【Unity 2D】キャラをマウスカーソルの方向に向けて移動させるメモ

Unity

こんにちは。

Unity2Dで、キャラをマウスで操作したい(スマホならタップで)と思ったので実装してみました。
以下はその方法になります。

Version:Unity 2019.2.17f1

スポンサーリンク

概要

上のような感じで、マウスでクリックした方向に向けてキャラクターが移動します。

今回は素材として、いらすとやさんからエビと滝の画像を用意しました。



スクリプト


動かしたいキャラクターにアタッチしてください。

素人なのでもっと簡単な方法があるかもしれません。
解説は以下で。

解説

手順は次の通りです。

  1. マウスカーソルとエビの座標を取得する。
  2. そこから移動する方向を決める。
  3. その方向に移動させる。
  4. 方向に応じてキャラクターを回転させる。

移動

7行目

移動スピードを決めています。

18行目

Input.GetMouseButton(0) とすることで、マウスをクリックしている間{}内が実行されます。
引数の0は、左クリックを表します。
右クリックなら1、中クリックなら2になります。

21行目

Camera.main.ScreenToWorldPoint(Input.mousePosition) ではマウスカーソルの座標を取得、
this.transform.position ではエビの座標を取得しています。

これらを引き算すると エビ→カーソル方向のベクトルが得られます。

22行目

正規化しています。
つまり、ベクトルの大きさが1になります。

24行目

ベクトルになぜかZ座標が含まれてしまうので、Z座標を0にしておきます。

26行目

作ったベクトルの向きにエビを移動させています。
Time.deltaTime をかけておかないとスペックによって移動スピードが変わってしまうので、このような移動する処理のときは必ずかけておくようにします

回転

29行目

まず何度回転するかを決めないといけません。
そこで、Y軸プラス方向の単位ベクトルと、先ほど作った方向ベクトルの間の角度を求めています。

ただ、Vector3.Angle は必ず正の値を返してきます
例えば、(0, 1, 0) と (1, 0, 0) の間の角度は angle = 90 ですし、
(0, 1, 0) と (-1, 0, 0)の間の角度も angle = 90 となります。

30行目

必ず正の値を返されては困るので、方向ベクトルが右を向いているときは負の値にしてしまいます
なぜ右を負の値にするのかは次で分かります。

31行目

Quaternion.Euler でエビを回転させます。
今回、X,Y軸における回転はないので、Z軸における回転だけ考えればいいです。

Unityは左手座標系なので、反時計回りに回る方向が正となります。
なので、エビが左に移動するときはangleが正右に移動するときはangleが負になれば上手いこと回転してくれます。

コメント

タイトルとURLをコピーしました