Roba Memo - 素人のUnity覚書と奮闘記

素人のUnity覚書と奮闘記

Sprite(またはコライダー)をクリックしたい IPointerClickHandler編

説明

Spriteをクリックしたいけど、Ray飛ばしてゴニョゴニョする以外の方法を見つけたのでメモ。
とはいえ、とどのつまり、カメラからRayを飛ばしてコライダーとの当たり判定を取る方法になるみたい。
ただ、自分でスクリプトを書くのが面倒という場合には、少しだけ楽に実装できそう。

Camera設定

CameraにPhysics Raycasterコンポーネントを追加する

この後、Spriteにコライダーを追加するが、それを2DにするならPhysics 2D Raycasterにする。

Add Component - Event - Physics Raycaster

EventMaskを設定する

EventMaskにあるリストは、Layerになる。
f:id:nico-taniku:20180310085448p:plain:w300f:id:nico-taniku:20180310085440p:plain:w180
ここの設定、結構大事だった。
というのも、クリックしたいSpriteのコライダーが他のオブジェクトのコライダーと重なっていると感知できないから。
ということで、Spriteレイヤーを作成して、Sprite限定にしてみた。
なので、クリックしたいSpriteのレイヤーもSpriteに設定しておくこと。

Sprite設定

コライダーを追加

Add Component - Physics - 任意のコライダー
コライダーは特に変更なし。
f:id:nico-taniku:20180310090042p:plain:w300

レイヤーをEventMaskに合わせる

説明が重複するけど、SpriteのレイヤーもSpriteに合わせておく。
f:id:nico-taniku:20180310090144p:plain:w300

EventSystemを追加

キャンバスが配置されていれば自動で入るので、キャンバスが配置されていなければ、とりあえずキャンバス配置してキャンバスだけ消すといいかも。
f:id:nico-taniku:20180310094017p:plain:w300

コード

IPointerClickHandlerインターフェースを継承するクラスを作成する。

//追加
using UnityEngine.EventSystems;

//IPointerClickHandlerインターフェースを継承
public class SpriteClick : MonoBehaviour,IPointerClickHandler
{
    //メソッド実装
    public void OnPointerClick (PointerEventData eventData)
    {
        //ここにクリックしたときの処理
    }
}

実装できるイベントの種類

インターフェースIPointerClickHandler
メソッドpublic void OnPointerClick (EventSystems.PointerEventData eventData);
インターフェースIPointerDownHandler
メソッドpublic void OnPointerDown (EventSystems.PointerEventData eventData);
インターフェースIPointerEnterHandler
メソッドpublic void OnPointerEnter (EventSystems.PointerEventData eventData);
インターフェースIPointerExitHandler
メソッドpublic void OnPointerExit (EventSystems.PointerEventData eventData);
インターフェースIPointerUpHandler
メソッドpublic void OnPointerUp (EventSystems.PointerEventData eventData);

PointerEventData

PointerEventDataで取得できるイベントは以下を参照
docs.unity3d.com

例えば、クリックしたゲームオブジェクトの名前を知りたい場合

   public void OnPointerClick (PointerEventData eventData)
    {
        Debug.Log (eventData.pointerEnter.name);
    }

以上。 書いてみると、これはこれで手順が多いのでRay飛ばすスクリプトをコピペで使った方が早い気もする。

参照したサイト様

tsubakit1.hateblo.jp

qiita.com