Ovládání myší (verze balíčku vstupního systému)

Stránky aktualizovány :
Datum vytvoření stránky :

Ověřovací prostředí

Windows
  • Systém Windows 11
Editor jednoty
  • 2020.3.25f1
Vstupní systémový balíček
  • 1.2.0

Předpoklady pro tento tip

Následující nastavení byla provedena předem jako předpoklad pro popis tohoto tipu.

Získání pozice myši

Polohu myši na herní obrazovce lze Mouse.position získat v . Zde bych chtěl zobrazit informace o poloze.

Umístí textový objekt na plátno, který zobrazuje informace o myši.

Informace o myši se načítají skriptováním. V tomto případě vytvoříme soubor skriptu nazvaný v projektu MouseInfo .

Zadejte skript následujícím způsobem:

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.currentMůžete získat informace o aktuálně aktivní myši. Mouse.position má aktuální pozici myši v , takže ReadValue můžete získat hodnotu ve formuláři pomocí Vector2 Vector2Control metody.

Získaná pozice myši je nastavena na textový objekt. StringBuilder Nebojte se příliš používat , protože je to pro přidání později.

Po EventSystem uložení skriptu jej připojte k objektu. Textový objekt je nastaven na textový objekt, o kterém se mají zobrazovat informace.

Zkuste spustit hru a pohybovat myší. Myslím, že pozice myši se objeví na obrazovce v reálném čase.

Mimochodem, souřadnice pozice myši jsou (0, 0) v levém dolním rohu herní obrazovky. Osa X (vlevo a vpravo) se stává kladnou, když jdete doprava, a zápornou, když jdete doleva. Osa Y (nahoru a dolů) se stává pozitivní, když jdete nahoru a negativní, když jdete dolů. Proto je maximální hodnota každé osy v pravém horním rohu herní obrazovky.

Upozorňujeme také, že tato souřadnice je určena pouze pro prostor herní obrazovky, takže velikost pixelů ve hře a velikost pixelu souřadnic obrazovky zařízení se nemusí shodovat.

Získání množství posuvu kolečka

Rolování kolečkem myši lze také načíst ve skriptu. Rolovací množství Mouse.scroll lze získat pomocí . Na rozdíl od pozice myši můžete získat pouze množství posunuté okamžitě. Všimněte si, že nemůžete zjistit, jak daleko jste se posunuli.

Přidám ji do operace posouvání, kterou jsem vytvořil MouseInfo dříve.

// 省略

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 nedrží částku posunutou tak daleko, takže Definujte vyhrazené pole ScrollValue pro uložení množství posouvání.

Mouse.scroll Poté můžete v daném okamžiku získat posunutou částku, takže tuto hodnotu nashromáždíme. Pokud ScrollValue například dvakrát posunete kolečkem, zůstane zachováno množství posunutého kolečka.

Zbytek je zobrazení této hodnoty jako textu.

Nyní spusťte hru a roztočte kolo. Myslím, že uvidíte množství posouvání.

Mouse.scrollVector2 má hodnotu , ale pokud se jedná o vertikální rolovací kolečko, myslím, že bude nastavena pouze hodnota Y.

Mimochodem, pokud se posunete dolů, hodnota půjde nahoru a dolů ve 120 jednotkách. Jedná se o hodnotu definovanou systémem Windows, takže číslo se může měnit v závislosti na jiných prostředích a typech myší.

Určení, kdy je kliknuto na tlačítko myši

Zde bych chtěl přesunout ukázku, která zobrazuje text v pozici, kde je kliknuto levým tlačítkem myši. Načasování kliknutí může být určeno vlastnostmi stejným způsobem jako wasPressedThisFrame klávesové klávesy.

Nejprve umístěte textový objekt pro přesun. Velikost a umístění jsou vhodné.

Vytvořte skript pro proces kliknutí. MouseButtonClick Název ponechte jako .

Skript vypadá takto:

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

Provedu proces přesunutí textového objektu na kliknutou pozici. Místní poloha objektu uživatelského rozhraní je souřadnice plátna, takže se liší od polohy myši, což je souřadnice obrazovky.

Vzhledem k tomu, že počátek plátna (0, 0) je uprostřed,RectTransform.sizeDelta použijte k získání poloviny velikosti plátna. Počátek souřadnic myši je posunut do středu.

Můžete určit, zda jste klikli nebo ne mouse.xxxxxxxx.wasPressedThisFrame , a vrátit se pouze true v okamžiku, kdy jste klikli. Pokud na tlačítko kliknete a podržíte, bude se vracet, dokud na něj znovu nekliknete false .

Po EventSystem uložení skriptu jej připojte k rozhraní . Tentokrát použijeme také Canvas, takže nastavte Canvas a textový objekt.

Zkuste spustit hru a zjistěte, zda se textový objekt přesune do umístění, na které jste klikli. Vzhledem k tomu, že zpracovává pouze okamžik klepnutí, textový objekt se nepohybuje, i když při kliknutí pohnete myší.

Určete, kdy uvolníte tlačítko myši

I když není uveden jako ukázka, wasPressedThisFrame můžete určit načasování vydání pomocí pomocí rozhraní wasReleasedThisFrame .

Posuďte při kliknutí na tlačítko

mouse.xxxxxxxx.isPressed se budete vracet, dokud true kliknete na tlačítko. Zde bych chtěl otočit text při stisknutí pravého tlačítka.

Skript je přesměrován z levého kliknutí. Upravte jej následujícím způsobem:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Po uložení skriptu jej spusťte a zkontrolujte jej. Objekt pokračuje v otáčení tak dlouho, dokud je stisknuto pravé tlačítko.