LemonteaのUnity部屋

LemonteaのUnity部屋

Unityの使い方とかです~

初めてのスクリプト(3) Inputの続き クリックした座標の取得 傾け操作

こんにちは。レモンティーです。

今回は、これの続きです。
sawalemounity.hatenablog.com

今回は、

タップ(クリック)した座標の取得
スマホを傾けて操作する

のふたつを紹介します。

タップ(クリック)した座標の取得

タップ位置の取得には Input.mousePosition をつかいます。

これは、タップした位置をVector2で取得してくれます。

さて、これを実際に使う時は

Vector3 TapposSc = Input.mousePosition;
        TapposSc.z = 10;
        Vector3 TapposW = Camera.main.ScreenToWorldPoint(TapposSc);

のようにします。
(Vector2はVector3に暗黙的に変換できるので
X = Input.mousePosition;
としたとき、XはVector3型でもOKなのです。)

なぜ2行ほどよけいな手間があるのでしょうか。

それは、
Input.mousPositionで取得した座標と、オブジェクトがのっている座標は、異なる座標系だからです。

そのままでは使えません。
エラーはでませんが、明らかにおかしいことになります。


では、どんな違いがあるのでしょうか。


まず、オブジェクトがのっているのは、ワールド座標と呼ばれる座標です。
これは、ゲーム世界の三次元座標です。
TransformのPositionとかはワールド座標です(ただし子オブジェクトは、親の位置が原点として扱われるローカルな座標)
まあ、難しいことは抜きで、Unityで座標と聞いたら普通これでしょう。


それに対して、Input.mousPositionで取得するのは、スクリーン座標です。
これはカメラに映っている画面の左上を(0,0)とし、
そこから1ピクセルごとに1増える二次元座標です。
だからVector2なんですね。
解像度しだいで異なりますが、例えばXPERIA XZの場合、こんな感じです

f:id:sawalemontea:20170807150507p:plain


このような違いがあったんですね。

そのままでは使えないわけです。

ですが、Unityでは異なる座標の変換は簡単にできちゃいます。

それがこの部分です。
Vector3 TapposW = Camera.main.ScreenToWorldPoint(TapposSc);

Camera.main は、どのカメラから見たときの話なのか指定してます。

そして、ScreenToWorldPoint()で、
()内に引数としてスクリーン座標を渡せば、ワールド座標に変換してくれます。

ん?ではこれは…?
TapposSc.z = 10;

それは、カメラからの距離です。べつに10である必然性はないです。

次のようにイメージするとわかりやすいとおもいます。
(厳密な話ではなく、あくまでイメージです。)

f:id:sawalemontea:20170807151552p:plain

スクリーン上で、↑の位置をワールド座標に変換するとします。

そのとき、カメラからどのくらいの距離かで、↓のようになる…と考えてください。

f:id:sawalemontea:20170807152356p:plain


距離が0だと、画面のどこをクリックしても
ワールド座標ではカメラの位置になってしまいますね。
(ちなみに黒字の数字はイメージです。実際の値とは異なります。)

これらの理由で、Input.mousePositionで取得した座標を使う時は
最初に紹介したように記述するわけです。


スマホを傾けて操作する

これは、Input.accelerationで、
スマホの加速度センサーの情報を取得して行います。

いろいろ数学の話がでてきてややこしいですが、ざっくり、

傾いている方向を取得した

と考えて扱うと、わかりやすいです。

例えば、
スフィアに
transform.position += Input.acceleration;
とすれば、端末を傾けた方向にコロコロ転がります。


今回はここまでです。

Next

sawalemounity.hatenablog.com