Upravljanje z miško (različica paketa vhodnega sistema)

Stran posodobljena :
Datum ustvarjanja strani :

Okolje za preverjanje

Windows
  • Windows 11
Urejevalnik Unity
  • 2020.3.25F1
Paket vhodnega sistema
  • 1.2.0

Predpogoji za ta nasvet

Naslednje nastavitve so bile vnaprej narejene kot premisa za opis tega nasveta.

Pridobivanje položaja miške

Položaj miške na zaslonu igre lahko Mouse.position dobite v . Tukaj bi rad prikazal podatke o lokaciji.

Postavi besedilni predmet na platno, ki prikazuje informacije o miški.

Podatki o miški so pridobljeni s skriptnim izvajanjem. V tem primeru bomo ustvarili skriptno datoteko, imenovano v projektu MouseInfo .

Vnesite skript na naslednji nač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.currentDobite lahko informacije o trenutno aktivni miški. Mouse.position ima trenutni položaj miške v , tako da ReadValue lahko vrednost v obrazcu dobite z Vector2 metodoVector2Control.

Pridobljeni položaj miške je nastavljen na besedilni predmet. StringBuilder Ne skrbite preveč o uporabi , saj gre za poznejše dodajanje.

Ko EventSystem shranite skript, ga priložite predmetu. Besedilni predmet je nastavljen na besedilni predmet za prikaz informacij o.

Poskusite zagnati igro in premakniti miško. Mislim, da se bo položaj miške prikazal na zaslonu v realnem času.

Mimogrede, koordinate položaja miške so (0, 0) v spodnjem levem kotu zaslona igre. Os X (levo in desno) postane pozitivna, ko greste v desno, in negativna, ko greste na levo. Os Y (gor in dol) postane pozitivna, ko greste gor in negativna, ko greste navzdol. Zato je največja vrednost vsake osi v zgornjem desnem kotu zaslona igre.

Upoštevajte tudi, da je ta koordinata samo za prostor na zaslonu igre, zato se velikost slikovnih pik v igri in velikost slikovnih pik koordinat zaslona naprave morda ne ujemata.

Pridobite količino drsenja kolesa

Drsenje s kolescem miške lahko pridobite tudi v skriptu. Znesek Mouse.scroll drsenja lahko dobite z . Za razliko od položaja miške se lahko znesek takoj pomakne. Upoštevajte, da ne morete ugotoviti, kako daleč ste se pomaknili.

Dodal ga bom operaciji drsenja, ki sem jo ustvaril MouseInfo prej.

// 省略

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 ne drži zneska, ki se je doslej pomikal, zato Določite namensko polje ScrollValue , v katerem boste zadržali znesek drsenja.

Mouse.scroll Nato lahko v tistem trenutku dobite pomaknjeni znesek, tako da bomo to vrednost zbrali. Če se na primer dvakrat pomaknete po kolescu, se ScrollValue bo količina dvakratnega drsenja ohranila.

Ostalo je, da to vrednost prikažete kot besedilo.

Zdaj zaženite igro in zavrtite kolo. Mislim, da boste videli količino drsenja.

Mouse.scrollVector2 ima vrednost , če pa gre samo za navpično drsno kolo, mislim, da bo nastavljena samo vrednost Y.

Mimogrede, če se pomaknete navzdol, bo vrednost šla gor in dol v 120 enotah. To je vrednost, ki jo določi Windows, zato se lahko število spreminja glede na druga okolja in vrste miške.

Določanje, kdaj kliknete tipko miške

Tukaj bi rad premaknil vzorec, ki prikazuje besedilo na mestu, kjer kliknete levi gumb miške. Čas klikanja lahko določite z lastnostmi na enak način kot wasPressedThisFrame tipke na tipkovnici.

Najprej postavite besedilni predmet za premikanje. Velikost in položaj sta primerna.

Ustvarite skript za postopek klikanja. MouseButtonClick Pustite ime kot .

Scenarij izgleda takole:

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

Izvajam postopek premikanja besedilnega predmeta v kliknjeni položaj. Lokalni položaj predmeta uporabniškega vmesnika je koordinata platna, zato se razlikuje od položaja miške, ki je koordinata zaslona.

Ker je izvor platna (0, 0) v sredini, uporabite,RectTransform.sizeDelta da dobite polovico velikosti platna. Izvor koordinat miške se premakne v središče.

Določite lahko, ali ste kliknili ali ne mouse.xxxxxxxx.wasPressedThisFrame , in se vrnete samo true v trenutku, ko kliknete. Če kliknete in pridržite gumb, se bo še naprej vračal, dokler false ga znova ne kliknete.

Ko EventSystem shranite skript, ga priložite . Tokrat bomo uporabili tudi Canvas, zato nastavite platno in besedilni predmet.

Poskusite zagnati igro in preverite, ali se besedilni predmet premakne na mesto, ki ste ga kliknili. Ker obdeluje samo trenutek, ko ga kliknete, se besedilni predmet ne premakne, tudi če med klikanjem premaknete miško.

Določanje, kdaj spustite tipko miške

Čeprav ni naveden kot vzorec, lahko določite čas sproščanja tako, wasPressedThisFrame da wasReleasedThisFrame namesto .

Sodnik med klikom na gumb

mouse.xxxxxxxx.isPressed , da se vrnete, dokler true kliknete gumb. Tukaj bi rad zavrtel besedilo, medtem ko pritisnem desni gumb.

Skript je preusmerjen z levega klika. Spremenite ga na naslednji način:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Ko shranite skript, ga zaženite, da ga preverite. Predmet se še naprej vrti, dokler pritisnete desni gumb.