Ovládanie myšou (verzia vstupného systémového balíka)

Stránka aktualizovaná :
Dátum vytvorenia strany :

Prostredie overovania

Windows
  • Windows 11
Editor jednoty
  • 2020.3.25f1
Vstupný systémový balík
  • 1.2.0

Predpoklady pre tento tip

Nasledujúce nastavenia boli vykonané vopred ako predpoklad pre popis tohto tipu.

Získajte pozíciu myši

Polohu myši na hernej obrazovke je možné Mouse.position získať v . Tu by som chcel zobraziť informácie o polohe.

Umiestni textový objekt na plátno, ktorý zobrazuje informácie o myši.

Informácie myši sa získavajú skriptovaním. V tomto prípade vytvoríme skriptový súbor s názvom v projekte MouseInfo .

Zadajte skript nasledovne:

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ískať informácie o aktuálne aktívnej myši. Mouse.position má aktuálnu pozíciu myši v , takže ReadValue môžete získať hodnotu vo formulári Vector2 pomocou metódyVector2Control.

Získaná pozícia myši je nastavená na textový objekt. StringBuilder Nerobte si príliš starosti s používaním , pretože je to na neskoršie pridanie.

Po EventSystem uložení skriptu ho priložte k objektu. Textový objekt je nastavený na textový objekt, o ktorom sa zobrazujú informácie.

Skúste spustiť hru a pohybovať myšou. Myslím si, že pozícia myši sa objaví na obrazovke v reálnom čase.

Mimochodom, súradnice pozície myši sú (0, 0) v ľavom dolnom rohu hernej obrazovky. Os X (ľavá a pravá) sa stáva kladnou, keď idete doprava, a negatívnou, keď idete doľava. Os Y (hore a dole) sa stáva pozitívnou, keď idete hore, a negatívnou, keď idete dole. Preto je maximálna hodnota každej osi v pravom hornom rohu hernej obrazovky.

Upozorňujeme tiež, že táto súradnica je určená iba pre priestor hernej obrazovky, takže veľkosť pixelov v hre a veľkosť pixelov súradníc obrazovky zariadenia sa nemusia zhodovať.

Získajte množstvo posúvania kolieska

Rolovanie kolieskom myši je možné získať aj v skripte. Množstvo Mouse.scroll rolovania je možné získať pomocou . Na rozdiel od polohy myši môžete množstvo posúvať iba okamžite. Upozorňujeme, že nemôžete zistiť, ako ďaleko ste sa posunuli.

Pridám ho do operácie posúvania, ktorú som vytvoril MouseInfo skôr.

// 省略

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 zatiaľ nedrží posúvanú sumu, takže Definujte vyhradené pole ScrollValue , v ktorom sa bude nachádzať posúvacia suma.

Mouse.scroll Potom môžete v tom okamihu získať posúvanú sumu, takže túto hodnotu nahromadíme. Ak napríklad ScrollValue dvakrát posúvate koliesko, množstvo rolovania dvakrát sa zachová.

Zvyšok je zobrazenie tejto hodnoty ako textu.

Teraz spustite hru a roztočte koleso. Myslím, že uvidíte množstvo rolovania.

Mouse.scrollVector2 má hodnotu , ale ak je to vertikálne rolovacie koliesko, myslím, že sa nastaví iba hodnota Y.

Mimochodom, ak sa posuniete nadol, hodnota pôjde hore a dole v 120 jednotkách. Toto je hodnota definovaná systémom Windows, takže číslo sa môže meniť v závislosti od iných prostredí a typov myší.

Určenie kliknutia na tlačidlo myši

Tu by som chcel presunúť ukážku, ktorá zobrazuje text na pozícii, kde je kliknuté ľavé tlačidlo myši. Načasovanie kliknutia môže byť určené vlastnosťami rovnakým spôsobom ako wasPressedThisFrame klávesy na klávesnici.

Najprv umiestnite textový objekt na presun. Veľkosť a poloha sú primerané.

Vytvorte skript pre proces kliknutia. MouseButtonClick Názov ponechajte ako .

Skript vyzerá 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;
    }
  }
}

Vykonávam proces presunu textového objektu na kliknutú pozíciu. Lokálna poloha objektu používateľského rozhrania je súradnica plátna, takže sa líši od polohy myši, ktorá je súradnicou obrazovky.

Keďže pôvod plátna (0, 0) je v strede,RectTransform.sizeDelta použite na získanie polovice veľkosti plátna. Pôvod súradníc myši je posunutý do stredu.

Môžete určiť, či ste klikli alebo nie mouse.xxxxxxxx.wasPressedThisFrame , a vrátiť sa až true v okamihu, keď kliknete. Ak na tlačidlo kliknete a podržíte ho, bude sa vracať, kým naň znova nekliknete false .

Po EventSystem uložení skriptu ho priložte k súboru . Tentokrát použijeme aj plátno, takže nastavte plátno a textový objekt.

Skúste spustiť hru a zistite, či sa textový objekt presunie na miesto, na ktoré ste klikli. Keďže textový objekt spracováva iba okamih kliknutia, nepohybuje sa ani pri pohybe myšou počas klikania.

Určenie uvoľnenia tlačidla myši

Hoci nie je uvedená ako vzorka, wasPressedThisFrame načasovanie uvoľnenia môžete určiť použitím namiesto wasReleasedThisFrame .

Posúďte pri kliknutí na tlačidlo

mouse.xxxxxxxx.isPressed a vráťte sa dovtedy, kým true kliknete na tlačidlo. Tu by som chcel otočiť text stlačením pravého tlačidla.

Skript je odklonený od skriptu ľavého kliknutia. Upravte ho nasledovne:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Po uložení skriptu ho spustite a skontrolujte. Objekt sa naďalej otáča, pokiaľ je stlačené pravé tlačidlo.