うどんてっくメモ

技術的なメモをまったりと

【Unity】新しいInputSystemのEnhancedTouchで端末のタッチ入力を処理する

Unityの新しいInputSystemの機能であるEnhancedTouchという機能を使って手軽に端末のタッチ入力が処理できたのでメモです。

はじめに

本記事では新しいInputSystemの機能の説明や、導入手順などは省略します。
以下のリンク先が大変参考になりましたので、確認していただけると幸いです。(一番下のリンク先が公式ドキュメントになりますので、情報が多いです。)

【Unity】新しいInput System入門 - 従来のUnityEngine.Inputに代わる高機能な入力管理システム - LIGHT11

Unityの新しい入力システムInputSystemを使ってみる | Unityを使った3Dゲームの作り方(かめくめ)

Namespace UnityEngine.InputSystem | Input System | 1.0.2

検証しているツールとパッケージのバージョンは以下の通りです。

  • Unity 2021.1.0b1
  • Input System 1.0.2

バージョンによっては挙動が違うことがありますので、ご注意ください。

EnhancedTouch

EnhancedTouchは新しいInputSystemで端末のタッチ入力周りの情報の参照やイベント処理を行うための機能です。
EnhancedTouch.Touchを使うにはEnhancedTouchSupportを有効にする必要があります。

// UnityEngine.Touchではないので注意
using UnityEngine.InputSystem.EnhancedTouch;

// EnhancedTouchの有効化
EnhancedTouchSupport.Enable();
// いろいろな機能を持つEnhancedTouch.Touch
var touch = Touch;

一点注意なのですが、EnhancedTouchはInputSystemで入力のイベント処理を実装するための機能であるInputActionと併用ができないそうです。
本記事では紹介していない機能ですが、こちらを使う場合も多いと思いますのでお気をつけください。

さて、Touchはタッチ情報を格納しているstructで、タッチ入力について管理されている情報を参照できます。

void DebugTouch(Touch touch)
{
    // タッチの状況(BeganとかMoveとか)
    TouchPhase phase = touch.phase;
    // タッチの座標
    Vector2 screenPosition = touch.screenPosition;
    // タッチを始めた座標
    Vector2 startScreenPosition = touch.startScreenPosition;
}

ゲーム内のタッチ入力はTouchのstaticなメンバとして管理されています。こちらは読み取り用のpublicなプロパティが用意されています。

// 端末の処理できる長さのタッチ入力情報の配列
// 過去のタッチ入力の座標などがキャッシュされている
ReadOnlyArray<Finger> fingerList = Touch.fingers;
// 現在のタッチ入力情報
ReadOnlyArray<Finger> activeFingerList = Touch.activeFingers;


// イベント処理
// 指を離した時
Touch.onFingerUp += OnFingerUp;
// 指が触れた時
Touch.onFingerDown += OnFingerDown;
// 指を動かした(ドラッグ)時
Touch.onFingerMove += OnFingerMove;

void OnFingerUp(Finger finger)
{
   Debug.Log(finger.screenPosition);
}
        
void OnFingerDown(Finger finger)
{
    Debug.Log(finger.screenPosition);
}
        
void OnFingerMove(Finger finger)
{
    Debug.Log(finger.screenPosition);
}

ここで出てきたFingerはTouchの情報をまとめているclassです。座標や状態などの情報を保持しており、更新処理もよしなにやってくれます。

// 一番最後に触れたタッチ入力の情報を保持するFingerインスタンス
Finger finger = Touch.activeFingers.Last();

// 現在のタッチ入力の中での順番
int index = finger.index;
// タッチ入力の座標
Vector2 screenPosition = finger.screenPosition;
// 現在タッチされているかどうか
bool isActive = finger.isActive;
// 現在のタッチ入力情報(座標や状態は更新される)
Touch currentTouch = finger.currentTouch;
// タッチ入力の履歴(IReadOnlyList<Touch>)
TouchHistory touchHistory = finger.touchHistory;

タッチした座標や入力の数などに基づいて処理を行いたい時にFingerを通して情報を参照します。EnhancedTouchだとこういった情報をまとめて管理してくれるのでお手軽です。
入力情報の履歴の参照など、他にもいくつか機能があるので使う方は最初に紹介した公式のドキュメントを参考にしてみてください。

終わりに

とりあえずシンプルに画面をタップしたときの挙動を定義したい時にEnhancedTouchを使うとさくっと実装ができそうです。
まだまだ情報の浅い新しいInputSystemですが、いろいろな機能を探っていきたいです。