テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】キャラクターの向きをマウスのある方向に向ける(2D/3D)

f:id:tsubaki_t1:20170702215521g:plain

今回は上から視点で、マウスのある方向にキャラクターを向けようと思います。

マウスの位置にキャラクターの向きを変える

上から見下ろす感じの視点(トップビュー)でゲームをする場合、キャラクターの向きを変えるのは大体はジョイスティックもしくはマウスの位置です。

これは既にゲームの文脈として登録されており、普通に使われる操作です。古事記にもそう書いてあります。

 

特に「照準」をマウス(右手)で行い、移動はキーボードWASD(左手)の文脈では、かなりよく使われる手法です。*1

今回はそのやり方について、少しメモします。

本当はコレの感じのゲームをUnity1Weekに出したかった

サバイバルシューターから学ぶ

まずはゲーム内のマウス位置を取得します。

その辺りはUnityの初心者向けチュートリアル「Serival Shooter」を見てみます。

unity3d.com

やり方はカメラから見たマウスの位置と地面との交点の方向を向く方法です。

Ray camRay = Camera.main.ScreenPointToRay (Input.mousePosition);

でカメラからマウスの位置に対しての光線(Ray)を

Physics.Raycast (camRay, out floorHit, camRayLength, floorMask)

で実際にレイを飛ばしています。

後は「地面に接触した部分」が実際の地面という事みたいです。

f:id:tsubaki_t1:20170702221309j:plain

後はキャラクターをRayの交点の方向に向けるだけです。

Vector3 playerToMouse = floorHit.point - transform.position;  Quaternion Quaternion newRotation = Quaternion.LookRotation (playerToMouse);

地面からColliderを取っ払う

なんとなくコレだけの為にColliderを作るのは負けた気がしなくもないです。また、手前に高い建物等があるとヒットしてしまう可能性を回避するためマスクを設定するのも、なんとなく負けた気がします。

ので、PhysicsRaycastは止めて、Plane.Raycastを使ってみます。

docs.unity3d.com

gist.github.com

これで高さの異なる場所でも、かつ手前に障害物があっても問題なく回せます。PerspectiveでもOrthographicでもどちらでも。

f:id:tsubaki_t1:20170702224002g:plain

f:id:tsubaki_t1:20170702233659g:plain

2Dの場合でも同じようにしてみる

2Dの場合も基本は同じアプローチで出来ます。

gist.github.com

f:id:tsubaki_t1:20170702230436g:plain

2Dって画面だけで向きとれるんじゃね…?

ふと思いました。あれ、これ別にPlane使う必要なくね…?

何せ2Dの場合は上から視点、距離は固定ですしなんか問題なく使えそうです。

ということで、Rayを飛ばすのではなく、キャラクターの位置をScreenSpaceに直して回転を求めてみます。

gist.github.com

f:id:tsubaki_t1:20170702230940g:plain

これはこれで…

*1:同人系は逆(右手カーソル移動の、左手ZXC操作)