使用滑鼠操作(輸入系統套件版本 )

更新頁 :
頁面創建日期 :

驗證環境

窗戶
  • 視窗 11
統一編輯器
  • 2020.3.25f1
輸入系統包
  • 1.2.0

此提示的先決條件

作為此提示描述的前提,已預先進行了以下設置。

獲取滑鼠位置

滑鼠在遊戲螢幕上的位置可以在 Mouse.position 中獲取。 在這裡,我想顯示位置資訊。

在畫布上放置一個顯示滑鼠資訊的文字物件。

滑鼠資訊通過腳本檢索。 在這種情況下,我們將創建一個在專案中 MouseInfo 調用的腳本檔。

按如下方式輸入文稿:

using System.Text;              // 追加
using UnityEngine;
using UnityEngine.InputSystem;  // 追加
using UnityEngine.UI;           // 追加

public class MouseInfo : MonoBehaviour
{
  /// <summary>情報を表示するテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  private StringBuilder Builder = new StringBuilder();

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      TextObject.text = "";
      return;
    }

    var mouse = Mouse.current;
    if (mouse == null)
    {
      Debug.Log("マウスがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // マウスの位置を取得する
    Builder.AppendLine($"Mouse.position={mouse.position.ReadValue()}");

    TextObject.text = Builder.ToString();
  }
}

Mouse.current您可以取得有關目前的活動滑鼠的資訊。 Mouse.position具有滑鼠在 中的當前位置,因此ReadValue您可以使用該方法Vector2Control獲取窗體Vector2中的值。

獲取的滑鼠位置設置為文字物件。 StringBuilder 不要太擔心使用 ,因為它是為了稍後添加。

保存文稿后 EventSystem ,將其附加到物件。 文字物件設置為要顯示有關資訊的文字物件。

嘗試運行遊戲並移動滑鼠。 我認為滑鼠位置會即時出現在螢幕上。

順便說一下,滑鼠位置的座標在遊戲螢幕的左下角是(0,0)。 X 軸(左和右)在您向右移動時變為正值,當您向左移動時變為負軸。 Y 軸(向上和向下)在您向上時變為正,在您向下時變為負。 因此,每個軸的最大值位於遊戲螢幕的右上角。

另外,請注意,此座標僅適用於遊戲螢幕空間,因此遊戲中的圖元大小與設備螢幕座標的圖元大小可能不匹配。

獲取滾輪的滾動量

使用滑鼠滾輪滾動也可以在腳本中檢索。 滾動量 Mouse.scroll 可以用 獲得。 與滑鼠位置不同,您只能立即滾動數量。 請注意,您無法瞭解滾動了多遠。

我會將其添加到我之前創建的 MouseInfo 滾動操作中。

// 省略

public class MouseInfo : MonoBehaviour
{
  // 省略

  /// <summary>スクロールした量を保持する。</summary>
  private Vector2 ScrollValue = Vector2.zero;

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    // 省略

    // スクロール量を取得し保持する
    ScrollValue += mouse.scroll.ReadValue();

    Builder.Clear();

    // マウスの位置を取得する
    Builder.AppendLine($"Mouse.position={mouse.position.ReadValue()}");
    // スクロール量を表示
    Builder.AppendLine($"ScrollValue={ScrollValue}");

    TextObject.text = Builder.ToString();
  }
}

Mouse.current 沒有保持到目前為止滾動的金額,所以 定義一個專用欄位 ScrollValue 來保存滾動量。

Mouse.scroll 然後,您可以在該時刻獲得滾動金額,因此我們將累積該值。 例如,如果滾動滾輪兩次,將 ScrollValue 保留滾動兩次的量。

其餘的就是將此值顯示為文本。

現在運行遊戲並旋轉輪子。 我想你會看到滾動的數量。

Mouse.scrollVector2的值為 ,但如果是僅垂直滾動輪,我認為只會設置 Y 的值。

順便說一下,如果您向下滾動,該值將以120個單位上下浮動。 這是 Windows 定義的值,因此該數位可能會根據其他環境和滑鼠類型而變化。

確定何時按下滑鼠按鈕

在這裡,我想移動一個示例,該示例在單擊滑鼠左鍵的位置顯示文字。 按兩下的時間可以由屬性確定,方法與鍵盤鍵相同 wasPressedThisFrame

首先,放置一個要移動的文字物件。 大小和位置合適。

為點擊過程創建腳本。 MouseButtonClick 將名稱保留為 。

文稿如下所示:

using UnityEngine;
using UnityEngine.InputSystem;  // 追加
using UnityEngine.UI;           // 追加

public class MouseButtonClick : MonoBehaviour
{
  /// <summary>情報を表示するテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;
  [SerializeField] private Canvas CanvasObject;

  /// <summary>Canvas の RectTransform の参照です。</summary>
  private RectTransform CanvasRect;

  // 最初のフレーム更新の前に開始が呼び出されます
  void Start()
  {
    if (CanvasObject == null)
    {
      Debug.Log($"{nameof(CanvasObject)} が null です。");
      return;
    }

    // Canvas から RectTransform を取得しておきます。
    CanvasRect = CanvasObject.GetComponent<RectTransform>();
  }

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }
    if (CanvasObject == null)
    {
      Debug.Log($"{nameof(CanvasObject)} が null です。");
      return;
    }

    var mouse = Mouse.current;
    if (mouse == null)
    {
      Debug.Log("マウスがありません。");
      return;
    }

    var transform = TextObject.transform;

    // マウスの位置を取得する
    var mousePosition = mouse.position.ReadValue();

    // マウスの位置を Canvas の座標に変換する
    var mouseOnCanvas = new Vector2(mousePosition.x - CanvasRect.sizeDelta.x / 2, mousePosition.y - CanvasRect.sizeDelta.y / 2);

    // 左ボタンがクリックしたタイミングか判定
    if (mouse.leftButton.wasPressedThisFrame)
    {
      transform.localPosition = mouseOnCanvas;
    }
  }
}

我執行將文字物件移動到按下位置的過程。 UI 物件的本地位置是畫布的座標,因此它與滑鼠的位置不同,滑鼠的位置是螢幕座標。

由於畫布的原點 (0, 0) 位於中心,RectTransform.sizeDelta 因此使用 獲得畫布大小的一半。 滑鼠座標的原點將移至中心。

您可以確定是否 mouse.xxxxxxxx.wasPressedThisFrame 按兩下,並僅在 true 按下時返回。 如果您按住該按鈕,它將繼續返回,直到您 false 再次按下它。

儲存文稿後 EventSystem ,將其附加到 。 這次,我們還將使用 Canvas,因此請設置 Canvas 和文本物件。

嘗試運行遊戲,看看文本物件是否移動到按下的位置。 由於它僅在按兩下時處理,因此即使您在按下時移動滑鼠,文字物件也不會移動。

確定何時釋放滑鼠按鈕

儘管它未作為示例列出, wasPressedThisFrame 但您可以使用 代替 來確定 wasReleasedThisFrame 發佈時間。

點擊按鈕時判斷

mouse.xxxxxxxx.isPressed 只要您按下該按鈕,就可以 true 繼續返回。 在這裡,我想在按右鍵的同時旋轉文本。

腳本從左鍵按下腳本轉移。 修改如下:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    // 省略

    // 右ボタンを押している間はオブジェクトを回転させる
    if (mouse.rightButton.isPressed)
    {
      transform.Rotate(0, 0, 1);
    }
  }
}

保存文稿后,運行它進行檢查。 只要按下右鍵,物件就會繼續旋轉。