Help us understand the problem. What is going on with this article?

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

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

その他

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした