Unityでマルチタッチ入力を扱う
Unity逆引き:マルチタッチ入力を扱う
- 実行環境がタッチ入力に対応しているかを確認する
- 現在のタッチ数を取得する
- それぞれのタッチの座標や状態を取得する
実行環境がタッチ入力に対応しているかを確認する
現在の実行環境がタッチ入力に対応しているかを確認するには、Input.touchSupportedを使います。
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Start() { if (Input.touchSupported) { print("タッチ入力に対応している"); } } }
現在のタッチ数を取得する
Input.touchCountで、現在のタッチ数を取得できます。 タッチ数の上限は、実行環境によって異なります。
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Update() { Debug.LogFormat("タッチ数:{0}", Input.touchCount); } }
それぞれのタッチの座標や状態を取得する
タッチの座標や状態は、Input.touchesで取得できます。 Input.touchesはArray<Touch>型で、つまりタッチ情報を格納しているTouch型の値が配列になっています。
タッチのID
マウスカーソルと違い、タッチでは複数の指(ポインター)を同時に扱う場合があります。 そのため、それぞれの指を識別するために、指ごとにIDが割り振られます。 IDは、Touch型のfingerIdプロパティで取得できます。
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Update() { for (int i = 0; i < Input.touchCount; i++) { Debug.LogFormat("{0}: {1}", i, Input.touches[i].fingerId); } } }
タッチの座標
座標はTouch型のpositionプロパティに格納されています。
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Update() { for (int i = 0; i < Input.touchCount; i++) { var id = Input.touches[i].fingerId; var pos = Input.touches[i].position; Debug.LogFormat("{0} - x:{1}, y:{2}", id, pos.x, pos.y); } } }
タッチの状態
タッチには、TouchPhase enumで定義された5つの状態があります。
- Began: いまタッチされた
- Moved: タッチ中で、動いている
- Stationary: タッチ中で、静止している
- Ended: いま離された
- Canceled: いまキャンセルされた
タッチの状態は、Touch型のphaseプロパティに格納されています。
if文やfor文でも結構ですが、switch文やforeach文を使うとよりすっきりと処理を書けます。
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Update() { foreach (Touch t in Input.touches) { var id = t.fingerId; switch(t.phase) { case TouchPhase.Began: Debug.LogFormat("{0}:いまタッチした", id); break; case TouchPhase.Moved: case TouchPhase.Stationary: Debug.LogFormat("{0}:タッチしている", id); break; case TouchPhase.Ended: case TouchPhase.Canceled: Debug.LogFormat("{0}:いま離された", id); break; } } } }