Continue(s)

Twitter:@dn0t_ GitHub:@ogrew

【Unity】スマホの画面タッチで回転させたいしピンチイン・ピンチアウトさせたい

f:id:taiga006:20200215144820g:plain

●学んだことメモ

「対象のオブジェクトをフリックで回転、それからピンチイン・ピンチアウトできるスクリプト書いて~」って言われて着手。 最初はデバッグしながら進めたかったので「マウスのクリックで擬似的にやるか~」と思って Input.GetMouseButtonDown とか使って書き始める。 その時書いてたのがこれ。(長くなるのでコード自体は載せない。)

問題が2つ。

①回転は実装できてもピンチイン・ピンチアウトはできない(マウスポインターは2つない)

これは書き始めてすぐに思った。 まいどまいど、ビルドして実機で確認するのは面倒だったのでなんとかならないかと思ってググったところ、GodTouchを発見。

Unityエディタ上でタッチの動作を確認できるAssetです。iOS/Android/エディタで同じ挙動になります。
(上記リンクサイトより)

これでやろうかなーと思ったが、Assetを入れるほどのことでもないような気がしたのと、なんとか自分の力だけでやりたかったので、もう少し調査することに。 そして、UnityRemoteを知る。

要はビルドすることなく接続された端末で動作確認できる。(ただし、デバイス上で動いているのではなくUnityエディタで擬似的に動かしている=パフォーマンスは落ちる)

これなら心置きなくマウスの実装をスクリーンタッチの実装に移植できる。

ちなみにUnityRemoteの導入は特に詰まることはないと思うけど、ココのサイトが親切丁寧。

①解決。

②マウスを使った実装を実機を使った実装に移植すると変な感じ

スクリーンタッチの実装に移植して、実機で動きを見てて②に衝突。UnityRemoteのせいかもしれない。何よりスクリーンから指を離した後の慣性による回転ー>停止がうまく動作しない。

ログを吐かせて見た感じ、スクリーンタッチによる操作の場合、指を動かしているフェーズ(Touch.Moved)は最後の数フレーム分動いてないバッファのような物を持ってしまうっぽい?すごい速さで指動かしてみたりしたけど駄目だった。

ひとまず、慣性による緩やかな回転ー>停止は諦めて、回転の実装はこれで終わり。

長々書いてるけど、ここまで30分くらいでできるのでUnityは便利だし、何より先人たちの知見がいっぱいネットに落ちている🙏🙏🙏

次はピンチイン・ピンチアウトの実装だけど、参考に載せたサイトなどを見ながら実装。結局やっていることは前フレームと今フレームの差分をあてがってあげるだけなので回転と一緒。

可読性のためにt2.touchのTouchPhaseで分岐しているので、このコードだと正しくは2本指のうち最初にタッチした方の指だけを動かした場合はピンチイン・ピンチアウトは動作しない。(が、そんなことでユーザは躓くことはないだろうと言う算段でこの実装。)

ちなみに、TouchPhaseは他にもある。

TouchPhase 意味
Began 画面に指が触れたとき
Moved 画面上で指が動いたとき
Stationary 指が画面に触れているが動いてはいないとき
Ended 画面から指が離れたとき
Canceled システムがタッチの追跡をキャンセルしました

以上、ここまでで調べる時間含めて2時間くらい。お疲れさまでした。

参考

starmine2011.hatenablog.jp

Unityでマウス操作でオブジェクトを回転させるspphire9.wordpress.com

blog.narumium.net

mam2apo.xsrv.jp

www.tempura.blog

assetstore.unity.com