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

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

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

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

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

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

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

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

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

前提条件

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

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

EventSystemの配置

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

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

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

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

PhysicsRaycasterの適用

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

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

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

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

コライダーの適用

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

既に適用済みの場合は本手順はスキップして問題ありません。ただし、PhysicsRaycasterの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パッケージ側移動されています。リファレンスを参照する際はご注意ください。

スクリプトの適用

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

実行結果

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

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

【Unity】パーリンノイズで様々な物を揺らす
ゲーム中のオブジェクトやUI、カメラなどを振動させるための手段として、パーリンノイズを用いる方法があります。 パーリンノイズを用いると、次のように様々な物を振動させることができます。 本記事では、スクリプトからパーリンノ ...

さいごに

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

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

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

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

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

参考サイト