【Unity】スマホなどのマルチタッチ入力の検出方法まとめ。Touch構造体を覚えるの巻。

2022年3月28日

どうも、だらはです。
今回はスマホなどからユーザのタッチ座標を取得する方法をまとめたいと思います。
本稿執筆時点でのUnityでは、マルチタッチの座標をデスクトップで取得することはできませんので実機を準備して試してみてください。

具体的には以下を紹介します。

  • Input.touchCountプロパティ。
  • Input.GetTouch()メソッド。
  • Input.touchesプロパティ。
  • Touch-positionプロパティ。
  • Touch-tapCountプロパティ。
  • Touch-phaseプロパティ。

スポンサーリンク

タッチのポイント数を取得する

ユーザがタッチしているポイント数を取得するにはInputクラスtouchCountプロパティを使います。
返り値はint型となります。

Public static int touchCount {get;}

◆タッチ数のポイント数を取得するスクリプト

using UnityEngine;

public class Touch1 : MonoBehaviour
{
    private void OnGUI()
    {
        Rect rect1 = new Rect(10, 150, 400, 200);
        GUI.Label(rect1, "Count:" + Input.touchCount);
    }
}

タッチの位置を取得する

ユーザがタッチしている情報を1つずつ取得するにはInputクラスGetTouch()メソッドを使います。
引数のIndexには0始まりのインデックスを与えます。

対して、全てのタッチ情報を一気に取得するにはInputクラスtouches()メソッドを使います。
汎用性の観点から、touches()メソッドだけ覚えておけば良いと思います。

[WrapperlessIcall]
public static Touch GetTouch(int index);
public static Touch[] touches {get;}

GetTouch()メソッドtouches()メソッドで取得したタッチ情報は、UnityEngine.Touch構造体で管理されます。
タッチした座標をピクセル単位で取得するには、Touch構造体positionプロパティを使います。
詳細は公式HPのリファレンスを参照ください。

public Vector2 position {get;}

Touch構造体positionプロパティVector2構造体です。
画面左下隅を原点として、右上の方向に値が増えていきます。

◆複数のタッチ情報を取得してラベル表示するスクリプト

using UnityEngine;

public class Touch2 : MonoBehaviour
{
    private void OnGUI()
    {
        Rect rect2 = new Rect(10, 50, 400, 100);
        foreach(var touch in Input.touches)
        {
            GUI.Label(rect2, "Touch:" + touch.position);
            rect2.y += 50;
        }
    }
}

タップの回数を取得する

ユーザがタップしたかどうかをTouch構造体tapCountプロパティから取得できます。

public int tapCount {get;}

返り値はint型です。
シングルタップならば1を、ダブルタップならば2を返します。

◆タップ回数を表示するスクリプト

using UnityEngine;

public class Touch3 : MonoBehaviour
{
    private void OnGUI()
    {
        Rect rect3 = new Rect(10, 100, 400, 150);
        foreach(var touch in Input.touches)
        {
            GUI.Label(rect3, "Tap:" + touch.tapCount);
            rect3.y += 50;
        }
    }
}

タッチの状態(タッチ/離す/移動/停止など)を取得する

タッチの状態はTouch構造体phaseプロパティで取得できます。
タッチされた瞬間や、タッチが移動しているかなどが取得できます。

public TouchPhase hase {get;}

因みに、取得されたタッチの状態はUnityEngine.TouchPhase列挙型です。
タッチの状態は、以下のメンバで表現されます。

  • タッチされた瞬間:Beganメンバ
  • 離された瞬間:Endedメンバ
  • 移動している状態:Movedメンバ
  • 停止している状態:Stationaryメンバ
  • タッチキャンセル:Canceledメンバ

public enum TouchPhase

using UnityEngine;

public class TouchSc : MonoBehaviour
{
    private void OnGUI()
    {
        Rect rect3 = new Rect(10, 150, 400, 200);
        foreach(var touch in Input.touches)
        {
            GUI.Label(rect3, "Phase:" + touch.phase);
            rect3.y += 50;
        }
    }
}

最後に

いかがでしたでしょうか。

  • Input.touchCountプロパティ。
  • Input.GetTouch()メソッド。
  • Input.touchesプロパティ。
  • Touch-positionプロパティ。
  • Touch-tapCountプロパティ。
  • Touch-phaseプロパティ。

今回はスマホなどのスマートデバイスでの入力を検出する方法を紹介しました。
基本的にはTouch構造体で状態を取得して使います。
主要なものを紹介しましたが、他にも知りたい場合はUnity公式リファレンスを参照頂けたらと思います。

以上、だらはでした。

追記(2022.3.28)

コピペで動くスマホ用のFPSコントローラを作りました。
縦方向のカメラの回転制限機能も付いてます。

スポンサーリンク

基礎

Posted by daraha_gm