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

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

Unityで、スクリーンをタップしてそこへキャラクタを移動させる

Unityで、スクリーンをタップしてそこへキャラクタを移動させる、などしたいことがあります。電車で、となりのおじさんがカラフルなたくさんの丸いボールの映ったスマホの画面を指でパーッと撫で、キラキラ光って多分それが得点になっている……というゲームをやっているのをよく見かけます。アプリケーション内では、タップした画面上の座標をオブジェクトの存在する空間(平面)での座標に変換しているのでしょう。
RectTransformUtility.ScreenPointToWorldPointInRectangle()

という関数があり、これがその目的を果たします。公式サイトの説明では「スクリーン空間ポイントを、指定された RectTransform 平面上にあるワールド空間の位置に変換」とあります。要するにスクリーンのタップ位置を、ゲームが展開されている空間内で、パネルなど(RectTransformを含んでいる)が乗っている平面上の点のワールド座標に変換する、ということですね。キャラクタの位置はワールド座標で表されます(2Dゲームではワールド座標も2次元)。

今2Dシューティングゲームを書いていますが、これを使っています。次のコードで、rcは配置してあるパネルのRectTransform、tはInput.touchesで取得したタッチ情報です。またCamera.mainはヒエラルキーにあるMain Cameraです。getRc()はUI部品の名前からRectTransformを取得する関数、setPos()はキャラクタの位置をセットする関数。どちらも自作です。これはすぐ書けるでしょう。またgoCharaはキャラクタのGameObjectです。

 

Touch[] touches = Input.touches;
RectTransform rc = getRc("shieldRemainPanel");
for (int i = 0; i < touches.Length; i++) {
    Touch t = touches[i];
    RectTransformUtility.ScreenPointToWorldPointInRectangle(
            rc, t.position, Camera.main, out Vector3 worldPoint);
            setPos(goChara, worldPoint.x, worldPoint.y);
}

 

このコードをUpdate()に置くと、キャラクタがタップ位置を追いかけるようになりました。やっていませんが3Dだと空間内のパネル(傾いて配置されていたりします)などの乗っている平面上をキャラクタが動くようになるのでしょう。いろいろ使えそうです。

なおRender ModeがオーバーレイのときにはCameraをnullにしなければならない、とのことです。

以下の記事もあります。あわせてどうぞ!

www.omoshiro-suugaku.com

www.omoshiro-suugaku.com