[Unity] マウスとタッチを同じように扱いDown/Up/Drag/Flickに対応する

Pocket

Androidでタップやドラッグを行う場合にはInput.touchesを使用しますが、開発中はPC+マウスの環境でも実行したいのが初心者の心情です。両方の環境でマウス/タッチを同じように扱いたい。

そんなわけでマルチタッチを必要とせず、タッチは1点で十分だよ!でもマウスにも対応したいよ!という自分が必要な機能を実装してみた結果をまとめたいと思います。

今回も実装方法が正しいかどうかわかりませんが、公式ドキュメントを見たり、Google先生に聞いてみたりなるべく「右へならえ」になるようにしたつもりです。

 

 

 

実装する機能

  • Android(タッチパネル)とPC環境(マウス)で同じように動作すること
  • Down/Up/Drag/Flickの4種類が判定できること

としました。

 

参考にしたサイトはこちら

Unity2D フリック操作
http://stickpan.hatenablog.com/entry/2014/01/23/193922

 

実装方法

いきなりですがクラス、インターフェースを定義します。

 

GestureInfoクラス

入力情報を扱います。

 

InputGestureインターフェース

通知受け取り用のメソッドを定義しています。これを継承してごにょごにょします。

 

タッチ入力かマウス入力かの判定

判定方法はOSで分岐させればよいのではないでしょうか。

 

位置、押された、離れたなどの判定

タッチ用とマウス用の2つを用意して違いを吸収します。今回はマルチタッチ無しの1点のみなので簡単そうです。

まずはタッチ情報があるかどうか、かつ前回と同じ指かどうかを判断しタッチ情報を取り出します。マルチタッチして誤動作しないように注意しました。

タッチ用の処理

GestureInfoにデータを入れてタッチ、マウス両方で扱えるようにしています。

2015.02.03 追記

手持ちのAndroid機(Memopad7 ME176)で試したところdeltaPositionの値がピクセル単位ではない模様。
ピクセル単位を想定していたので前回の位置と今回の位置の差をdeltaPositionとするように変更しました。

 マウス用の処理

左マウスボタンの処理しています。

入力チェック処理

上の関数を使用すると

  • Downした
  • Dragした
  • Upした

の3つの状態を検出できます。

まずはDown、Drag、Upへの処理を記述します。

ここまででDown、Drag、Upの3つの状態を検出し、処理できそうです。残りはFlick処理のみ。

 

Flickを発生させる

常に20フレーム分(20/60秒=333msと仮定しました)の位置を保存しておきます。(保持するフレーム数は要調整。)

  1. 長めの期間内のベクトル = フレーム[0(一番古い位置)]からフレーム[19(一番新しい位置)]へのベクトル
  2. 短めの期間内のベクトル = フレーム[15(少し前の位置)]からフレーム[19(一番新しい位置)]へのベクトル

の2つのベクトルを用意します。

2つのベクトルがほぼ同一方向を向いていれば「Flick発生」としました。これは素早く「上移動→下移動→離す」が行われた時の対処です。

(この処理はUp処理の中にあり、指やマウスが離されたときに一度だけ判定します)

出来れば動いた距離も判定に加えた方がよさそうです。距離もピクセル単位ではなくcm/インチ単位で行うとどんな環境でもほぼ同じ条件でFlickを発生させることができるはず・・・。まだ試したことないのでわかりませんが、今後調べて実装すると思います。

 

カメラ移動サンプル

Flick操作でぬるっと動くカメラ移動サンプルを作成してみました。もちろんAndroid版でも同じように動いています。

使用Assetは「Animated Knight and Slime Monster

マウスの左ボタンでドラッグorフリックすれば、スーっとカメラが移動します。

(※ボタンを押したときでもカメラが移動してしまいます。)

 

説明に使用したソース

作成した4つのソースは こちら になります。

 

まとめ

Flick発生条件のみが特殊で、残りは通常のマウスと同じ処理になりました。Flick/Swipeのジェスチャーを何気なく使っていましたが、いざ作ってみると難しいですね。Flick/Swipeの動作がうまくいかないと「このアプリなんか使いづらいなぁ」と悪い印象を持たれてしまうので今後も調整していきたいですね。

参考にしようとタッチ入力対応のAssetを探したが1つしか見つけられなかった。アプリ毎に入力処理が全く異なるから、毎回作るアプリに合わせて実装したほうが楽 or 低コストということなんだろうか。

Pocket

希木小鳥

Diablo1でハクスラの世界に。今はPath of Exileをプレイ中。長くやっていてもNoob属性は常に付いている。そのくらい行き当たりばったり。オタクになれないゲーマー。

You may also like...