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; } }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。