Unityパズルゲームの作り方講座の第4回ではタグを使った衝突判定とボール落下処理を実装しました。
前回の記事↓
第5回では、Unityエンジンに実装されているマウス入力処理を作成します。
また、レイキャスト機能を用いて何をマウスクリックしたかを取得する方法もマスターしていきましょう。
Unityでマウス入力の検知を行う方法
まずは、TouchManagerという名前でスクリプトを作成しましょう。
それでは、作成したTouchManagerを開きましょう。
Unityでキーボードやマウスなどの入力を扱う際には、通常Unityが提供しているInputクラスを利用します。
まずは、練習のためマウスの位置を取得する処理を作ってみましょう。
次のコードをUpdate関数に書いてみてください。
1 2 3 4 5 |
void Update() { var mousePos = Input.mousePosition; Debug.Log(mousePos); } |
Input.mousePositionからマウスのカーソルの位置を取得できます。
そのため、1行目で変数mousePosに代入しています(ちなみに、var型は初期化を行えばとりあえず変数定義したいときに使える型ですが、初めのうちはしっかり書くことをお勧めします、ここではVector3型が正しいです)。
そして、2行目でmousePosの結果を表示させています。
上記の記入が終わったら、空のオブジェクトを作成してTouchManagerを追加しましょう。
この状態で実行してみると下のようにConsole上にマウスカーソルの位置が表示されるようになります。
この時、マウスの位置は画面のどの位置にいるかを数値で表します。
具体的には下のようなイメージです。つまり、画面の左下に行くほど値は小さくなり、右上に行くほど値は大きくなります。
しかし、このマウス座標の値はゲーム上の座標とは異なるため、このままでは扱いづらいです。
例えば、マウスをクリックした位置のゲームオブジェクトを取得したい場合、このマウス座標の値のままでは取得できません。
クリックしたスクリーンの座標とゲームオブジェクトの存在している座標を紐づけることが必要です。その機能もUnityで用意されています。
Unityにおける3種類の座標とは
そもそもの話として、ここで座標について解説おきます。
Unityでは3種類の座標があります。それは以下の通りです。
座標名 | 意味 | 例 |
ワールド座標 | 3D空間上の座標 | ゲームオブジェクトの絶対位置 |
ローカル座標 | ある座標からの相対座標 | 親オブジェクトからの相対位置 |
スクリーン座標 | 画面上の座標 | マウスカーソルの位置 |
異なる座標の扱い方 Raycastでスクリーン座標からワールド座標へ変換
マウス位置はスクリーン座標、ボールの位置はワールド座標なので、それぞれ違う座標です。
これらをうまく扱うためには座標変換が必要になります。しかし、それを自前で書く必要はなく、Unityには次のような便利な関数があらかじめ用意されています。
-
Camera.main.ScreenPointToRay関数:カメラ上のスクリーン座標をワールド座標に変換したRay型の変数を返す関数
Ray型はのちほど説明します。これを使って、次のようなコードを書いてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void Update() { var mousePos = Input.mousePosition; if(Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(mousePos); var h = Physics.RaycastAll(ray, 100.0f); if(h.Length > 0) { Debug.Log(h[0].collider.name); } } } |
まず、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上でそのゲームオブジェクトの名前が表示されるのが分かります。
今回の内容は以上です。
おさらいと次回予告
今回は、マウス入力の処理を作成していきました。
次回からは、具体的なゲームの機能であるタッチ操作でボールをなぞって消す処理を実装していきます。
次回の記事↓
パズルゲーム講座が動画になりました。
動画も合わせてチェック!
コメント