iwasiblog

イワシブログ - Activity log of an iwasi -

【Unity】Androidでマウス使用時にカーソルを非表示&左クリック以外も取得

Andoidでは,マウスを接続するとカーソルが表示される.そのとき,Unity製のアプリにおいて

  • カーソル位置を固定できるか
  • カーソルを非表示にできるか
  • 右クリックとホイールクリックを認識できるか

の3つについて知りたかった(が検索で見つかる情報が古いものばかりだった)ので検証した.
結果的に,固定以外は可能であった.

環境

  • Android 12 (SP2A.220505.002)
  • Unity 2021.3.4f1

使用した Unity API

  • Cursor.lockState
    • カーソルの拘束状態を指定する.
  • Cursor.visible
    • カーソルの表示状態を指定する.lockStateがLockedの場合は,常に非表示となる.
  • Input.GetMouseButton
    • 指定したマウスボタンが押されているかどうかを返す.0 : 左ボタン,1 : 右ボタン,2 : ホイール

結果

  • カーソルを固定できない
  • カーソルを非表示にできる
  • 右クリックとホイールクリックを認識できる

Cursor.lockStateにCursorLockMode.Lockedを指定した場合でも,カーソルが中央に固定されることはなかった. 一方,カーソルは説明通り非表示になった.

Cursor.visibleにfalseを設定した場合,カーソルが非表示になった.

マウスの右クリックとホイールクリックはエディタで実行した際と同様に取得することができた.
実機では,二本指タップが右クリック,三本指タップがホイールクリックに対応して同様に扱われた.

下図はカーソル位置とボタンの状態を可視化するアプリを実機で動かした様子である.カーソルは不可視だが四角が追従している(=ロックはできていない).また,色が赤の場合左クリック,緑は右クリック,青はホイールクリックが取得されていることを示す.

カーソル位置とボタンの状態を可視化するUnity製アプリを実機で動かした様子

用いたコード

using UnityEngine;

public class TestCube : MonoBehaviour
{
    public Material[] Mat;
    private Renderer ren;
    
    void Start()
    {
        ren = GetComponent<Renderer>();
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    void Update()
    {
        transform.position
            = Camera.main.ScreenToWorldPoint(Input.mousePosition)
            + Vector3.forward;
        ren.material = Mat[0];
        for (int i = 0; i <= 2; ++i)
            if (Input.GetMouseButton(i))
                ren.material = Mat[i + 1];
    }
}