【Unity】TouchScriptを導入する

 TouchScriptを導入することで多くのデバイスに対応した複雑なタッチ処理を行える。 MITライセンスでオープンソース化されており、AssetStore公式GitHubから無料で入手して利用できる。タッチ スクリプトではイベントハンドラに独自のイベントを追加し、入力を受けたら登録したイベントの処理を行っている。
 なお、以下の説明は多くが公式GitHubチュートリアルの要約である。

  1. 導入
  2. ジェスチャーの種類
  3. イベントを登録
  4. 処理を作成

導入

1. AssetStoreもしくはGitHubからダウンロード後、インストール。
2. PrefabsフォルダのTouchManagerCursorsをゲームビューに追加。
3. カメラにComponent/TouchScript/Layerを追加。
4. Component/TouchScript/Gestures、もしくは作成したジェスチャーのスクリプトをオブジェクトに追加。

以上で入力を扱えるようになる。レイヤーに関してはStandard Layerが3D、2D、UIのオブジェクト、FullScreenLayerがカメラを操作する場合に必要となる。また、テストの実行中にAltを押した後に入力するとダブルタップのシミュレーションが行える。
※ビルドする場合はCursorを消すこと。


ジェスチャーの種類

個別的なもの
1.TapGesture
 Events: Tapped
 Messages: OnTap.
2.PressGesture(Friendly)
 Events: Pressed
 Messages: OnPress.
3.ReleaseGesture  (Friendly)
 Events: Released
 Messages: OnRelease.
4.LongPress Gesture
 Events: LongPressed
 Messages: OnLongPress.
5.Flick Gesture
 Events: Flicked
 Messages: OnFlick.

連続的なもの
1.Transform Gesture
 Events: TransformStarted, Transformed, TransformCompleted
 Messages: OnTransformStart, OnTransform, OnTransformComplete.
2.Screen Transform Gesture
 Transform Gestureと同じだが、スクリーンの座標を参照。
 Events: TransformStarted, Transformed, TransformCompleted
 Messages: OnTransformStart, OnTransform, OnTransformComplete.
3.Pinned Transform Gesture
 Transform Gestureに似ているが、オブジェクトが中心で固定されて動けない場合は固定された点を軸に回転と大きさの変更が行われる。
 Events: TransformStarted, Transformed, TransformCompleted
 Messages: OnTransformStart, OnTransform, OnTransformComplete.
4.Meta Gesture
 すべてのタッチイベントを個別のイベントに再割り当てする。他のジェスチャーを使うほうが望ましい。
 Events: TouchBegan, TouchMoved, TouchEnded, TouchCancelled
 Messages: OnTouchBegan, OnTouchMoved, OnTouchEnded, OnTouchCancelled.
 ※なお上記の1-3のイベントは基本的には二つ目のタッチ入力まで機能する。


イベントを登録

 新たな挙動を実装するためにイベントハンドラにイベントを追加する。追加にはOnEnableOnDisanableメソッドを使い、入力があったときだけイベントの処理を行う。常時イベントを登録しておかないのは、メモリリークの原因となるためである。
イベントの登録TouchManegerに直接することもできるが、特定のジェスチャーのみを使用する場合は個別のイベントに登録した方が入力の識別が早くなる
イベントハンドラの利用にはNameSpace Systemを使う。また利用するジェスチャーにもNameSpaceが必要である。必要なNameSpaceは「ジェスチャーの種類」から利用したいジェスチャーの個別ページに飛び、上部のNamespaceに記載のあるものである。また登録するイベントハンドラは「ジェスチャーの種類」、もしくは個別のページのEventsで確認できる。

using System; //イベントハンドラに必要。
using TouchScript.Gestures; //Tap入力に必要。

void OnEnable()
{
 //TappedEventのイベントハンドラに登録している。
 GetComponent<TapGesture>().Tapped += tappedHandler;
}

void OnDisable()
{
 GetComponent<TapGesture>().Tapped += tappedHandler;
}

void tappedHandler(object sender, EventArgs e)
{
 //Tap入力があったときに行う処理。
}

イベントハンドラ

 イベントが発生したときに、その発生したという処理を受けて行う処理のことをイベントハンドラと呼ぶ。void形で引数にEventArgs型を持ち、プロパティとして振る舞うデリゲートのようなものである。
 通常、処理はプログラムによりさまざまに異なる。しかし、「入力を受けた」というイベントの発生を認識する処理自体は汎用的なものである。そのため、イベントの処理を受ける部分と実際の処理を行う部分(イベントハンドラ)を切り分けることができる。こうしたプログラムのことをイベント駆動型プログラムと呼ぶ。

処理を作成する

 TouchScriptにはいくつかの関数が用意されている。例えば、タッチしたスクリーン上の座標の取得や、フレーム間でのスワイプの距離の取得などである。これらはTouchScriptのジェスチャーに対して処理が行われている。また関数を使う場合、追加でNameSpaceが必要になることがある。個別の関数のページに行き、記載していないNameSpaceが必要な場合は追加する。
 以下の例ではTapGestureのScreenPositionを使い、タップした場所のスクリーン上の座標を取得してる。関数の一覧は各ジェスチャーページのPropertiesで確認できる。

using System; //イベントハンドラに必要。
using UnityEngine;
using TouchScript.Gestures; //Tap入力に必要。

public class GetTouchPosition : MonoBehaviour
{
//関数を使うため取得。Startで取得してもいい。
[SerializeField]
TapGesture tapGesture; 

void OnEnable()
{
 //Serializeで取得してるため、ここでGetComponentする必要はない。
 tapGesture.Tapped += OnTapped;
}

void OnDisable()
{
 tapGesture.Tapped += onTapped;
}

void OnTapped(object sender, EventArgs e)
{
 Vector2 tapPosition = tapGesture.ScreenPosition;
 Debug.Log(tapPosition + "をタップした");
}


参考

TouchScript
Writing a Custom Gesture
イベント – C# によるプログラミング入門 | ++C++; // 未確認飛行 C
Unityにおける簡単なジェスチャー取得 – WonderPlanet DEVELOPER BLOG
TouchScriptアセットのチュートリアルを試した | D.YAMA Blog