Edited at

Unity(3D・2D) EventSystemでクリックイベントの制御

More than 1 year has passed since last update.


クリックなどのイベント

Unityでオブジェクトのクリックイベントなどは、Rayを飛ばす方法が一般的のようですが、EventSystemを使うともう少し簡単に書けるのでその方法です。

内部ではRaycasterでRayを飛ばしてるみたいですが、そこを意識しないでも使えるのがいいかなと。

Unityは初心者なので備忘録も兼ねて書きます。


1.カメラにRaycasterをアタッチ

カメラオブジェクトのInspectorから、AddComponentをクリックして、Physics Raycasterをアタッチします。

後述するコライダーが2DのときはPhysics 2D Raycasterの方をアタッチします。


2.EventSystemをシーンに配置する

シーン内に UI→EventSystemを配置します。


3.クリックされるオブジェクトにコライダーをアタッチ

スプライトやキューブなど、クリックしたいオブジェクトのInspectorにBox Colliderなどのコライダー(当たり判定)をアタッチします。2D/3Dは用途に合わせて。


4.クリックされるオブジェクトにEventTriggerをアタッチ

Inspectorから、Event→EventTriggerをアタッチします。


5.イベントを受け取る方のオブジェクトに処理を記述

InspectorのEventTriggerの、「Add New Event Type」から、使いたいイベントを選びます。

例えばマウスクリックを拾いたいのであれば「PointerClick」を選択。

すると、Pointer Click(BaseEventData)とでるので、その下の枠にイベントを受け取るオブジェクトを選択し、イベントを受け取る処理が記述されたメソッドを指定します。

NoName_2017-10-23_17-40-59_No-00.png

上の例だと、クリックされた時、Hierarchy上のActManager(Managerクラスのスクリプトがアタッチされている)というオブジェクトの、OnSortiePointClickというメソッドが実行されます。

ActManagerのスクリプトはこんな感じ


Manager.cs

using UnityEngine.EventSystems;

public class Manager : MonoBehaviour
{
public void OnSortiePointClick(BaseEventData data){
var eventData = (PointerEventData)data;
//処理...
}
}



もう一つの方法


アタッチしたスクリプトにイベントハンドラのインターフェースを実装する

上の例だと、インスペクターにイベントを受け取るゲームオブジェクトをアタッチしていましたが、この方法だとPrefabのようなまだオブジェクト化してないときに困ります。

もう一つの方法としては、アタッチしたスクリプトにIPointerClickHandlerなどを実装する方法です。

using UnityEngine.EventSystem;

// IPointerClickHandlerインターフェースを継承して OnPointerClickを実装
public class Hogehoge : MonoBehaviour, IPointerClickHandler {
// Start, Updateは省略

public void OnPointerClick(PointerEventData data){
// クリック時の処理
}
}

どちらを使うかは状況に応じて変えるとよいでしょう。

どのインターフェースがどのイベントに対応しているかは、下記のその他欄の一覧からどうぞ。


その他