【Unity】TouchScriptの使い方
TouchScriptを導入することで多くのデバイスに対応した複雑なタッチ処理を行える。MITライセンスでオープンソース化されており、AseetStoreもしくはGitHubから無料で入手して利用できる。タッチスクリプトではイベントハンドラに独自のイベントを追加し、入力受けたら登録したイベントの処理を行っている。
なお、以下の説明は多くが公式GitHubの要約である。
導入
1. AssetStoreもしくはGitHubからダウンロード後、インストール。
2. PrefabsフォルダのTouchManagerとCursorsをゲームビューに追加。
3. カメラにComponent/TouchScript/Layerを追加。
4. Component/TouchScript/Gestures、もしくは作成したジェスチャーのスクリプトをオブジェクトに追加。
以上で入力を扱えるようになる。レイヤーに関してはStandard Layerが3D、2D、UIのオブジェクト、FullScreenLayerがカメラを操作する場合に必要となる。また、テストの実行中にAltを押した後に入力するとダブルタップのシミュレーションが行える。
ジェスチャーの種類
個別的なもの
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のイベントは基本的には二つ目のタッチ入力まで機能する。
通常ジェスチャーの入力が行われた際に、そのオブジェクトと親からの入力は一時停止する。つまり、初めの入力が排他的に処理される。しかし、いくつかのジェスチャーは他のジェスチャーと同時に入力することが可能であり、そのジェスチャーはライブラリー内でFriendlyと呼ばれている。
Friendlyジェスチャーを作る方法は以下の二種類ある。
1. Inspector上でもう一方のFriendly Gesturesリストにドロップ&ドラッグ。
2.gesture1.AddFriendlyGesture(gesture2);を呼ぶ。
イベントを登録
新たな挙動を実装するためにイベントハンドラにイベントを追加する。追加にはOnEnableとOnDisanableメソッドを使い、入力があったときだけイベントの処理を行う。常時イベントを登録しておかないのは、メモリリークの原因となるためである。
イベントの登録は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
https://github.com/TouchScript/TouchScript
Writing a Custom Gesture
https://github.com/TouchScript/TouchScript/wiki/Writing-a-Custom-Gesture
イベント - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
https://ufcpp.net/study/csharp/sp_event.html
Unityにおける簡単なジェスチャー取得 - WonderPlanet DEVELOPER BLOG
http://developer.wonderpla.net/entry/blog/engineer/Unity_TouchScript/
【Unity】タッチジェスチャを簡単に実装できる「TouchScript」の基本的な使い方を紹介 - コガネブログ
http://baba-s.hatenablog.com/entry/2018/03/22/085900
TouchScriptアセットのチュートリアルを試した | D.YAMA Blog
http://blog.d-yama7.com/archives/223