【Unity】Editorもスマホも同様にオブジェクトのタッチを感知させる方法

f:id:cacapon:20210423105518p:plain

現在スマホ用のゲームをUnityで作成中のcacaponです。

今回、以下のような要望が出てきました。

f:id:cacapon:20210609151312p:plain

  • 赤枠はフリックとタップを受け付けたい
  • 青枠はタップのみ受け付けたい
  • それ以外の部分は特に処理が無いので反応しない

というわけで、早速Unityのタッチ関連で調べていましたのですが、

大体出てくるのが画面全体の処理だったり、

よさそうなAssetがもうだいぶ古くてそのまま使えなかったり、

マウスポインタと画面タッチが異なるために実機デバッグがやりにくかったりと、

とこんな感じで調べるのも結構苦戦しました。


結局自分が行きついたのが、

UnityEngine.EventSystemsのインターフェースを使って実装するのが

良さそうな感じだったので、今回はその実装のやり方を紹介したいと思います。

とりあえず動かしてみた感じ

f:id:cacapon:20210609154407g:plain

白色のエリアにスクリプトを加えています。

黒色の部分ではクリックしてもログは出ていませんが、

クリック時と離した時にログが出ているのが分かるでしょうか?

実装

基本の実装は下記のような実装になっております。

タッチ入力関連の処理のメモ

追加した部分を見ていきましょう。

using UnityEngine.EventSystems;

インターフェースを作る為に参照する必要があります。

IPointerDownHandler

OnPointerDown のコールバックを受け取るためにインターフェースを定義しています。

IPointerUpHandler

OnPointerUp のコールバックを受け取るためにインターフェースを定義しています。

OnPointerDown(PointerEventData eventData)

アタッチされているオブジェクトに対し、

クリックやタップされたら呼び出されるコールバック関数のようです。

OnPointerUp(PointerEventData eventData)

アタッチされているオブジェクトを離したとき、

つまりクリックやタップをやめたタイミングで

呼び出されるコールバック関数のようです。


因みに、対象のオブジェクトの外でクリックしてから、

対象の位置でクリックを外してもOnPointerUpが呼ばれることはありませんでした。

本当にタップもクリックも対応しているのか?

上に張ったgif画像で分かることは

アタッチした2Dオブジェクトに対するクリックは認識している」ということだけ。

本当にスマホに対してタップした場合でも問題ないのでしょうか?


そこで、私は追加で下記の確認も実施しました。

  • Unity Remote5*1でタップを認識されるか確認
  • Androidでビルドし、タップを感知しているか確認*2

分かる形で写真が取れなかったので文書のみの記載ですが、

どちらも感知していました。

この機能を使えば、自分の求めている入力は実現できそうですね。

おまけ フリックはどうするの?

今回の確認ではタップの確認は出来ましたが、

フリックはどうすればいいでしょうか?


フリックについては、細かい条件はさておき、

下記要素があれば、判定できると私は考えています。

  • タップ開始時点のX,Y座標
  • タップ終了時点のX,Y座標
  • タップを開始した時間
  • タップを終了した時間


フリックの条件がある一定以上の距離とスピードがある動作と定義すれば、

タップ開始・終了時点の座標とタップ間の時間を取得すれば判定できます。


座標についてはPointerEventData.positionで取得できますし、

時間についても、押している間だけTime.deltaTimeを加算するような

関数を作れば求めることができるでしょう。


速度は距離と時間で割れば出ますので、

速度と距離の値が基準値を満たすか満たさないかで

フリックを判定することができると考えています。

この時点で未確認の事

今回確認が出来ていないこともあります。

iOSでタップが認識されるかは確認できておりません。

作成しているのがスマホゲームなので後ほど確認予定です。

確認が終わり次第コメントなどで追記できればと思います。

2021/11/27 追記
iOSでも正常にタップされることを確認できました!


また、3Dのオブジェクトに対しても有効かどうかも未確認です。

今回作成しているアプリが2Dを想定しているので、

こちらの確認は直近で行うつもりはありません。

結果をご存知の方はコメントなどで教えて頂けると嬉しいです。

おわりに

今回のブログでは、画面全体ではなく

オブジェクトのみにタッチ判定を実装する方法を記載させて頂きました。


情報が新旧混沌としている模様なので、

Unityでモバイル入力を調べる方は記事の投稿日なども確認しながら

ご自身の参考にしたら方が良いかと思われます。


今回私の作った記事で

Unityのタッチ関係の実装の手助けになったとしたなら、

投稿者として嬉しい限りです。


それではまた。

参考文献

今回はこちらの動画を元に実装しました。

www.youtube.com

アイテムのドラッグアンドドロップについてですが、

単純なタップのインターフェースも実装されていたので

そちらを参考にしました。

*1:USBでスマホを繋げることで、スマホ上から操作確認ができるツール

*2:当方、Android実機デバッグの知見があまりないため、エリアにタップ数を表示することで確認しました