Arbeta med musen (Input System Package Version)

Sidan uppdaterad :
Datum för skapande av sida :

Verifiering miljö

Windows
  • Fönster 11
Unity-redaktör
  • 2020.3.25F1
Paket för inmatningssystem
  • 1.2.0

Förutsättningar för det här tipset

Följande inställningar har gjorts i förväg som en förutsättning för beskrivningen av detta tips.

Få muspositionen

Musens position på spelskärmen kan Mouse.position erhållas i . Här vill jag visa platsinformationen.

Placerar ett textobjekt på arbetsytan som visar musinformation.

Musinformation hämtas genom skript. I det här fallet skapar vi en skriptfil som heter i projektet MouseInfo .

Ange skriptet enligt följande:

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.currentDu kan få information om den aktiva musen. Mouse.position har musens aktuella position i , så ReadValue att du kan få värdet i formuläret med hjälp Vector2Control av Vector2 metoden.

Den förvärvade muspositionen är inställd på ett textobjekt. StringBuilder Oroa dig inte för mycket om att använda , eftersom det är för att lägga till senare.

När du har EventSystem sparat skriptet kopplar du det till objektet. Textobjekt är inställt på ett textobjekt att visa information om.

Prova att köra spelet och flytta musen. Jag tror att muspositionen kommer att visas på skärmen i realtid.

Förresten är koordinaterna för muspositionen (0, 0) i nedre vänstra hörnet av spelskärmen. X-axeln (vänster och höger) blir positiv när du går till höger och negativ när du går till vänster. Y-axeln (upp och ner) blir positiv när du går upp och negativ när du går ner. Därför är det maximala värdet för varje axel i det övre högra hörnet på spelskärmen.

Observera också att denna koordinat endast är för spelskärmsutrymmet, så pixelstorleken i spelet och pixelstorleken på enhetens skärmkoordinater kanske inte matchar.

Få mängden rullning på hjulet

Rullning med mushjulet kan också hämtas i skriptet. Rullningsmängden Mouse.scroll kan erhållas med . Till skillnad från muspositionen kan du bara få mängden rullad omedelbart. Observera att du inte kan se hur långt du har rullat.

Jag lägger till den i rullningsoperationen jag skapade MouseInfo tidigare.

// 省略

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åller inte det rullade beloppet hittills, så Definiera ett dedikerat fält ScrollValue för rullningsmängden.

Mouse.scroll Sedan kan du få det rullade beloppet just nu, så vi kommer att ackumulera det värdet. Om du till exempel ScrollValue rullar hjulet två gånger behålls mängden rullat två gånger.

Resten är att visa det här värdet som text.

Kör nu spelet och snurra hjulet. Jag tror att du kommer att se mängden rullning.

Mouse.scrollVector2 har värdet , men om det är ett vertikalt rullningshjul tror jag att bara värdet på Y kommer att ställas in.

Förresten, om du rullar ner, kommer värdet att gå upp och ner i 120 enheter. Detta är ett värde som definieras av Windows, så antalet kan ändras beroende på andra miljöer och mustyper.

Bestämma när du klickar på en musknapp

Här skulle jag vilja flytta ett prov som visar text på den plats där vänster musknapp klickas. Tidpunkten för att klicka kan bestämmas av egenskaper på samma sätt som wasPressedThisFrame tangentbordstangenter.

Placera först ett textobjekt för att flytta. Storleken och positionen är lämpliga.

Skapa ett skript för klickprocessen. MouseButtonClick Lämna namnet som .

Skriptet ser ut så här:

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

Jag utför processen att flytta textobjektet till den klickade positionen. UI-objektets lokala position är koordinaten för arbetsytan, så den skiljer sig från musens position, som är skärmkoordinaten.

Eftersom Canvas ursprung (0, 0) ligger i mitten,RectTransform.sizeDelta använd för att få hälften av storleken på duken. Muskoordinaternas ursprung flyttas till mitten.

Du kan bestämma om du klickade eller inte mouse.xxxxxxxx.wasPressedThisFrame och bara true returnera det ögonblick du klickade. Om du klickar och håller ned knappen fortsätter den att återvända tills du false klickar på den igen.

När du har EventSystem sparat skriptet kopplar du det till . Den här gången kommer vi också att använda Canvas, så ställ in Canvas och textobjektet.

Prova att köra spelet och se om textobjektet flyttas till den klickade platsen. Eftersom det bara bearbetar det ögonblick det klickas, rör sig textobjektet inte även om du flyttar musen medan du klickar.

Bestämma när du släpper musknappen

Även om det inte visas som ett exempel wasPressedThisFrame kan du bestämma tidpunkten för frisläppandet genom att använda i stället för wasReleasedThisFrame .

Domare medan du klickar på knappen

mouse.xxxxxxxx.isPressed för att fortsätta att återvända så länge true du klickar på knappen. Här vill jag rotera texten medan jag trycker på höger knapp.

Skriptet omdirigeras från vänsterklicket. Ändra det enligt följande:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

När du har sparat skriptet kör du det för att kontrollera det. Objektet fortsätter att rotera så länge du trycker på höger knapp.