Betjening med musen (Input System Package Version)

Side opdateret :
Dato for oprettelse af side :

Miljø til bekræftelse

Windows
  • Windows 11
Enhedslistens redaktør
  • 2020.3.25f1
Input System Pakke
  • 1.2.0

Forudsætninger for dette tip

Følgende indstillinger er foretaget på forhånd som en forudsætning for beskrivelsen af dette tip.

Få musens position

Musens position på spilskærmen kan Mouse.position fås i . Her vil jeg gerne vise placeringsoplysningerne.

Placerer et tekstobjekt på lærredet, der viser museoplysninger.

Musens oplysninger hentes ved hjælp af scripting. I dette tilfælde opretter vi en scriptfil kaldet i projektet MouseInfo .

Indtast scriptet som følger:

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å oplysninger om den aktuelt aktive mus. Mouse.position har musens aktuelle position i , så ReadValue du kan få værdien i formularen ved Vector2 hjælp Vector2Control af metoden.

Den erhvervede museposition er indstillet til et tekstobjekt. StringBuilder Du skal ikke bekymre dig for meget om at bruge , da det er til tilføjelse senere.

Når EventSystem du har gemt scriptet, skal du vedhæfte det til objektet. Tekstobjekt er indstillet til et tekstobjekt, der skal vises oplysninger om.

Prøv at køre spillet og flytte musen. Jeg tror, at musens position vises på skærmen i realtid.

Forresten er koordinaterne for musepositionen (0, 0) i nederste venstre hjørne af spilskærmen. X-aksen (venstre og højre) bliver positiv, når du går til højre, og negativ, når du går til venstre. Y-aksen (op og ned) bliver positiv, når du går op, og negativ, når du går ned. Derfor er den maksimale værdi af hver akse i øverste højre hjørne af spilskærmen.

Bemærk også, at denne koordinat kun er for spillets skærmplads, så pixelstørrelsen i spillet og pixelstørrelsen på enhedens skærmkoordinater stemmer muligvis ikke overens.

Få mængden af rulle på hjulet

Rulning med musehjulet kan også hentes i scriptet. Rullemængden Mouse.scroll kan fås med . I modsætning til musepositionen kan du kun få mængden rullet øjeblikkeligt. Bemærk, at du ikke kan få, hvor langt du har rullet.

Jeg vil tilføje det til den rulleoperation, jeg oprettede MouseInfo tidligere.

// 省略

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 holder ikke det rullede beløb indtil videre, så Definer et dedikeret felt ScrollValue til at holde rullemængden.

Mouse.scroll Derefter kan du få det rullede beløb i det øjeblik, så vi akkumulerer denne værdi. For eksempel, hvis ScrollValue du ruller hjulet to gange, bevares mængden af rullet to gange.

Resten er at vise denne værdi som tekst.

Kør nu spillet og drej hjulet. Jeg tror, du vil se mængden af rulning.

Mouse.scrollVector2 har en værdi på , men hvis det er et lodret rullehjul, tror jeg, at kun værdien af Y vil blive indstillet.

Forresten, hvis du ruller ned, vil værdien gå op og ned i 120 enheder. Dette er en værdi, der er defineret af Windows, så antallet kan ændre sig afhængigt af andre miljøer og musetyper.

Bestem, hvornår der klikkes med en museknap

Her vil jeg gerne flytte en prøve, der viser tekst på det sted, hvor der klikkes på venstre museknap. Tidspunktet for klik kan bestemmes af egenskaber på samme måde som wasPressedThisFrame tastaturtaster.

Placer først et tekstobjekt til flytning. Størrelsen og placeringen er passende.

Opret et script til klikprocessen. MouseButtonClick Lad navnet være .

Scriptet ser sådan ud:

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

Jeg udfører processen med at flytte tekstobjektet til den klikkede position. Den lokale position af UI-objektet er koordinaten for lærredet, så det er forskelligt fra musens position, som er skærmkoordinaten.

Da lærredets oprindelse (0, 0) er i midten,RectTransform.sizeDelta skal du bruge til at få halvdelen af lærredets størrelse. Oprindelsen af musekoordinaterne skiftes til midten.

Du kan bestemme, om du klikkede eller ej mouse.xxxxxxxx.wasPressedThisFrame , og kun true returnere det øjeblik, du klikker. Hvis du klikker på knappen og holder den nede, fortsætter den med at vende tilbage, indtil du false klikker på den igen.

Når EventSystem du har gemt scriptet, skal du vedhæfte det til . Denne gang vil vi også bruge Canvas, så indstil lærredet og tekstobjektet.

Prøv at køre spillet og se, om tekstobjektet flyttes til den klikkede placering. Da det kun behandler det øjeblik, det klikkes på, bevæger tekstobjektet sig ikke, selvom du bevæger musen, mens du klikker.

Find ud af, hvornår du slipper museknappen

Selvom det ikke er angivet som et eksempel, wasPressedThisFrame kan du bestemme tidspunktet for frigivelse ved at bruge i stedet for wasReleasedThisFrame .

Bedøm, mens du klikker på knappen

mouse.xxxxxxxx.isPressed for at fortsætte med at vende tilbage, så længe true du klikker på knappen. Her vil jeg gerne rotere teksten, mens jeg trykker på højre knap.

Scriptet omdirigeres fra venstreklikket. Det ændres som følger:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Når du har gemt scriptet, skal du køre det for at kontrollere det. Objektet fortsætter med at rotere, så længe der trykkes på højre knap.