Működtetés az egérrel (Input System Package Version)

Oldal frissítve :
Oldal létrehozásának dátuma :

Ellenőrzési környezet

Windows
  • Windows 11 esetén
Unity-szerkesztő
  • 2020.3.25f1
Bemeneti rendszercsomag
  • 1.2.0

A tipp előfeltételei

A következő beállításokat előre elvégeztük a tipp leírásának előfeltételeként.

Az egér pozíciójának lekérése

Az egér helyzete a játék képernyőjén Mouse.position a . Itt szeretném megjeleníteni a helyinformációkat.

Olyan szöveges objektumot helyez el a vásznon, amely megjeleníti az egér adatait.

Az egér információit parancsfájlok segítségével olvassa be a rendszer. Ebben az esetben létrehozunk egy szkriptfájlt, amelyet a projektben MouseInfo hívunk .

Adja meg a szkriptet az alábbiak szerint:

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.currentInformációt kaphat az éppen aktív egérről. Mouse.position az egér aktuális pozíciója -ban, így ReadValue a Vector2Control metódussal Vector2 megkaphatja az értéket az űrlapon.

A megszerzett egérpozíció szöveges objektumra van állítva. StringBuilder Ne aggódjon túl sokat a használata miatt, mivel ez a későbbi hozzáadáshoz szükséges.

A parancsfájl mentése után EventSystem csatolja az objektumhoz. A Szövegobjektum egy szöveges objektumra van beállítva, amelyről információkat szeretne megjeleníteni.

Próbálja meg futtatni a játékot és mozgatni az egeret. Azt hiszem, az egér pozíciója valós időben jelenik meg a képernyőn.

Egyébként az egér pozíciójának koordinátái (0, 0) a játék képernyőjének bal alsó sarkában. Az X tengely (bal és jobb) pozitívvá válik, amikor jobbra megy, és negatívvá, amikor balra megy. Az Y tengely (felfelé és lefelé) pozitívvá válik, amikor felfelé haladsz, és negatívvá, amikor lefelé haladsz. Ezért az egyes tengelyek maximális értéke a játékképernyő jobb felső sarkában található.

Kérjük, vegye figyelembe, hogy ez a koordináta csak a játék képernyőterületére vonatkozik, így előfordulhat, hogy a játékban lévő képpontméret és az eszköz képernyőkoordinátáinak képpontmérete nem egyezik.

Szerezd meg a görgetés mennyiségét

Az egérgörgővel való görgetés a szkriptben is lekérhető. A görgetési összeg Mouse.scroll a következővel érhető el: . Az egér pozíciójával ellentétben csak azonnal görgetheti az összeget. Ne feledje, hogy nem tudja elérni, hogy milyen messzire görgetett.

Hozzáadom a korábban létrehozott MouseInfo görgetési művelethez.

// 省略

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 nem tartja az eddig görgetett összeget, így Határozzon meg egy dedikált mezőt ScrollValue a görgetési összeg tárolására.

Mouse.scroll Ezután abban a pillanatban megkaphatja a görgetett összeget, így felhalmozzuk ezt az értéket. Ha például ScrollValue kétszer görgeti a kereket, a kétszer görgetett mennyiség megmarad.

A többi az, hogy ezt az értéket szövegként jelenítse meg.

Most futtassa a játékot, és forgassa meg a kereket. Azt hiszem, látni fogja a görgetés mennyiségét.

Mouse.scrollVector2 értéke , de ha csak függőleges görgethető kerék, akkor szerintem csak az Y értéke lesz beállítva.

Egyébként, ha lefelé görget, az érték 120 egységben felfelé és lefelé megy. Ezt az értéket a Windows határozza meg, így a szám más környezetektől és egértípusoktól függően változhat.

Annak meghatározása, hogy mikor kell kattintani egy egérgombbal

Itt szeretnék áthelyezni egy mintát, amely szöveget jelenít meg azon a helyen, ahol a bal egérgombbal kattintanak. A kattintás időzítése ugyanúgy meghatározható a tulajdonságok alapján, mint wasPressedThisFrame a billentyűzet billentyűi.

Először helyezzen el egy szöveges objektumot a mozgatáshoz. A méret és a pozíció megfelelő.

Hozzon létre egy szkriptet a kattintási folyamathoz. MouseButtonClick Hagyja meg a nevet .

A szkript így néz ki:

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

Végrehajtom a szövegobjektum kattintásos pozícióba mozgatásának folyamatát A felhasználói felület objektum helyi pozíciója a vászon koordinátája, így eltér az egér helyzetétől, amely a képernyő koordinátája.

Mivel a vászon eredete (0, 0) középen van,RectTransform.sizeDelta használja a vászon méretének felét. Az egér koordinátáinak origója a középpontba kerül.

Meghatározhatja, hogy kattintott-e vagy sem mouse.xxxxxxxx.wasPressedThisFrame , és csak true a kattintás pillanatában térhet vissza. Ha rákattint és lenyomva tartja a gombot, az mindaddig visszatér, amíg újra rá nem false kattint.

A szkript mentése után EventSystem csatolja a . Ezúttal a Canvas-t is használni fogjuk, ezért állítsa be a Canvas-t és a szöveges objektumot.

Próbálja meg futtatni a játékot, és nézze meg, hogy a szöveges objektum a kattintott helyre kerül-e. Mivel csak a kattintás pillanatát dolgozza fel, a szövegobjektum akkor sem mozdul el, ha kattintás közben mozgatja az egeret.

Az egérgomb felengedési idejének meghatározása

Bár nem szerepel mintaként, wasPressedThisFrame a helyett a használatával meghatározhatja a kiadás wasReleasedThisFrame időzítését.

Ítélkezzen a gombra kattintás közben

mouse.xxxxxxxx.isPressed gombra a visszatéréshez, amíg true a gombra kattint. Itt szeretném elforgatni a szöveget, miközben megnyomom a jobb gombot.

A szkript átirányításra kerül a bal egérgombbal. Módosítsa a következőképpen:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

A szkript mentése után futtassa az ellenőrzéshez. Az objektum addig forog, amíg a jobb gombot megnyomja.