ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

【Unity】Finger IdとInput.touchesのインデックスの関係

f:id:covory10101101276:20200516101433j:plain
イエローナイフ -カナダ-

みなさんこんにちは🌑

相変わらず外出自粛の防災無線が毎日家のすぐそばで鳴り響いているブルーノです。主要都市部以外は緊急事態宣言が解除されましたね。いいなあ。あまりにも外が恋しくて最近は十何時間ある自然の動画をYoutubeで流しながら生活しています。


さて、今回も私がアプリを作るうえで少しだけ引っ掛かった、タッチの参照について調べたことをまとめていきます。


今回のケース

とあるスマホアプリの開発において、画面半分のタッチは移動に割り当てられ、画面もう半分はカメラの移動に充てられるといった、よくあるスマホ版TPSアプリのような操作を実装することになりました。
f:id:covory10101101276:20200516102835j:plain
タッチが検知されたら押されている間その指の情報を常に取得するクラスを移動用とカメラ操作用で二つ作り、タッチの動向を見守ろうとしました。Unityの仕様では、タッチはInput.Touchクラスで管理されています。
docs.unity3d.com

またそれらを配列として所有するInput.touchesもあります。
docs.unity3d.com
こちらの"touches"は小文字。

というわけで、このInput.touchesにアクセスし指の状態を取得しようと思ったのですが、実は同じ指の情報が常にInput.touchesの同じインデックスに格納されているわけではないんです。
というのも考えてみれば当たり前で、例えばまず画面に一本指をタッチします。
f:id:covory10101101276:20200516104530p:plain
このタッチ情報はInput.touchesの0番目に格納されます。
次にもう一本画面に指をタッチすると
f:id:covory10101101276:20200516104818p:plain
Input.touchesの1番目に格納されます。ではここで0番目の指が離されるとどうなるか、
f:id:covory10101101276:20200516105208p:plain
Input.touches[1]にあった指の情報が詰められて、Input.touches[0]になります。

さてこれではゲームの実装は少し困ったことになりますね。タッチされた指の配列がいちいち変わるんじゃ、手動で今押されている指はほかの指が離されてインデックス詰められて...といちいち計算させていたんじゃ大変です。
そこでInput.Touchクラスには、fingerIdという変数が備わっています。
docs.unity3d.com
Touchのインデックスがころころ変わるのに対し、このfingerIdは指が離されるまでは変わりません。これを参照し続ければ、ある指の動向をずっと見守ることができます。

とまあタッチ処理についてはここまで知っておけばあまり困ることはないんですが、少し気になったのはこの後のタッチの処理についてです。
先ほどの指の流れにfingerIdも添えて表示するとこうなります
f:id:covory10101101276:20200516110205p:plainf:id:covory10101101276:20200516110216p:plainf:id:covory10101101276:20200516110228p:plain

この状態で指をまたもう一本タッチすると、現在Input.touches[0]の指のインデックスはどうなるか、配列が普通に増えるだけなんだから、こうなるのかと私は思っていました。
f:id:covory10101101276:20200516110544p:plain
しかし、これは間違い。

実際にはこうでした。
f:id:covory10101101276:20200516110915p:plain
右のタッチのインデックスが新しくタッチされたTouchのインデックスの後ろに回ったのです。最初の一連からすると新しくタッチされた情報は常に追加される形で増えそうなものですが、これを見る限り単純にそういうわけではないようですね。
fingerIdに合わせて配列が整理されるのかな?

微妙な内容ですが自分の考えとずれがあったのでまとめておきました。
また、fingerIdもリファレンスに「ユニークなId」と強調して書いてあったからそれぞれ変な数が入っているのかとも思いましたが、案外普通だったのが個人的に一つ収穫です。


今回はここまでにしておきます。