マウス?タッチ?両方使いたい!そんなあなたにInterfaceメソッド
ほとんどほったらかしでしたが、こんなブログを参照してくださっている方が少なからずいらっしゃることに驚きと嬉しさと感謝です。
今回はunityでuGUIのbuttonなどを使わず、マウスでクリックやドラッグしたときと、タッチでクリックやドラッグしたときの、どちらの方法でも実行したいときに利用すると便利な実装です。
■今までの実装方法
今までは(少なくとも僕は)uGUIのbuttonなどを使わない場合、マウスをクリックしたときは、UnityEngine.InputクラスのGetmouseButtonとかmousePositionを使用して関数を実行したり、マウスポインターの位置を取得してたりしてました。
また、タッチパネルの(スマホやタブレットPCなど)マルチタッチを想定した実装をするときは、UnityEngineのTouchクラスを使用してマルチタッチしたときの処理を書いていました。
例えば、タブレットPCをターゲットにして実装を行う過程で、「クリックまたはタッチのいずれかのイベントが発行されたとき」に関数を実行したい場合、上記の実装だと書く量が増えて大変です。
■便利なIEventSystemHandlerを継承したInterfaceメソッド
そんなときに便利なのがIEventSystemHandlerを継承したInterfaceメソッドです。
いくつか種類があります。
例えば、クリックまたはタッチであるならIPointerDownHandler,IPointerUpHandlerを使用します。
using UnityEngine; using UnityEngine.EventSystems;
public class Example : MonoBehaviour, IPointerDownHandler, IPointerUpHandler { public void OnPointerDown(PointerEventData pointerEventData) { //クリックし始め Debug.Log("Down!"); }
public void OnPointerUp(PointerEventData pointerEventData) {
//クリックし終わり Debug.Log("Up!"); } }
リファレンスにも書いてある通り、usingステートメントでUnityEngine.EventSystemsとMonoBehaviourの他にIPointerDownHandler,IPointerUpHandlerを継承している点が味噌です。
上記を書いたうえで、それぞれOnPointerDown(PointerEventData pointerEventData),
OnPointerUp(PointerEventData pointerEventData)が使用できるようになります。
その他にもドラッグをしたときを取得したいのならばIBeginDragHandler, IDragHandler, IEndDragHandlerを使用します。
public class DragMe : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { //ドラッグし始め
public void OnBeginDrag(PointerEventData eventData) { Debug.Log("Drag_Start!"); }
//ドラッグ中
public void OnDrag(PointerEventData eventData) { Debug.Log("Draging..."); }
//ドラッグし終わり
public void OnEndDrag(PointerEventData eventData) { Debug.Log("Drag_Stop!"); }
こちらもリファレンスにも書いてある通り、usingステートメントでUnityEngine.EventSystemsとMonoBehaviourの他にIBeginDragHandler, IDragHandler, IEndDragHandlerを継承している点が味噌です。
上記を書いたうえで、それぞれOnBeginDrag(PointerEventData pointerEventData),
OnDrag(PointerEventData pointerEventData),OnEndDrag(PointerEventData pointerEventData)が使用できるようになります。
ドラッグ中には「どれぐらい、どの方向にドラッグされているか」を取得したいなどの場合が多いと思いますが、引数のPointerEventDataにさまざまなデータが格納されていて、それらを参照することで実装できます。
例えば、PointerEventData.deltaはVector2型で前フレームからの移動量を取得できます。
あとは作成したスクリプトを動かしたいオブジェクトなどにアタッチして完成。
■利点
主にマルチタッチの実装の際に「複数のオブジェクトをタッチして、各ポインター(各指)でドラッグしたい」などの場合、GetmouseButtonだと複数のオブジェクトを選択してドラッグできません。(マウスのは基本1つなので)
かといって、Touchクラスを使用すると、どちらがどのポインターでドラッグされているかなどを管理が面倒くさいです。
Interfaceメソッドを使用すれば、スクリプトがアタッチされているオブジェクトに対しての管理や動作が簡単に実装できます。
■まとめ
他にもInspectorからEventSystemをAddコンポーネントして、関数をイベントにリッスンさせる方法もありますが、こちらのほうがスクリプトで完結するのでわかりやすいと思い、まとめてみました。
紹介していないInterfaceメソッドもまだまだありますので、リファレンスを見て活用してみてください。
以上