Operarea cu mouse-ul (versiunea pachetului sistemului de intrare)

Pagina actualizată :
Data creării paginii :

Mediul de verificare

Windows
  • Ferestre 11
Unity Editor
  • 2020.3.25F1
Pachet sistem de intrare
  • 1.2.0

Cerințe preliminare pentru acest sfat

Următoarele setări au fost făcute în avans ca premisă pentru descrierea acestui sfat.

Obțineți poziția mouse-ului

Poziția mouse-ului pe ecranul jocului poate Mouse.position fi obținută în . Aici, aș dori să afișez informațiile despre locație.

Plasează un obiect text pe Planșa care afișează informații despre mouse.

Informațiile mouse-ului sunt preluate prin scriptare. În acest caz, vom crea un fișier script numit în proiect MouseInfo .

Introduceți scriptul după cum urmează:

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.currentPuteți obține informații despre mouse-ul activ în prezent. Mouse.position are poziția curentă a mouse-ului în , astfel încât ReadValue să puteți obține valoarea din formular Vector2 utilizând Vector2Control metoda.

Poziția dobândită a mouse-ului este setată la un obiect text. StringBuilder Nu vă faceți griji prea mult cu privire la utilizarea , deoarece este pentru adăugarea ulterioară.

După ce EventSystem salvați scriptul, atașați-l la obiect. Obiectul text este setat la un obiect text pentru a afișa informații despre.

Încercați să rulați jocul și să mutați mouse-ul. Cred că poziția mouse-ului va apărea pe ecran în timp real.

Apropo, coordonatele poziției mouse-ului sunt (0, 0) în colțul din stânga jos al ecranului de joc. Axa X (stânga și dreapta) devine pozitivă pe măsură ce mergeți spre dreapta și negativă pe măsură ce mergeți spre stânga. Axa Y (în sus și în jos) devine pozitivă pe măsură ce urci și negativă pe măsură ce cobori. Prin urmare, valoarea maximă a fiecărei axe se află în colțul din dreapta sus al ecranului de joc.

De asemenea, vă rugăm să rețineți că această coordonată este doar pentru spațiul ecranului jocului, astfel încât dimensiunea pixelilor din joc și dimensiunea pixelilor coordonatelor ecranului dispozitivului pot să nu se potrivească.

Obțineți cantitatea de derulare a roții

Defilarea cu rotița mouse-ului poate fi, de asemenea, preluată în script. Suma Mouse.scroll de derulare poate fi obținută cu . Spre deosebire de poziția mouse-ului, puteți obține suma derulată instantaneu. Rețineți că nu puteți ajunge cât de departe ați derulat.

Îl voi adăuga la operația de derulare pe care am creat-o MouseInfo mai devreme.

// 省略

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 nu deține suma derulată până acum, deci Definiți un câmp ScrollValue dedicat pentru a reține suma de derulare.

Mouse.scroll Apoi, puteți obține suma derulată în acel moment, așa că vom acumula acea valoare. De exemplu, dacă ScrollValue derulați roata de două ori, cantitatea derulată de două ori va fi reținută.

Restul este să afișați această valoare ca text.

Acum rulați jocul și rotiți roata. Cred că veți vedea cantitatea de derulare.

Mouse.scrollVector2 are o valoare de , dar dacă este o roată verticală numai cu derulare, cred că va fi setată doar valoarea lui Y.

Apropo, dacă derulați în jos, valoarea va crește și va scădea în 120 de unități. Aceasta este o valoare definită de Windows, astfel încât numărul se poate modifica în funcție de alte medii și tipuri de mouse.

Determinați când se face clic pe un buton al mouse-ului

Aici, aș dori să mut un eșantion care afișează text în poziția în care se face clic pe butonul stâng al mouse-ului. Momentul clicului poate fi determinat de proprietăți în același mod ca wasPressedThisFrame și tastele tastaturii.

Mai întâi, plasați un obiect text pentru mutare. Dimensiunea și poziția sunt adecvate.

Creați un script pentru procesul de clic. MouseButtonClick Lăsați numele ca .

Scenariul arată astfel:

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

Efectuez procesul de mutare a obiectului text în poziția pe care ați făcut clic. Poziția locală a obiectului UI este coordonata pânzei, deci este diferită de poziția mouse-ului, care este coordonata ecranului.

Deoarece originea pânzei (0, 0) este în centru,RectTransform.sizeDelta utilizați pentru a obține jumătate din dimensiunea pânzei. Originea coordonatelor mouse-ului este deplasată spre centru.

Puteți stabili dacă ați făcut clic sau nu mouse.xxxxxxxx.wasPressedThisFrame și puteți returna numai true momentul în care faceți clic. Dacă faceți clic lung pe buton, acesta va continua să revină până când faceți false clic din nou pe el.

După ce EventSystem salvați scriptul, atașați-l la . De data aceasta, vom folosi și Canvas, așa că setați Canvas și obiectul text.

Încercați să rulați jocul și vedeți dacă obiectul text se mută în locația pe care ați făcut clic. Deoarece procesează doar în momentul în care se face clic, obiectul text nu se mișcă chiar dacă mutați mouse-ul în timp ce faceți clic.

Determinați când eliberați butonul mouse-ului

Deși nu este listat ca eșantion, wasPressedThisFrame puteți determina momentul lansării utilizând în loc de wasReleasedThisFrame .

Judecați în timp ce faceți clic pe buton

mouse.xxxxxxxx.isPressed pentru a continua să reveniți atât timp cât true faceți clic pe buton. Aici, aș dori să rotesc textul în timp ce apăs butonul din dreapta.

Scriptul este deviat de la cel cu clic stânga. Modificați-l după cum urmează:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

După salvarea scriptului, rulați-l pentru a-l verifica. Obiectul continuă să se rotească atâta timp cât este apăsat butonul din dreapta.