読者です 読者をやめる 読者になる 読者になる

TASOGARE GAMES BLOG

タソガレゲイムス :: 神奈川県でゲームを開発する人々のブログです。

Unityでマルチタッチ入力を扱う

Unity逆引き:マルチタッチ入力を扱う

  1. 実行環境がタッチ入力に対応しているかを確認する
  2. 現在のタッチ数を取得する
  3. それぞれのタッチの座標や状態を取得する

実行環境がタッチ入力に対応しているかを確認する

現在の実行環境がタッチ入力に対応しているかを確認するには、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;
            }
        }
    }
}