【Unity】マウスの入力方法を知ってマウス操作できるようにしよう!

マウスによる入力方法 Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「Unityでマウス操作をできるようにしたい!」

「マウスはどうやって入力させるの?」

というお悩みの方に向けた内容となっています。

Unityで作るゲームでは、マウスだけでなく、キーボードやコントローラーなどのボタンを使って操作することができます。

中でも、マウスのクリックでゲームを操作する場合は、InputクラスにあるGetMouseButtonというメソッドを使うことで、マウスの様々なボタンの入力を行うことができます。

また、マウスのカーソルをゲーム内で使いたい場合は、同じくInputクラスにあるmousePositionという変数を使うことで、マウスカーソルの位置を入力することができます。

そこで、このページでは、Unityでマウスを使ってゲーム操作する場合の入力方法や検知方法をまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

Unityでマウスの入力判定・検知方法

それでは早速、Unityでマウスを入力してゲーム操作できる方法を紹介していきます。

Inputクラスのメソッドや変数を使う

まず、Unityでマウスを使って操作する場合は、Inputクラスを使います。

Inputクラスは、マウスやキーボード、コントローラー、スマホのタッチ操作など、様々な入力に関する判定をすることができます。

このInputクラスを使って、マウスボタンのクリックやマウスのカーソルの位置などを検知することで、それに応じたゲーム操作の処理を作っていくことができます。

マウスのクリックによる操作

マウスで操作する場合は、マウスのボタンクリックとカーソル移動の2つがありますが、ここではマウスのクリックによる操作方法をまとめていきます。

GetMouseButtonメソッドを使う

マウスのボタンクリックによる操作を作る場合は、Inputクラスの中にあるGetMouseButtonメソッドを使います。

このGetMouseButtonは、マウスのボタンクリックを検知するとbool型「true」を戻してくれるメソッドで、

Input.GetMouseButton(マウスのボタンを指定)

のように書くことで、引数に指定したマウスボタンのクリックを判定してくれます。

GetMouseButtonには、クリックを判定するタイミングで3種類に分かれていて、

のいずれかを使うことで、マウスクリックの操作を入力することができます。

メソッドの引数にどのボタンかを指定する

GetMouseButtonメソッドは、引数を指定してどのマウスボタンをクリックしたかどうかを判定します。

その引数は、以下のようにそれぞれのボタンを数字で指定して、どのボタンかを認識させることができます。

  • 「0」 ⇒ 左ボタンのクリック
  • 「1」 ⇒ 右ボタンのクリック
  • 「2」 ⇒ マウスホイールのクリック

例えば、マウスで左クリックした際の処理を作る場合は、

Input.GetMouseButtonDown(0)

と、引数に「0」を入れてあげることで、左クリックした際に「true」を戻してくれます。

if文でtrueを検知して処理を行う

実際に、ゲーム内でマウスクリックによる操作を行う場合は、if文でマウス操作があったかどうかを検知させて処理を作ります。

例えば、マウスをクリックすると背景の色が変わるという処理を作る場合、以下のようなスクリプトをオブジェクトにアタッチします。

using UnityEngine;

public class NewMonoBehaviourScript : MonoBehaviour
{
    SpriteRenderer sr;

    void Start()
    {
        sr = GetComponent<SpriteRenderer>();    // SpriteRendererコンポーネントを取得
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))    // マウスの左クリックをした場合
        {
            sr.color = Color.red;   // 赤色に変更
        }
        else if (Input.GetMouseButtonDown(1))   // マウスの右クリックをした場合
        {
            sr.color = Color.blue;  // 青色に変更
        }
    }
}

14行目で、if文を使ってマウスで左クリックしたかどうかを制御していて、trueでクリックした場合は背景の色を赤色に変更するようにしています。

また、18行目で、同じようにマウスの右クリックをしたかどうかをelse-if文で判定していて、クリックしている場合は背景を青色に変更するようにしています。

これで、ゲームを実行してみると、

マウスのクリックによる操作ができているのが分かります。

マウスカーソルによる操作

次に、マウスカーソルを使ってゲーム操作をするやり方を紹介していきます。

マウスカーソルの検知方法も、クリックと同様にInputクラスを使用していきます。

mousePositionからスクリーン座標の位置を取得

マウスカーソルで操作をする場合は、まずマウスカーソルの座標を取得するところから始めます。

カーソルの位置を取得する際は、InputクラスにあるmousePositionを使って、以下のように記述することで、カーソルの座標を取得できます。

Input.mousePosition

このmousePositionは、スクリーン座標におけるマウスカーソル位置をVector3型で取得することができるプロパティです。

また、スクリーン座標とは、カメラによって表示されている画面の座標のことで、主にUIなどを表示する際に使用します。

実際に、以下のようにスクリプトを書いてコンソールウィンドウにリアルタイムで座標を表示してみると、

using UnityEngine;

public class NewMonoBehaviourScript : MonoBehaviour
{
    void Update()
    {
        Debug.Log(Input.mousePosition);
    }
}

左下を原点としたスクリーン座標が、表示されているのが分かります。

ScreenToWorldPointメソッドでワールド座標に変換する

mousePositionで取得したスクリーン座標は、ゲームで使う座標とは異なるため、そのままでは使用できずゲーム内の座標に変換する必要があります。

このスクリーン座標からワールド座標に変換する処理を行ってくれるのが、Cameraコンポーネントで定義されているScreenToWorldPointメソッドです。

ScreenToWorldPointは、引数にスクリーン座標を指定してあげることで、Vector3型のワールド座標を返してくれるメソッドです。

ScreenToWorldPoint(スクリーン座標);

これを使って、例えばマウスカーソルの位置によって、背景の色を変えるといった処理の場合、以下のようにスクリプトを書いていきます。

using UnityEngine;

public class NewMonoBehaviourScript : MonoBehaviour
{
    SpriteRenderer sr;

    void Start()
    {
        sr = GetComponent<SpriteRenderer>();    // SpriteRendererコンポーネントを取得する
    }

    Vector3 mousePos;   // マウスカーソルのスクリーン座標
    Vector3 mouseWorldPos;  // マウスカーソルのワールド座標

    void Update()
    {
        mousePos = Input.mousePosition; // マウスのスクリーン座標を取得する
        mouseWorldPos = Camera.main.ScreenToWorldPoint(mousePos);   // スクリーン座標をワールド座標に変換
        
        if (mouseWorldPos.x >= 0 && mouseWorldPos.y >= 0)
        {
            sr.color = Color.yellow;    // 黄色に変更
        }
        else if (mouseWorldPos.x >= 0 && mouseWorldPos.y <= 0)
        {
            sr.color = Color.green; // 緑色に変更
        }
        else if (mouseWorldPos.x <= 0 && mouseWorldPos.y >= 0)
        {
            sr.color = Color.red;   // 赤色に変更
        }
        else if (mouseWorldPos.x <= 0 && mouseWorldPos.y <= 0)
        {
            sr.color = Color.blue;  // 青色に変更
        }
    }
}

17行目で、Vector3型の変数にmousePositionでスクリーン座標を取得しておきます。

また、18行目でScreenToWorldPointを使い、スクリーン座標をワールド座標に変換しています。

そして、20行目以降でそれぞれのマウスの座標の位置に合わせて、オブジェクトの背景色を変更する処理を加えています。

実際に、ゲームを実行してみると、

マウスのカーソルに合わせて、処理を作ることができました。

3Dゲームの場合はZ座標に注意

先ほどは2Dゲームでマウスカーソルを使った処理を作りましたが、3Dゲームの場合は注意点があります。

mousePositionによって取得するスクリーン座標は、平面の画面になっているので、Z座標が必ず「0」となります。

このスクリーン座標におけるZの値というのは、カメラからの距離を表していて、「0」だとカメラと同じ位置にあることになり、カメラに表示されなくなってしまいます。

例えば3Dのオブジェクトの位置をマウスでドラッグしている間は移動できるようにしたい場合、

using UnityEngine;

public class Test : MonoBehaviour
{
    Vector3 mousePos;
    Vector3 mouseWorldPos;

    void Update()
    {
        mousePos = Input.mousePosition; // マウスのスクリーン座標を取得
        mouseWorldPos = Camera.main.ScreenToWorldPoint(mousePos);   // スクリーン座標をワールド座標に変換

        if (Input.GetMouseButton(0))
        {
            transform.position = mouseWorldPos; // オブジェクトの位置をマウスの位置に移動する
        }
    }
}

と、上記のように書いても、マウスをクリックしたタイミングで、オブジェクトがカメラから消えてしまいます。

そこで、取得したスクリーン座標のZに値を入れてカメラから離すように処理を作ってあげます。

using UnityEngine;

public class Test : MonoBehaviour
{
    Vector3 mousePos;
    Vector3 mouseWorldPos;

    void Update()
    {
        mousePos = Input.mousePosition; // マウスのスクリーン座標を取得
        mousePos.z = 5; // Z座標に5を入れる
        mouseWorldPos = Camera.main.ScreenToWorldPoint(mousePos);   // スクリーン座標をワールド座標に変換

        if (Input.GetMouseButton(0))
        {
            transform.position = mouseWorldPos; // オブジェクトの位置をマウスの位置に移動する
        }
    }
}

11行目で、取得したスクリーン座標のZ座標に「5」の値を直接入れる処理を行っています。

これでゲームを実行してみると、

マウスをクリックしている間、そのオブジェクトをドラッグで移動させることができています。

まとめ

このページでは、Unityでマウス入力を使ってゲームを操作する方法についてまとめていきましたが、いかがでしたでしょうか?

マウスによる入力を行う場合は、Inputクラスのメソッドやプロパティを使います。

マウスクリックであれば、GetMouseButtonメソッドを使ってマウスのボタン操作に合わせた処理を作ることができます。

また、マウスカーソルの位置であれば、mousePositionを使ってマウスの動きに合わせた処理を作ることができます。

最後までお読みいただきまして、ありがとうございました!

コメント