【初心者Unity】マウス入力の取得方法
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
【初心者Unity】スクリプトからコンポーネントを追加する方法
1.はじめに
本記事では、マウス入力の取得方法について解説していきます。
以下の入力情報を扱います。
・左クリック
・右クリック
・マウスホイールクリック
・カーソル位置
2.クリックの取得
マウスクリックの取得には、Input.GetMouseButtonメソッドを使用します。
このメソッドは、入力検知のタイミングで、以下の3つのメソッドに派生します。
メソッド | 説明 |
Input.GetMouseButton | ボタンが押されていたらtrue |
Input.GetMouseButtonDown | ボタンが押された瞬間にtrue |
Input.GetMouseButtonUp | ボタンが離された瞬間にtrue |
GetMouseButtonでは、一度押したつもりでも2回判定されてしまうことがあります。
そのため、クリックでジャンプする等、一度きりの判定をしたい場合は、GetMouseButtonDownを使うのが一般的です。
一方で、シューティングゲームで連射する機能を持たせたい場合等では、GetMouseButtonを使用します。
そのゲームの仕様に応じて、適切に使い分けられるようにしましょう。
また、判定対象のボタンは引数で指定します。
引数 | 説明 |
0 | 左ボタンを判定 |
1 | 右ボタンを判定 |
2 | マウスホイールを判定 |
以下は、サンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class Script : MonoBehaviour { void Update() { // 左ボタンが押されていたら実行 if (Input.GetMouseButton(0)) { Debug.Log( "左ボタンが押されています。" ); } // 右ボタンが押された瞬間に実行 if (Input.GetMouseButtonDown(1)) { Debug.Log( "右ボタンが押されました。" ); } // マウスホイールが離された瞬間に実行 if (Input.GetMouseButtonUp(2)) { Debug.Log( "マウスホイールが離されました。" ); } } } |
3.カーソル位置の取得
カーソル位置の取得には、Input.mousePositionプロパティを使用します。
戻り値はVector3型で、スクリーン座標が取得できます。
スクリーン座標とは、ゲームビュー左下を(0, 0)、右上を(Screen.width, Screen.height)とした座標系のことです。
Screen.widthはピクセル単位のゲーム画面の横幅、Screen.heightはピクセル単位のゲーム画面の縦幅を表します。
これらの値(解像度)は、ゲームビュー上部のメニューから設定できます。
以下は、GameObjectをカーソルに追従させるサンプルコードです。
GameObjectの位置はワールド座標、カーソルの位置はスクリーン座標で表されるため、両者の連携を考える場合は、座標系の変換が必要になります。
今回は、スクリーン座標からワールド座標への変換を行う、Camera.main.ScreenToWorldPointメソッドを使用しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class Script : MonoBehaviour { void Update() { // カーソル位置を取得 Vector3 mousePosition = Input.mousePosition; // カーソル位置のz座標を10に mousePosition.z = 10; // カーソル位置をワールド座標に変換 Vector3 target = Camera.main.ScreenToWorldPoint(mousePosition); // GameObjectのtransform.positionにカーソル位置(ワールド座標)を代入 transform.position = target; } } |
ポイントは8行目、Input.mousePositionのz座標に10を代入している箇所です。
スクリーン座標におけるz座標は、Main Cameraからの距離を意味します。
ですが、カーソル位置は2次元的な情報なので、Input.mousePositionで取得できるz座標の値は0となっています。
これをそのままワールド座標に変換しようとすると、値を上手く取得することができません。
(カメラのレンズに張り付いたものの正確な位置は測定し辛い、というイメージでしょうか。)
今回は10を設定値にしていますが、ある程度の大きさであれば任意の値を設定していただいて構いません。
上記のスクリプトを任意のGameObjectにアタッチし、ゲームを再生してみてください。
カーソルに追従する動作が確認できましたでしょうか。