2DSpriteの上にマウスカーソルが重なっているかどうか判定する方法

2DSpriteの上にマウスカーソルが重なっているかどうか判定する方法_アイキャッチ
目次

はじめに

Unityで2Dゲームを作っていると、

  • 「マウスがスプライトの上にあるか判定したい」
  • 「クリックやホバーで色を変えたい」
  • 「New Input Systemを使ったマウス判定を知りたい」

といった場面がよくあります。

この記事では、Collider2Dを使ってスプライトの上にマウスが乗っているかを判定するスクリプトを、解説していきます。

スクリプト全体の概要

今回解説するスクリプトは、ざっくりこんなことをやっています。

  • マウスの位置を取得する
  • スクリーン座標をワールド座標に変換
  • Collider2D.OverlapPoint() を使ってマウスカーソルがスプライト上にあるか判定
  • 乗っている間はスプライトの色を変更

ソースコード解説

そしてこれがソースコード全体になります。このあとにスクリプト内容の一部解説をしていきます。

using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(Collider2D))]
public class SpriteClickChecker : MonoBehaviour
{
    private Camera mainCamera;
    private Collider2D col;

    private Vector3 _spritePos;

    private void Awake()
    {
        mainCamera = Camera.main;
        col = GetComponent();
    }

    private void Update()
    {
        if (Mouse.current == null || mainCamera == null || col == null)
        {
            Debug.Log(Mouse.current);
            Debug.Log(mainCamera);
            Debug.Log(col);
            return;
        }

        // マウスの現在位置(スクリーン座標 → ワールド座標)
        Vector2 mouseWorldPos = mainCamera.ScreenToWorldPoint(Mouse.current.position.ReadValue());
        //Debug.Log(mouseWorldPos);
        if (col.OverlapPoint(mouseWorldPos))
        {
            Debug.Log("マウスがスプライトの上にあります!");
            col.gameObject.GetComponent().material.color = Color.black;
            _spritePos = col.transform.position;
        }
        else
        {
            col.gameObject.GetComponent().material.color = Color.white;
        }
    }

    public Vector3 GetSpritePos()
    {
        return _spritePos;
    }
}

Update メソッドの安全チェック

if (Mouse.current == null || mainCamera == null || col == null)
{
    Debug.Log(Mouse.current);
    Debug.Log(mainCamera);
    Debug.Log(col);
    return;
}

ここではNullチェックを行っています。

  • New Input System が無効
  • カメラが存在しない
  • Collider が取得できていない

といった状態の場合、ログを出力してその後の判定をしないようにします。

実行した時に原因が分かるので、デバッグしやすいようにしています。

マウス位置をワールド座標に変換

Vector2 mouseWorldPos =
    mainCamera.ScreenToWorldPoint(Mouse.current.position.ReadValue());

マウス位置をワールド座標に変換に変換する関数を使用しています。引数はマウス入力を簡易的に取得する関数です。

InputSystemからの入力を簡易的に取得する関数のことを詳しく知りたい場合はこちらの記事を参考にしてみてください。

投稿が見つかりません。

Collider2D.OverlapPoint による判定

if (col.OverlapPoint(mouseWorldPos))

マウス座標がCollider2D の内部にあるかどうかを true / false で返します。

スプライトの色変更処理

{
   Debug.Log("マウスがスプライトの上にあります!");
   col.gameObject.GetComponent().material.color = Color.black;
   _spritePos = col.transform.position;
}
else
{
   col.gameObject.GetComponent().material.color = Color.white;
}
  • マウスが乗っている間 → 黒色
  • その時のスプライト位置を保存
  • マウスが外れたら → 白色に戻す

最後にマウスカーソルに重なってるスプライトの座標を保存したりしているので必要なければ削除して大丈夫です。

まとめ

今回紹介した基本的なスクリプトはクリック判定、ドラッグ、オブジェクト選択などにも応用できるので、
ぜひ自分のプロジェクトに合わせて拡張してみてください。

よかったらシェアしてね!
目次