こんにちは。
Unity2Dで、キャラをマウスで操作したい(スマホならタップで)と思ったので実装してみました。
以下はその方法になります。
Version:Unity 2019.2.17f1
概要
https://twitter.com/matarinblog/status/1213710017007779841/video/1
上のような感じで、マウスでクリックした方向に向けてキャラクターが移動します。
今回は素材として、いらすとやさんからエビと滝の画像を用意しました。
スクリプト
動かしたいキャラクターにアタッチしてください。
素人なのでもっと簡単な方法があるかもしれません。
解説は以下で。
解説
手順は次の通りです。
- マウスカーソルとエビの座標を取得する。
- そこから移動する方向を決める。
- その方向に移動させる。
- 方向に応じてキャラクターを回転させる。
移動
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が負になれば上手いこと回転してくれます。
コメント