指定した領域内でタップ操作を監視するサンプル。
Unity Remoteでストレスなく動作確認ができるようにするため、Touch.Phaseは使っていません。
先日のdelegateの仕組みを使い、タップ操作が行われた際に実行する関数を定義し指定することが出来る。
タップ時のイベントリスナーを登録するような感じ。
タップ操作の定義:
・指定した領域内で指が触れて、指定した領域内で指が離された時のみタップ操作が行われたこととする。
・領域外で指が離された場合はタップ操作とみなさない。
・複数の指が触れた場合は、最初に触れた指(fingerIdがゼロ)が監視の対象となる。
シーンにEmpty(GameObject)を2つ追加して、それぞれをSceneとTapObserverに名前を変更。
SceneにはScene.cs、TapObserverにはTapObserver.csスクリプトを追加。
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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
using UnityEngine; using System.Collections; public class TapObserver : MonoBehaviour { private enum TAP_STATUS { NONE = -1, UP = 0, DOWN, TAP, END, CANCEL, }; private TAP_STATUS tapStatus = TAP_STATUS.UP; private TAP_STATUS tapStatusNext = TAP_STATUS.NONE; public delegate void funcDelegate(); public funcDelegate callbackFunction = null; public int x = 0; public int y = 0; public int w = 100; public int h = 100; // Update is called once per frame void Update () { switch(tapStatus) { case TAP_STATUS.UP: if(Input.touchCount > 0) { Touch touch = Input.GetTouch(0); if(touch.fingerId == 0) { Rect rect = new Rect(x, y, w, h); bool contain = rect.Contains(touch.position); if(contain) { tapStatusNext = TAP_STATUS.TAP; } else { tapStatusNext = TAP_STATUS.DOWN; } } } break; case TAP_STATUS.TAP: if(Input.touchCount == 0 || foundFingerId() == false) { tapStatusNext = TAP_STATUS.END; } else { Touch touch = Input.GetTouch(0); Rect rect = new Rect(x, y, w, h); bool contain = rect.Contains(touch.position); if(contain == false) { tapStatusNext = TAP_STATUS.CANCEL; } } break; case TAP_STATUS.DOWN: case TAP_STATUS.CANCEL: if(Input.touchCount == 0 || foundFingerId() == false) { tapStatusNext = TAP_STATUS.UP; } break; case TAP_STATUS.END: tapStatusNext = TAP_STATUS.UP; break; } while(tapStatusNext != TAP_STATUS.NONE) { tapStatus = tapStatusNext; tapStatusNext = TAP_STATUS.NONE; switch(tapStatus) { case TAP_STATUS.TAP: break; case TAP_STATUS.DOWN: break; case TAP_STATUS.END: callbackFunction(); break; case TAP_STATUS.CANCEL: break; } } } bool foundFingerId() { bool ret = false; if(Input.touchCount > 0) { foreach(Touch touch in Input.touches) { if(touch.fingerId == 0) ret = true; } } return ret; } } |
タップ操作(指)の状態を
・UP : 画面が触れられていない
・DOWN : 領域外が触れられた
・TAP : 領域内が触れられた
・END : 領域内で離された
・CANCEL : 領域外へ移動した
の5つの状態で管理する。
31-91行目:現在の状態に応じて処理を行う。遷移が必要な時には遷移先の状態を設定する。
93-118行目:遷移先が設定されている場合は、遷移する時に必要な処理を行う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using UnityEngine; using System.Collections; public class Scene : MonoBehaviour { TapObserver tapObserver; void Start() { tapObserver = GameObject.Find("TapObserver").GetComponent<TapObserver>(); tapObserver.callbackFunction = myCallbackFunction; tapObserver.x = 0; tapObserver.y = 0; tapObserver.w = Screen.width; tapObserver.h = Screen.height / 2; } void myCallbackFunction() { print("**** tapped screen! ***"); } } |
10行目:TapObserverのコンポーネントを取得
11行目:コールバック関数(タップされた時に呼び出される関数)を設定
12-14行目:タップを監視する領域を設定。ここでは、画面下半分のタップを監視するように設定
17-20行目:コールバック関数の定義
コメントを残す
コメントを投稿するにはログインしてください。