Bedienung mit der Maus (Input System Package Version)

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

Verifizierungsumgebung

Fenster
  • Windows 11
Unity-Editor
  • 2020.3.25f1
Eingabesystem-Paket
  • 1.2.0

Voraussetzungen für diesen Tipp

Die folgenden Einstellungen wurden im Vorfeld als Prämisse für die Beschreibung dieses Tipps vorgenommen.

Abrufen der Mausposition

Die Position der Maus auf dem Spielbildschirm kann Mouse.position in abgerufen werden. Hier möchte ich mir die Standortinformationen anzeigen lassen.

Platziert ein Textobjekt im Canvas-Bereich, das Mausinformationen anzeigt.

Mausinformationen werden durch Skripterstellung abgerufen. In diesem Fall erstellen wir eine Skriptdatei mit dem Namen im Projekt MouseInfo .

Geben Sie das Skript wie folgt ein:

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.currentSie können Informationen über die aktuell aktive Maus abrufen. Mouse.position hat die aktuelle Position der Maus in , sodass ReadValue Sie den Wert im Formular mithilfe Vector2 der Vector2Control Methode abrufen können.

Die erfasste Mausposition wird auf ein Textobjekt gesetzt. StringBuilder Machen Sie sich nicht zu viele Gedanken über die Verwendung von , da es zum späteren Hinzufügen dient.

Nachdem EventSystem Sie das Skript gespeichert haben, fügen Sie es an das Objekt an. Textobjekt ist auf ein Textobjekt festgelegt, über das Informationen angezeigt werden sollen.

Versuchen Sie, das Spiel auszuführen und die Maus zu bewegen. Ich denke, die Mausposition wird in Echtzeit auf dem Bildschirm angezeigt.

Die Koordinaten der Mausposition befinden sich übrigens (0, 0) in der unteren linken Ecke des Spielbildschirms. Die X-Achse (links und rechts) wird positiv, wenn Sie nach rechts gehen, und negativ, wenn Sie nach links gehen. Die Y-Achse (nach oben und unten) wird positiv, wenn Sie nach oben gehen, und negativ, wenn Sie nach unten gehen. Daher befindet sich der Maximalwert jeder Achse in der oberen rechten Ecke des Spielbildschirms.

Bitte beachten Sie auch, dass diese Koordinate nur für den Bildschirmbereich des Spiels gilt, sodass die Pixelgröße im Spiel und die Pixelgröße der Bildschirmkoordinaten des Geräts möglicherweise nicht übereinstimmen.

Holen Sie sich die Menge des Scrollens des Rades

Auch das Scrollen mit dem Mausrad kann im Skript abgerufen werden. Der Scroll-Betrag Mouse.scroll kann mit erhalten werden. Im Gegensatz zur Mausposition können Sie den Betrag nur sofort scrollen lassen. Beachten Sie, dass Sie nicht feststellen können, wie weit Sie gescrollt haben.

Ich werde es dem Bildlaufvorgang hinzufügen, den ich zuvor erstellt habe 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 hält den bisher gescrollten Betrag nicht, so dass Definieren Sie ein dediziertes Feld ScrollValue für den Bildlaufbetrag.

Mouse.scroll Dann können Sie den gescrollten Betrag in diesem Moment erhalten, sodass wir diesen Wert akkumulieren. Wenn ScrollValue Sie z. B. das Rad zweimal scrollen, wird die Anzahl der doppelt gescrollten Räder beibehalten.

Der Rest besteht darin, diesen Wert als Text anzuzeigen.

Führen Sie nun das Spiel aus und drehen Sie das Rad. Ich denke, Sie werden sehen, wie viel gescrollt wird.

Mouse.scrollVector2 hat einen Wert von , aber wenn es sich um ein vertikales Scrollrad handelt, denke ich, dass nur der Wert von Y festgelegt wird.

Übrigens, wenn Sie nach unten scrollen, geht der Wert in 120 Einheiten auf und ab. Dies ist ein von Windows definierter Wert, sodass sich die Zahl je nach Umgebung und Maustyp ändern kann.

Festlegen, wann auf eine Maustaste geklickt wird

Hier möchte ich ein Beispiel verschieben, das Text an der Stelle anzeigt, an der mit der linken Maustaste geklickt wird. Der Zeitpunkt des Klickens kann durch Eigenschaften auf die gleiche Weise wie wasPressedThisFrame durch Tastaturtasten bestimmt werden.

Platzieren Sie zunächst ein Textobjekt zum Verschieben. Die Größe und Position sind angemessen.

Erstellen Sie ein Skript für den Klickvorgang. MouseButtonClick Behalten Sie den Namen als .

Das Skript sieht wie folgt aus:

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;
    }
  }
}

Ich führe den Prozess des Verschiebens des Textobjekts an die angeklickte Position durch. Die lokale Position des UI-Objekts ist die Koordinate des Canvas-Objekts und unterscheidet sich daher von der Position der Maus, bei der es sich um die Bildschirmkoordinate handelt.

Da der Ursprung des Canvas (0, 0) in der Mitte liegt, verwenden SieRectTransform.sizeDelta , um die halbe Größe des Canvas zu erhalten. Der Ursprung der Mauskoordinaten wird in den Mittelpunkt verschoben.

Sie können feststellen, ob Sie geklickt haben oder nicht mouse.xxxxxxxx.wasPressedThisFrame , und nur true in dem Moment zurückkehren, in dem Sie darauf klicken. Wenn Sie auf die Schaltfläche klicken und sie gedrückt halten, kehrt sie so lange zurück, bis Sie false erneut darauf klicken.

Nachdem EventSystem Sie das Skript gespeichert haben, fügen Sie es an . Dieses Mal werden wir auch Canvas verwenden, also legen Sie das Canvas- und das Textobjekt fest.

Versuchen Sie, das Spiel auszuführen, und prüfen Sie, ob sich das Textobjekt an die angeklickte Position bewegt. Da es nur in dem Moment verarbeitet wird, in dem es angeklickt wird, bewegt sich das Textobjekt auch dann nicht, wenn Sie die Maus während des Klickens bewegen.

Festlegen, wann Sie die Maustaste loslassen

Obwohl es nicht als Beispiel aufgeführt ist, können Sie den Zeitpunkt der Veröffentlichung bestimmen, wasPressedThisFrame indem Sie anstelle von wasReleasedThisFrame .

Richten Sie, während Sie auf die Schaltfläche klicken

mouse.xxxxxxxx.isPressed , um so lange zurückzukehren, wie true Sie auf die Schaltfläche klicken. Hier möchte ich den Text drehen, während ich die rechte Taste drücke.

Das Skript wird vom Skript mit der linken Maustaste umgeleitet. Ändern Sie es wie folgt:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Führen Sie das Skript nach dem Speichern aus, um es zu überprüfen. Das Objekt dreht sich so lange, wie die rechte Taste gedrückt wird.