クリックなどのイベント
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)とでるので、その下の枠にイベントを受け取るオブジェクトを選択し、イベントを受け取る処理が記述されたメソッドを指定します。
上の例だと、クリックされた時、Hierarchy上のActManager(Managerクラスのスクリプトがアタッチされている)というオブジェクトの、OnSortiePointClickというメソッドが実行されます。
ActManagerのスクリプトはこんな感じ
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){
// クリック時の処理
}
}
どちらを使うかは状況に応じて変えるとよいでしょう。
どのインターフェースがどのイベントに対応しているかは、下記のその他欄の一覧からどうぞ。
その他
-
EventSystemはUnity5から?古いバージョンでは動かない可能性があります。
-
サポートしているイベント一覧