【Unity】オブジェクトのクリックを検知する

こじゃらこじゃら

画面に映っているオブジェクトをクリックしたら反応するようにしたいの。

このはこのは

EventSystemを使えばこの辺がスムーズに実装できるわ。

オブジェクトがクリックされたことを検知する方法の紹介です。

やり方は一通りではありませんが、本記事ではEventSystemを用いた方法を紹介します。

実装の流れは以下のようになります。

実装の流れ
  • EventSystemをシーンに配置
  • PhysicsRaycasterをカメラに追加
  • クリック対象オブジェクトにコライダーを設定
  • クリック検知スクリプトの実装
  • クリック検知スクリプトをオブジェクトにアタッチする

以上の流れでクリック検知を実現する方法を解説していきます。また、Input Systemに対応させる方法にも触れておきます。

動作環境
  • Unity2021.2.3f1
  • Unity UI 1.0.0
  • Input System 1.1.1

スポンサーリンク

前提条件

予め画面内にオブジェクトが見えるように配置されているものとします。

これらのオブジェクトをクリックしたら、スクリプトからこれを検知してログ出力するようにしていきます。

EventSystemの配置

EventSystemオブジェクトをシーンに配置します。これはクリック通知などあらゆるイベントを管理するためのものです。

参考:イベントシステム – Unity マニュアル

Hierarchy左上+ボタンより、UI > Event Systemの順に選択します。

Input Systemを使用している環境では、EventSystemのStandard Input Moduleコンポーネントに以下のようなエラーメッセージが表示されることがあります。これは、EventSystemがInput Managerを使おうとしているために表示される警告です。

この時は、Replace with InputSystemUIInputModuleボタンをクリックしてInput System UI Input Moduleに置き換えてください。

参考:UI support | Input System | 1.10.0

PhysicsRaycasterの適用

シーン内の3Dオブジェクトに対してレイキャストするためのコンポーネントです。マウスクリックされたときなどにレイを飛ばし、ヒットしたオブジェクトにクリック通知したりする役割があります。

参考:Physics Raycaster – Unity マニュアル

必ずカメラにアタッチする必要があります。

動画のように対象カメラ(メインカメラなど)Add ComponentボタンからPhysics Raycasterコンポーネントを追加してください。

メモ

2Dゲームの場合はPhysics 2D Raycasterコンポーネントを追加してください。

参考:Physics 2D Raycaster – Unity マニュアル

必要に応じてEvent Maskを編集し、クリックに反応する対象レイヤーを絞ります。

コライダーの適用

クリックされるオブジェクトにコライダーを適用します。

3Dの場合は3D用のコライダー(Box Colliderなど)2Dの場合は2D用のコライダー(Box Collider 2Dなど)を指定することに注意してください。

既に適用済みの場合は本手順はスキップして問題ありません。ただし、Physics Raycaster(2Dの場合はPhysics 2D Raycaster)のEvent Maskに設定されているレイヤーでなければクリック検知されないことにご注意ください。

クリック検知スクリプトの実装

スクリプトからクリック検知できるようにするためには、IPointerClickHandlerインタフェースを実装したクラスを作成する必要があります。

参考:Interface IPointerClickHandler | Unity UI | 1.0.0

以上踏まえたクリック検知するスクリプトは次のようになります。

using UnityEngine;
using UnityEngine.EventSystems;

public class ObjectClickExample : MonoBehaviour, IPointerClickHandler
{
    // クリックされたときに呼び出されるメソッド
    public void OnPointerClick(PointerEventData eventData)
    {
        print($"オブジェクト {name} がクリックされたよ!");
    }
}

オブジェクトがクリックされるとOnPointerClick()メソッドがEventSystem側から呼び出されます。

注意

IPointerClickHandlerなどのEventSystem関連クラスはUnity UI 1.0.0パッケージ側で管理されるようになりました。これに伴い、スクリプトリファレンスのページがUnity UIパッケージ側移動されています。リファレンスを参照する際はご注意ください。

スクリプトの適用

クリックされる側の各オブジェクトに対して前述のスクリプトをアタッチします。

実行結果

例えば、クリックされたときにオブジェクトを揺らすようにすれば、次のような演出ができます。

オブジェクトの揺らし方については、以下記事をご覧ください。

さいごに

オブジェクトのクリック検知は、EventSystemPhysicsRaycasterイベントハンドラを用いて実現できます。

本記事で紹介した以外にも、Physicsのレイキャストを用いて判定する方法もあります。

しかしながら、EventSystemを用いる方式では、クリック通知の処理をEventSystem側に任せることができ、役割が綺麗に分かれるといったメリットがあります。

クリック検知以外にも、ドラッグマウスオーバーなど様々な通知機能があるため、気になる方は以下公式リファレンスをご覧ください。

参考:Namespace UnityEngine.EventSystems | Unity UI | 1.0.0

参考サイト

スポンサーリンク