いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

UnityでUI上でタップ(複数箇所でもO.K.)された位置の検出をする

 タップ情報を取得し、UIがタップされた位置をUI上のローカル座標で取得します。前、UI上のローカル座標は取得しましたが、タップが1ヶ所だけ、の前提でした。今回のやり方は複数ヶ所のタップに対応しています。
www.omoshiro-suugaku.com
例によって短いコードです。

        GameObject go = GameObject.Find("DirKeyPanel");
        RectTransform rc = go.GetComponent<RectTransform>();
        Touch[] touches = Input.touches;//全タップ情報の取得
        for (int i = 0; i < touches.Length; i++)
        {
            Touch t = touches[i];
            //Panelが属するCanvasのRenderModeがOverlayなら第3引数はnull
            //タップ位置をPanel内の座標で取得
            RectTransformUtility.ScreenPointToLocalPointInRectangle(
                    rc, t.position, null, out Vector2 localPoint);
            if (rc.rect.xMin < localPoint.x && localPoint.x < rc.rect.xMax
                    && rc.rect.yMin < localPoint.y && localPoint.y < rc.rect.yMax)
            {
                //タップがpanelの内部だったら
                Debug.Log(localPoint);
            }
        }

 これで画面の何ヶ所かをタップしているときでも、UI上の全てのタップの位置を調べることができます。

 なお、今回は最も単純なケース「指が触れた位置を求める」ことだけについて説明しました。Panelに触れたまま指がPanel外に出たときの処理など、必要ならば自分で実装しなければならない場面は結構あると思います。Touchに含まれる情報を単純に利用するだけでは対応できないことがあるのです。その場合は工夫が必要です。Touchに含まれる情報については以下。
UnityEngine.Touch - Unity スクリプトリファレンス