🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

7171閲覧

Unityの2Dでプレイヤーをマウスの方向に向ける方法について

porusan0880

総合スコア19

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/12/14 02:25

編集2019/12/14 02:36

Unityを勉強していて、2Dにてキャラクターをマウスカーソルの方向に向ける方法にて調べてみたところ、下記のパターンAとパターンBの2通りのやり方があるようですが、それぞれ使用用途が違うのでしょうか。
どもちらもどういう動きをしているか、イマイチまだ理解できていない状態なので教えていただけますでしょうか。

■パターンA
[PlayerControle.cs]

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerControle : MonoBehaviour { public float m_speed; // Update is called once per frame private void Update() { var h = Input.GetAxis("Horizontal"); var v = Input.GetAxis("Vertical"); var velocity = new Vector3(h, v) * m_speed; transform.localPosition += velocity; transform.localPosition = Utils.ClampPosition(transform.localPosition); var pos = Camera.main.WorldToScreenPoint(transform.localPosition); var rotation = Quaternion.LookRotation(Vector3.forward, Input.mousePosition - pos); transform.localRotation = rotation; } }

[Utils.cs]

using System.Collections; using System.Collections.Generic; using UnityEngine; // 便利な関数を管理を性的クラス public static class Utils { // 移動可能な範囲 public static Vector2 m_moveLimit = new Vector2(4.15f, 3.0f); // 指定された位置を移動可能な範囲に収めた値を返す public static Vector3 ClampPosition(Vector3 position) { // Mathf.Clamp(制限したいオブジェクトの座標,座標の最小値,座標の最大値) return new Vector3( Mathf.Clamp(position.x, -m_moveLimit.x, m_moveLimit.x), Mathf.Clamp(position.y, -m_moveLimit.y, m_moveLimit.y), 0 ); } }

■パターンB
[PlayerControle.cs]

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerControle : MonoBehaviour { public float m_speed; // Update is called once per frame private void Update() { var h = Input.GetAxis("Horizontal"); var v = Input.GetAxis("Vertical"); var velocity = new Vector3(h, v) * m_speed; transform.localPosition += velocity; transform.localPosition = Utils.ClampPosition(transform.localPosition); // プレイヤーのスクリーン座標を計算する var screenPos = Camera.main.WorldToScreenPoint(transform.position); // プレイヤーから見たマウスカーソルの方向を計算する var direction = Input.mousePosition - screenPos; // マウスカーソルが存在する方向の角度を取得する var angle = Utils.GetAngle(Vector3.zero, direction); // プレイヤーがマウスカーソルの方向を見るようにする var angles = transform.localEulerAngles; angles.z = angle - 90; transform.localEulerAngles = angles; } }

[Utils.cs]

using System.Collections; using System.Collections.Generic; using UnityEngine; // 便利な関数を管理を性的クラス public static class Utils { // 移動可能な範囲 public static Vector2 m_moveLimit = new Vector2(4.15f, 3.0f); // 指定された位置を移動可能な範囲に収めた値を返す public static Vector3 ClampPosition(Vector3 position) { // Mathf.Clamp(制限したいオブジェクトの座標,座標の最小値,座標の最大値) return new Vector3( Mathf.Clamp(position.x, -m_moveLimit.x, m_moveLimit.x), Mathf.Clamp(position.y, -m_moveLimit.y, m_moveLimit.y), 0 ); } public static float GetAngle(Vector2 from, Vector2 to) { // 指定された2つの一から角度を求める var dx = to.x - from.x; var dy = to.y - from.y; var rad = Mathf.Atan2(dy, dx); return rad * Mathf.Rad2Deg; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

パターンAは、Input.GetAxisから取得した方向で向きを
パターンBは、コメントの通りマウスカーソルとプレイヤーの座標から向きを変えています。

パターンAだとマウスカーソル関係ないので、スマホへ流用しやすいことがメリットでしょうか。

投稿2019/12/15 00:51

編集2019/12/15 00:53
madone99

総合スコア1857

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問