Werken met de muis (Input System Package Version)

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Verificatieomgeving

Ramen
  • Voor Windows 11
Unity Editor
  • 2020.3.25f1
Input systeem pakket
  • 1.2.0

Vereisten voor deze tip

De volgende instellingen zijn vooraf gemaakt als uitgangspunt voor de beschrijving van deze tip.

De muispositie opvragen

De positie van de muis op het spelscherm kan Mouse.position worden verkregen in . Hier wil ik de locatie-informatie weergeven.

Hiermee plaatst u een tekstobject op het canvas waarin muisgegevens worden weergegeven.

Muisinformatie wordt opgehaald door middel van scripts. In dit geval maken we een scriptbestand dat in het project MouseInfo wordt aangeroepen .

Voer het script als volgt in:

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.currentU kunt informatie krijgen over de momenteel actieve muis. Mouse.position heeft de huidige positie van de muis in , zodat ReadValue u de waarde in het formulier kunt ophalen met Vector2 behulp van de Vector2Control methode.

De verworven muispositie wordt ingesteld op een tekstobject. StringBuilder Maak je niet te veel zorgen over het gebruik , want het is om later toe te voegen.

Nadat EventSystem u het script hebt opgeslagen, koppelt u het aan het object. Tekstobject is ingesteld op een tekstobject om informatie over weer te geven.

Probeer het spel uit te voeren en de muis te bewegen. Ik denk dat de muispositie in realtime op het scherm zal verschijnen.

Trouwens, de coördinaten van de muispositie staan (0, 0) in de linkerbenedenhoek van het spelscherm. De X-as (links en rechts) wordt positief als je naar rechts gaat en negatief als je naar links gaat. De Y-as (omhoog en omlaag) wordt positief als je omhoog gaat en negatief als je naar beneden gaat. Daarom bevindt de maximale waarde van elke as zich in de rechterbovenhoek van het spelscherm.

Houd er ook rekening mee dat deze coördinaat alleen voor de schermruimte van de game is, dus de pixelgrootte in de game en de pixelgrootte van de schermcoördinaten van het apparaat komen mogelijk niet overeen.

Krijg de hoeveelheid scroll van het wiel

Scrollen met het muiswiel kan ook worden opgehaald in het script. Het scrollende bedrag Mouse.scroll kan worden verkregen met . In tegenstelling tot de muispositie, kunt u de hoeveelheid die onmiddellijk wordt gescrolld, alleen onmiddellijk krijgen. Houd er rekening mee dat je niet kunt krijgen hoe ver je hebt gescrolld.

Ik zal het toevoegen aan de scroll-bewerking die ik eerder heb gemaakt 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 houdt het tot nu toe gescrollde bedrag niet vast, dus Definieer een speciaal veld ScrollValue om de scrollhoeveelheid vast te houden.

Mouse.scroll Vervolgens kunt u het gescrollde bedrag op dat moment krijgen, dus we zullen die waarde accumuleren. Als ScrollValue u bijvoorbeeld twee keer door het wiel scrolt, blijft het aantal twee keer gescrollde behouden behouden.

De rest is om deze waarde als tekst weer te geven.

Voer nu het spel uit en draai aan het wiel. Ik denk dat je de hoeveelheid scrollen zult zien.

Mouse.scrollVector2 heeft een waarde van , maar als het een verticaal scrollwiel is, denk ik dat alleen de waarde van Y wordt ingesteld.

Trouwens, als je naar beneden scrolt, gaat de waarde in 120 eenheden op en neer. Dit is een waarde die is gedefinieerd door Windows, dus het aantal kan veranderen afhankelijk van andere omgevingen en muistypen.

Bepalen wanneer op een muisknop wordt geklikt

Hier wil ik een voorbeeld verplaatsen dat tekst weergeeft op de positie waar op de linkermuisknop wordt geklikt. De timing van het klikken kan worden bepaald door eigenschappen op dezelfde manier als wasPressedThisFrame toetsenbordtoetsen.

Plaats eerst een tekstobject om te verplaatsen. De grootte en positie zijn geschikt.

Maak een script voor het klikproces. MouseButtonClick Laat de naam staan als .

Het script ziet er als volgt uit:

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

Ik voer het proces uit om het tekstobject naar de aangeklikte positie te verplaatsen. De lokale positie van het UI-object is de coördinaat van het canvas, dus het verschilt van de positie van de muis, de schermcoördinaat.

Aangezien de oorsprong van het canvas (0, 0) in het midden ligt,RectTransform.sizeDelta gebruikt u om de helft van de grootte van het canvas te krijgen. De oorsprong van de muiscoördinaten is naar het midden verschoven.

U kunt bepalen of u wel of niet mouse.xxxxxxxx.wasPressedThisFrame hebt geklikt en alleen true terugkeren op het moment dat u klikt. Als u op de knop klikt en deze ingedrukt houdt, blijft deze terugkeren totdat u false er opnieuw op klikt.

Nadat EventSystem u het script hebt opgeslagen, koppelt u het aan . Deze keer gebruiken we ook Canvas, dus stel het canvas en het tekstobject in.

Probeer het spel uit te voeren en kijk of het tekstobject naar de aangeklikte locatie gaat. Omdat het alleen wordt verwerkt op het moment dat erop wordt geklikt, beweegt het tekstobject niet, zelfs niet als u de muis beweegt tijdens het klikken.

Bepalen wanneer u de muisknop loslaat

Hoewel het niet als voorbeeld wordt weergegeven, wasPressedThisFrame kunt u de timing van de release bepalen door te gebruiken in plaats van wasReleasedThisFrame .

Oordeel terwijl u op de knop klikt

mouse.xxxxxxxx.isPressed om terug te blijven keren zolang true u op de knop klikt. Hier wil ik de tekst draaien terwijl ik op de rechterknop druk.

Het script wordt afgeleid van de linkermuisknop. Wijzig het als volgt:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Nadat u het script hebt opgeslagen, voert u het uit om het te controleren. Het object blijft draaien zolang de rechterknop wordt ingedrukt.