今回はUnityでイベントのインタフェースの実装を行う事で、マウスのイベントを発生させるようにしてみます。
マウスのイベントを発生させるにはUIのボタンのOn Clickに実行するメソッドを指定したり、Event Triggerコンポーネントを取り付けマウスイベントに応じて実行するメソッドを指定する事で行ってきました。
今回はイベントのインタフェースを実装する事でイベントが起きた時に何らかの処理を実行出来るようにしたいと思います。
以前の記事で少し触れています。
ただ、こちらはJavaScriptでの記述なので、C#であらためてやってみたいと思います。
イベントのインタフェースの継承
イベントインタフェースを実装するにはまずインタフェースクラスを継承する形で新しいクラスを作成します。
新しいクラスはEventTestクラスにしました。
1 2 3 4 5 6 7 8 9 10 11 12 | using UnityEngine; using System.Collections; using UnityEngine.EventSystems; public class EventTest : MonoBehaviour, IPointerEnterHandler { // マウスが侵入した時 public void OnPointerEnter(PointerEventData eventData) { Debug.Log ("マウスが侵入"); } } |
マウスがゲームオブジェクトに侵入した時に実行するOnPointerEnterメソッドはIPointerEnterHandlerインタフェースで宣言されているますので、そのクラスを継承して新しいクラスを作成します。
C#の場合は,(カンマ)に続けて継承するクラスを複数指定する事が出来ます(抽象クラスとインタフェース)。
OnPointerEnterメソッドはゲームオブジェクトにマウスポインタが侵入した時に呼び出されます。
引数で受け取るPointerEventDataはマウスイベントのデータを受け取りますが、これはあらかじめ宣言されている引数なのでそのまま記述します。
このスクリプトをUIのImage等に取り付けてマウスポインタをImageの上に持っていくと「マウスが侵入」という文字列がコンソールに表示されます。
イベントを検知する為に必要な物
UIのCanvasをヒエラルキー上に配置するとEventSystemが自動で配置されます。
↑のような感じになります。
EventSystemは入力デバイスからの入力があった時にゲームオブジェクトにイベントを送信する機能です。
ゲームオブジェクトを検知する為にレイキャストコンポーネントを取り付ける必要があります。
例えばCanvasを設置すると、
↑のようにGraphic Raycasterコンポーネントがあらかじめ設定されており、UI要素を検知します。
UIの要素の検知にはUIのCanvasにGraphic Raycasterを設定、2D空間のゲームオブジェクトの検知にはカメラにPhysics 2D Raycaster、3D空間のゲームオブジェクトを検知するにはカメラにPhysics Raycasterコンポーネントを設定します。
UIの場合はCanvas、ゲームオブジェクトを検知する場合は写しているカメラに該当のRaycasterを設定します。
例えば3Dゲームオブジェクトを検知する場合はゲームの画面を写しているカメラにPhysics Raycasterを設定します。
インタフェースの実装サンプルの作成
イベントに対応するインタフェースは参考サイトを参照して頂くとして、全部のインタフェースを継承し、メソッドの実装をしてみます。
EventTestという新しいクラスを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | using UnityEngine; using System.Collections; using UnityEngine.EventSystems; public class EventTest : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler , IPointerUpHandler, IPointerClickHandler, IInitializePotentialDragHandler, IBeginDragHandler , IDragHandler, IEndDragHandler, IDropHandler, IScrollHandler, IUpdateSelectedHandler , ISelectHandler, IDeselectHandler, IMoveHandler, ISubmitHandler, ICancelHandler { // マウスが侵入した時 public void OnPointerEnter(PointerEventData eventData) { Debug.Log ("マウスが侵入"); } // マウスが出て行った時 public void OnPointerExit(PointerEventData eventData) { Debug.Log ("マウスが出て行った"); } // マウスが押された時 public void OnPointerDown(PointerEventData eventData) { Debug.Log ("マウスボタンが押された"); } // マウスが離された時 public void OnPointerUp(PointerEventData eventData) { Debug.Log ("マウスボタンが離された"); } // マウスがクリックされた時 public void OnPointerClick(PointerEventData eventData) { Debug.Log ("マウスがクリックされた"); } // マウスドラッグ対象が見つかった時 public void OnInitializePotentialDrag(PointerEventData eventData) { Debug.Log ("マウスドラッグ開始前"); } // マウスドラッグが開始された public void OnBeginDrag(PointerEventData eventData) { Debug.Log ("マウスドラッグが開始された"); } // マウスがドラッグされている public void OnDrag(PointerEventData eventData) { Debug.Log ("マウスドラッグされている"); } // マウスドラッグが終了 public void OnEndDrag(PointerEventData eventData) { Debug.Log ("マウスドラッグが終了"); } // オブジェクトがドロップされた public void OnDrop(PointerEventData eventData) { Debug.Log ("ドロップされた"); } // マウスホイールをスクロールしている時 public void OnScroll(PointerEventData eventData) { Debug.Log ("マウスホイールスクロールしている"); } // オブジェクトが選択されている時(毎フレーム) public void OnUpdateSelected(BaseEventData eventData) { Debug.Log ("オブジェクトが選択されている"); } // オブジェクトが選択されている時(選択された瞬間) public void OnSelect(BaseEventData eventData) { Debug.Log ("オブジェクトが選択された"); } // オブジェクトが選択解除された public void OnDeselect(BaseEventData eventData) { Debug.Log ("オブジェクトが選択解除された"); } // キー入力による移動 public void OnMove(AxisEventData eventData) { Debug.Log ("キー入力による移動"); } // Submitボタンが押された public void OnSubmit(BaseEventData eventData) { Debug.Log ("サブミットボタンが押された"); } // Cancelボタンが押された public void OnCancel(BaseEventData eventData) { Debug.Log ("キャンセルボタンが押された"); } } |
全部載せなので継承しているインタフェースがすごい事になってますが・・・・・(^_^;)
ヒエラルキー上にCubeを作成し、このスクリプトを取り付けます。
またUIの確認もする為、Canvasの子要素にUI→Imageを作成し、同じようにEventTestスクリプトを取り付けます。
3Dゲームオブジェクトでのイベントも発生させたいので、MainCameraのインスペクタでAdd ComponentからEvent→Physics Raycasterを取り付けます。
それでは確認してみましょう。
↑のようになりました。