Töötamine hiirega (sisendsüsteemi paketi versioon)

Lehekülg uuendatud :
Lehe loomise kuupäev :

Kontrollimise keskkond

Windows
  • Windows 11
Ühtsuse toimetaja
  • 2020.3.25f1
Sisendsüsteemi pakett
  • 1.2.0

Selle näpunäite eeltingimused

Selle vihje kirjeldamise eelduseks on eelnevalt tehtud järgmised sätted.

Hankige hiire asukoht

Hiire asukoha mänguekraanil saab Mouse.position . Siin tahaksin kuvada asukohateavet.

Paigutab tekstiobjekti lõuendile, kus kuvatakse hiireteave.

Hiireteave tuuakse skriptimise teel. Sel juhul loome projektis MouseInfo nimelise skriptifaili .

Sisestage skript järgmiselt:

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.currentSaate teavet praegu aktiivse hiire kohta. Mouse.position on hiire praegune asukoht , nii et ReadValue saate meetodi abil Vector2Control vormi väärtuseVector2.

Omandatud hiire asukoht on seatud tekstiobjektile. StringBuilder Ärge muretsege liiga palju kasutamise pärast, kuna see on mõeldud hilisemaks lisamiseks.

Pärast EventSystem skripti salvestamist lisage see objektile. Tekstiobjekt on seatud tekstiobjektile, mille kohta teavet kuvada.

Proovige mängu käivitada ja hiirt liigutada. Ma arvan, et hiire asend ilmub ekraanile reaalajas.

Muide, hiire asukoha koordinaadid on (0, 0) mängu ekraani vasakus alanurgas. X-telg (vasak ja parem) muutub positiivseks, kui lähete paremale, ja negatiivseks, kui lähete vasakule. Y-telg (üles ja alla) muutub positiivseks, kui lähete üles, ja negatiivseks, kui lähete alla. Seetõttu on iga telje maksimaalne väärtus mängu ekraani paremas ülanurgas.

Samuti pange tähele, et see koordinaat on mõeldud ainult mängu ekraaniruumi jaoks, nii et mängu pikslite suurus ja seadme ekraani koordinaatide pikslite suurus ei pruugi ühtida.

Hankige ratta kerimise kogus

Hiirerattaga kerimist saab ka skriptist alla laadida. Kerimissumma Mouse.scroll saab . Erinevalt hiire asendist saate summa kerida ainult kohe. Pange tähele, et te ei saa teada, kui kaugele olete kerinud.

Lisan selle varem loodud MouseInfo kerimisoperatsioonile.

// 省略

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 ei hoia siiani keritud summat, nii et Määratlege kerimissumma hoidmiseks spetsiaalne väli ScrollValue .

Mouse.scroll Seejärel saate sel hetkel keritud summa, nii et me kogume selle väärtuse. Näiteks kui ScrollValue kerite ratast kaks korda, säilitatakse kaks korda keritud kogus.

Ülejäänud on selle väärtuse kuvamine tekstina.

Nüüd käivitage mäng ja keerutage ratast. Ma arvan, et näete kerimise hulka.

Mouse.scrollVector2 on väärtus , kuid kui see on vertikaalne ainult keritav ratas, siis ma arvan, et määratakse ainult Y väärtus.

Muide, kui kerite alla, läheb väärtus üles ja alla 120 ühikut. See on Windowsi määratletud väärtus, nii et arv võib muutuda sõltuvalt teistest keskkondadest ja hiiretüüpidest.

Hiirenupu klõpsamise määramine

Siin tahaksin liigutada näidist, mis kuvab teksti kohas, kus hiire vasakut nuppu klõpsatakse. Klõpsamise ajastust saab määrata omaduste järgi samamoodi nagu wasPressedThisFrame klaviatuuriklahve.

Esmalt asetage tekstiobjekt teisaldamiseks. Suurus ja asukoht on sobivad.

Looge klõpsamisprotsessi jaoks skript. MouseButtonClick Jätke nimi nimeks .

Skript näeb välja selline:

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

Teostan tekstiobjekti teisaldamise klõpsatud asukohta. Kasutajaliidese objekti kohalik asukoht on lõuendi koordinaat, seega erineb see hiire asendist, mis on ekraani koordinaat.

Kuna lõuendi päritolu (0, 0) on keskel,RectTransform.sizeDelta kasutage poole lõuendi suuruse saamiseks. Hiire koordinaatide päritolu nihutatakse keskele.

Saate määrata, kas klõpsasite või mitte mouse.xxxxxxxx.wasPressedThisFrame , ja naasta ainult true klõpsamise hetkel. Kui klõpsate nuppu ja hoiate seda all, naaseb see seni, kuni klõpsate false seda uuesti.

Pärast EventSystem skripti salvestamist manustage see . Seekord kasutame ka lõuendit, nii et seadke lõuend ja tekstiobjekt.

Proovige mängu käivitada ja vaadake, kas tekstiobjekt liigub klõpsatud asukohta. Kuna see töötleb ainult klõpsamise hetke, ei liigu tekstiobjekt isegi siis, kui liigutate hiirt klõpsamise ajal.

Määrake hiirenupu vabastamise aeg

Kuigi seda pole näidisena loetletud, saate vabastamise ajastuse määrata, wasPressedThisFrame kasutades selle asemel wasReleasedThisFrame .

Kohtunik nupul klõpsates

mouse.xxxxxxxx.isPressed et jätkata naasmist seni, kuni true klõpsate nuppu. Siin tahaksin teksti pöörata, vajutades samal ajal paremat nuppu.

Skript suunatakse vasakklõpsult kõrvale. Muutke seda järgmiselt:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Pärast skripti salvestamist käivitage see selle kontrollimiseks. Objekt jätkab pöörlemist seni, kuni vajutatakse paremat nuppu.