Sprite(またはコライダー)をクリックしたい IPointerClickHandler編
説明
Spriteをクリックしたいけど、Ray飛ばしてゴニョゴニョする以外の方法を見つけたのでメモ。
とはいえ、とどのつまり、カメラからRayを飛ばしてコライダーとの当たり判定を取る方法になるみたい。
ただ、自分でスクリプトを書くのが面倒という場合には、少しだけ楽に実装できそう。
Camera設定
CameraにPhysics Raycasterコンポーネントを追加する
この後、Spriteにコライダーを追加するが、それを2DにするならPhysics 2D Raycasterにする。
Add Component - Event - Physics Raycaster
EventMaskを設定する
EventMaskにあるリストは、Layerになる。
ここの設定、結構大事だった。
というのも、クリックしたいSpriteのコライダーが他のオブジェクトのコライダーと重なっていると感知できないから。
ということで、Spriteレイヤーを作成して、Sprite限定にしてみた。
なので、クリックしたいSpriteのレイヤーもSpriteに設定しておくこと。
Sprite設定
コライダーを追加
Add Component - Physics - 任意のコライダー
コライダーは特に変更なし。
レイヤーをEventMaskに合わせる
説明が重複するけど、SpriteのレイヤーもSpriteに合わせておく。
EventSystemを追加
キャンバスが配置されていれば自動で入るので、キャンバスが配置されていなければ、とりあえずキャンバス配置してキャンバスだけ消すといいかも。
コード
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飛ばすスクリプトをコピペで使った方が早い気もする。