画面に映っているオブジェクトをクリックしたら反応するようにしたいの。
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に置き換えてください。
参考:UI support | Input System | 1.10.0
PhysicsRaycasterの適用
シーン内の3Dオブジェクトに対してレイキャストするためのコンポーネントです。マウスクリックされたときなどにレイを飛ばし、ヒットしたオブジェクトにクリック通知したりする役割があります。
参考:Physics Raycaster – Unity マニュアル
必ずカメラにアタッチする必要があります。
動画のように対象カメラ(メインカメラなど)にAdd ComponentボタンからPhysics Raycasterコンポーネントを追加してください。
2Dゲームの場合はPhysics 2D Raycasterコンポーネントを追加してください。
必要に応じて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
以上踏まえたクリック検知するスクリプトは次のようになります。
オブジェクトがクリックされるとOnPointerClick()メソッドがEventSystem側から呼び出されます。
IPointerClickHandlerなどのEventSystem関連クラスはUnity UI 1.0.0パッケージ側で管理されるようになりました。これに伴い、スクリプトリファレンスのページがUnity UIパッケージ側に移動されています。リファレンスを参照する際はご注意ください。
スクリプトの適用
クリックされる側の各オブジェクトに対して前述のスクリプトをアタッチします。
実行結果
例えば、クリックされたときにオブジェクトを揺らすようにすれば、次のような演出ができます。
オブジェクトの揺らし方については、以下記事をご覧ください。
さいごに
オブジェクトのクリック検知は、EventSystemとPhysicsRaycasterとイベントハンドラを用いて実現できます。
本記事で紹介した以外にも、Physicsのレイキャストを用いて判定する方法もあります。
しかしながら、EventSystemを用いる方式では、クリック通知の処理をEventSystem側に任せることができ、役割が綺麗に分かれるといったメリットがあります。
クリック検知以外にも、ドラッグやマウスオーバーなど様々な通知機能があるため、気になる方は以下公式リファレンスをご覧ください。
参考:Namespace UnityEngine.EventSystems | Unity UI | 1.0.0