質問: ### 実現したいこと 「スマホの画面をタップした際にあるメソッドを呼び出す」という挙動をUniRxで実装したい ### 詳細 Unityでスマホ用の3Dゲーム(三人称)を作っており、「画面をタップした際にあるメソッドを呼び出す」という挙動をUniRxで実装したいと考えています。 ところで、もし「マウスの左ボタンをクリックした際にあるメソッドを呼び出す」という挙動ならば、Input.GetMouseButton(0)はbool型を返すので、以下のコードで良いと思います。 ``` this.UpdateAsObservable() .Where(_ => Input.GetMouseButton(0)) .Subscribe(_ => Hoge()); ``` しかし、Input.GetTouch(0)はtouchクラスを返すため、以下のコードでは当然エラーとなります。 ``` this.UpdateAsObservable() .Where(_ => Input.GetTouch(0)) .Subscribe(_ => Hoge()); ``` では、「画面をタップした際にあるメソッドを呼び出す」という挙動はUniRxでどのように実装すればよいのでしょうか。 もしお分かりになる方がいらっしゃいましたら、ご教示いただけますと大変幸いです。
回答: Input.GetMouseButton(0)はスマホでも動くのでそのままでも大丈夫です。 書くならこんな感じです。 ※コードは未検証です。 ``` //画面から指が離れたとき(Ended) メソッド実行 this.UpdateAsObservable() .Where(_ => Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Ended) .Subscribe(_ => Hoge()); ``` タッチ位置を取得したいならこんな感じです。 ``` this.UpdateAsObservable() .Where(_ => Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Ended) .Select(_ => Input.GetTouch(0)) .Subscribe(t => Debug.Log(t.deltaPosition)); ``` ### 最後に 今回のメソッドが重要な処理なら「ユーザーの意思」について考えてみると良いと思います。例えば、**考えるために画面上をなぞっても**メソッドが走りますし、**持っている手で触れても**メソッドが走ります。今回の処理はそれをユーザーが良しとする処理でしょうか? 「ユーザーの意思」を考慮するポイントを今思いつく限り書いてみます。 ・ドラッグはタップと認めない ・タッチスタートからタッチエンドまでの速度が00秒以上はタップと認めない ・複数本指でのタッチはタップと認めない ・特定範囲以外のタッチはタップと認めない などでしょうか。と言っても実装するのは結構大変なのでUnityのイベントを活用するのも良いかと思います。もし「ユーザーの意思」を考えなければいけない処理でしたら検討してみてください。