入力処理の作り方 ~マウスの動かし方と座標の取得法~

unityパズルゲームの作り方

第5回では、マウス入力の処理を作成していきます。

マウス入力の検知

まずは、TouchManagerという名前でスクリプトを作成しましょう。

それでは、作成したTouchManagerを開きましょう。

Unityでキーボードやマウスなどの入力を扱う際には、通常Unityが提供しているInputクラスを利用します。まずは、練習のためマウスの位置を取得する処理を作ってみましょう。次のコードをUpdate関数に書いてみてください。

Input.mousePositionからマウスのカーソルの位置を取得できます。そのため、1行目で変数mousePosに代入しています(ちなみに、var型は初期化を行えばとりあえず変数定義したいときに使える型ですが、初めのうちはしっかり書くことをお勧めします、ここではVector3型が正しいです)。そして、2行目でmousePosの結果を表示させています。

上記の記入が終わったら、空のオブジェクトを作成してTouchManagerを追加しましょう。

この状態で実行してみると下のようにConsole上にマウスカーソルの位置が表示されるようになります。

この時、マウスの位置は画面のどの位置にいるかを数値で表します。具体的には下のようなイメージです。つまり、画面の左下に行くほど値は小さくなり、右上に行くほど値は大きくなります。

しかし、このマウス座標の値はゲーム上の座標とは異なるため、このままでは扱いづらいです。例えば、マウスをクリックした位置のゲームオブジェクトを取得したい際にはこのマウス座標の値のままでは取得することができません。

3種類の座標

ここで、座標について解説していきます。Unityでは3種類の座標があります。それは以下の通りです。

座標名 意味
ワールド座標 3D空間上の座標 ゲームオブジェクトの絶対位置
ローカル座標 ある座標からの相対座標 親オブジェクトからの相対位置
スクリーン座標 画面上の座標 マウスカーソルの位置

異なる座標の扱い方

マウス位置はスクリーン座標、ボールの位置はワールド座標であるため、それぞれ違う座標です。これらをうまく扱うためには座標変換が必要になります。しかし、それを自前で書く必要はなく、Unityには次のような便利な関数があらかじめ用意されています。

  • Camera.main.ScreenPointToRay関数:カメラ上のスクリーン座標をワールド座標に変換したRay型の変数を返す関数

Ray型はのちほど説明します。これを使って、次のようなコードを書いてみましょう。

まず、Input.GetMouseButtonDown関数はマウスの入力を検知する関数で、引数に0を与えるだけで左クリックをしたかどうかを検知することができます。

次に、Ray型の変数rayを定義してScreenPointToRay関数の返り値を渡しています。このRayクラスは、ある地点から指定した方向へレイ(rayは英語で光線を意味します)を放つような直線を表すクラスです。Ray型には、レイの原点であるorigin変数(Vector3型)とレイの方向であるdirection変数(Vector3型)があります。今回の例では、ScreenPointToRay関数を用いているため、マウスの位置から画面奥方向へレイを放つ直線がrayに格納されます。

次に、このrayをPhysics.RaycastAll関数の引数に追加します。RaycastAll関数は、Rayと衝突したゲームオブジェクトをすべて検知する関数です。第一引数に衝突させたいレイを代入させ、第二引数でレイの長さを指定できます。今回は第二引数を100.0fと記述しているため100m先までレイが伸びている状態となります。この返り値は衝突したゲームオブジェクトの配列であるため、ここでは配列hに格納します。

最後に、Debug.Log(h[0].collider.name)により、hの要素番号0のゲームオブジェクトの名前を表示させる処理を書きます。これにより、衝突した最初のゲームオブジェクトの名前を表示させることができます。h[0].colliderはrayと衝突したオブジェクトを表しています。

それではこの状態で実行してみましょう。ゲームオブジェクトがある位置で左クリックをすると、Console上でそのゲームオブジェクトの名前が表示されるのが分かります。

今回の内容は以上です。

おさらいと次回予告

今回は、マウス入力の処理を作成していきました。

次回からは、具体的なゲームの機能を実装していきます。

コメント

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