Unity3D
Unity
Unity2D

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

クリックなどのイベント

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){
        // クリック時の処理
    }
}

どちらを使うかは状況に応じて変えるとよいでしょう。
どのインターフェースがどのイベントに対応しているかは、下記のその他欄の一覧からどうぞ。

その他