今回はUnity2Dでマウスの位置を追いかけるようにプレイヤーを移動させてみます。
はじめに
Unityのバージョンは2021.3.14f1です。
「位置変更」と「Rigidbodyを利用」する2パターンで簡単に実装してみます。
実装開始
まずは簡単な「transform.position」の変更で実装後、Rigidbodyを利用する方法も試してみます。
位置変更で実装
Hierarchy画面で右クリックして「2DObject」→「Sprites」→「Square」を追加。
名前を「Chase」にして、スケールを変更。同じ名前のスクリプトをアタッチします。
スクリプトの中身は下記に変更します。
using UnityEngine; public class Chase : MonoBehaviour { private float speed = 1.0f; private Vector2 mousePos; private void Update() { mousePos = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition); } private void FixedUpdate() { transform.position = Vector2.MoveTowards(transform.position, mousePos, speed * Time.fixedDeltaTime); } }
Update内でマウス位置を取得、FixedUpdate内のVector2.MoveTowardsで「現在地から目的地に向けて移動」しています。
実行すると下記の様になります。
方向転換
下記の様に目を追加して、向き(進行方向)を決めます。
スクリプトを下記に変更。
using UnityEngine; public class Chase : MonoBehaviour { private float speed = 1.0f; private Vector2 mousePos; private void Update() { mousePos = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition); } private void FixedUpdate() { transform.position = Vector2.MoveTowards(transform.position, mousePos, speed * Time.fixedDeltaTime); transform.up = mousePos - (Vector2)transform.position; } }
実行すると下記の様にマウスに向かって進んでいるような動きになります。
Rigidbodyで実装
次はリジッドボディを利用した場合の例です。
まずはRigidbody2Dをアタッチ、GravityScaleを0にします。
スクリプトは下記の様な感じに変更。
using UnityEngine; public class Chase : MonoBehaviour { private float speed = 10.0f; private float rotationSpeed = 2.0f; private Rigidbody2D rb; private Vector2 mousePos; private void Start() { rb = GetComponent<Rigidbody2D>(); } private void Update() { mousePos = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition); } void FixedUpdate() { Vector2 dir = mousePos - (Vector2)transform.position; rb.AddForce(dir * speed * Time.fixedDeltaTime); float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg - 90f; Quaternion target = Quaternion.AngleAxis(angle, Vector3.forward); transform.rotation = Quaternion.Slerp(transform.rotation, target, rotationSpeed * Time.fixedDeltaTime); } }
下記の3行でオブジェクトの向きを変更(回転)しています。
float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg - 90f; Quaternion target = Quaternion.AngleAxis(angle, Vector3.forward); transform.rotation = Quaternion.Slerp(transform.rotation, target, rotationSpeed * Time.fixedDeltaTime);
実行すると下記の様な感じに。
滑っている感じに動いていますが、Rigidbody2DのLinearDrag、AngularDragの値を変更することで調整できます。