Unityでタップした位置のワールド座標を取得

スポンサーリンク
Unity
スポンサーリンク
↑管理人が個人でUnity+Live2Dで作成しているスマホゲームです

「ココのコイン落とし」では一般的なコイン落としゲーム同様、指定範囲内をタップする事でその位置にコインを落とす事が出来ます。
タップ位置のスクリーン座標は

Vector3 screenPos = Input.mousePosition;

のように取得する事が可能です。
そしてその座標をワールド座標にするには

Vector3 worldPos = Camera.main.ScreenToWorldPoint(screenPos);

という様に、メインカメラのメソッドを使って変換する事が可能です。
しかし、このままでは正確な値を取れません。
何故ならタップ位置にはZ座標が含まれていない為、透視投影視のカメラでは奥行きが特定出来ない=正確なワールド座標が同定出来ないからです。ちなみにscreenPos.zの値は0なのでカメラと同じ位置になっています。
その為、カメラから対象(この場合はシーン上のタップ可能エリア)のZ距離を事前にscreenPos.zに与えてあげる必要があります。

screenPos.z =  Vector3.Distance(new Vector3(0,0, GameObject.Find("TapArea").transform.position.z), Camera.main.transform.position);

この後ScreenToWorldPoint()を実行すれば正確な値を取る事が出来ます。
ちなみにタップエリア範囲外をタップした場合は両左右端に落ちるようにしてみました。baseWidthはタップエリアの横幅です。

if ((baseWidth / -2.0) <= worldPos.x && (worldPos.x <=baseWidth / 2.0)){
    return transform.position + new Vector3(worldPos.x, 0, 0);
}else if(worldPos.x <= (baseWidth / -2.0)){
    return transform.position + new Vector3((float)(baseWidth / -2.0), 0, 0);
}
else{
    return transform.position + new Vector3((float)(baseWidth / 2.0), 0, 0);
}

当初は

float x = baseWidth * (Input.mousePosition.x / Screen.width) - (baseWidth / 2);
return transform.position + new Vector3(x, 0, 0);


という、単にスクリーン座標におけるX座標比率をタップエリア内のX座標比率に置き換えただけのざっくりとした処理にしていたのですが、画面中央から離れるに従ってタップ位置と落下位置の誤差が大きくなり直感的では無かったのでやめたという経緯があります。

1 Star2 Stars3 Stars4 Stars5 Stars (まだ投票されていません)
読み込み中...

コメント

広告ブロッカーを無効にしてください。

タイトルとURLをコピーしました