Funcionament amb el ratolí (Versió del paquet del sistema d'entrada)

Pàgina actualitzada :
Data de creació de la pàgina :

Entorn de verificació

Windows
  • Finestres 11
Editor d'unitat
  • 25.3.2020
Paquet del sistema d'entrada
  • 1.2.0

Requisits previs per a aquest consell

La configuració següent s'ha fet amb antelació com a premissa per a la descripció d'aquest consell.

Obtenir la posició del ratolí

La posició del ratolí a la pantalla del joc es pot Mouse.position obtenir a . Aquí, m'agradaria mostrar la informació d'ubicació.

Col·loca un objecte de text al llenç que mostra informació del ratolí.

La informació del ratolí es recupera mitjançant scripts. En aquest cas, crearem un fitxer script anomenat en el projecte MouseInfo .

Introduïu l'script de la manera següent:

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.currentPodeu obtenir informació sobre el ratolí actiu actualment. Mouse.position té la posició actual del ratolí en , de manera que ReadValue podeu obtenir el valor en la forma Vector2 mitjançant el mètodeVector2Control.

La posició adquirida del ratolí s'estableix en un objecte de text. StringBuilder No us preocupeu massa per utilitzar , ja que és per afegir més tard.

Després EventSystem de desar l'script, adjunta'l a l'objecte. L'objecte de text està definit en un objecte de text per mostrar informació.

Proveu d'executar el joc i moure el ratolí. Crec que la posició del ratolí apareixerà a la pantalla en temps real.

Per cert, les coordenades de la posició del ratolí són (0, 0) a l'extrem inferior esquerre de la pantalla del joc. L'eix X (esquerra i dreta) es torna positiu a mesura que vas cap a la dreta i negatiu a mesura que vas cap a l'esquerra. L'eix Y (amunt i avall) es torna positiu a mesura que puges i negatiu a mesura que baixes. Per tant, el valor màxim de cada eix es troba a l'extrem superior dret de la pantalla del joc.

A més, tingueu en compte que aquesta coordenada només és per a l'espai de la pantalla del joc, de manera que és possible que la mida del píxel del joc i la mida del píxel de les coordenades de la pantalla del dispositiu no coincideixin.

Obtenir la quantitat de desplaçament de la roda

El desplaçament amb la roda del ratolí també es pot recuperar a l'script. L'import Mouse.scroll de desplaçament es pot obtenir amb . A diferència de la posició del ratolí, només podeu obtenir la quantitat desplaçada instantàniament. Tingueu en compte que no podeu arribar fins a quin punt us heu desplaçat.

L'afegiré a l'operació de desplaçament que he creat MouseInfo anteriorment.

// 省略

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 no manté l'import desplaçat fins ara, de manera que Definiu un camp ScrollValue dedicat per contenir la quantitat de desplaçament.

Mouse.scroll A continuació, podeu obtenir l'import desplaçat en aquest moment, de manera que acumularem aquest valor. Per exemple, si ScrollValue desplaceu la roda dues vegades, es conservarà la quantitat de desplaçaments dues vegades.

La resta és mostrar aquest valor com a text.

Ara executeu el joc i gireu la roda. Crec que veureu la quantitat de desplaçaments.

Mouse.scrollVector2 té un valor de , però si és una roda només de desplaçament vertical, crec que només s'establirà el valor de Y.

Per cert, si us desplaceu cap avall, el valor pujarà i baixarà en 120 unitats. Aquest és un valor definit per Windows, de manera que el nombre pot canviar en funció d'altres entorns i tipus de ratolí.

Determinar quan es fa clic en un botó del ratolí

Aquí, m'agradaria moure una mostra que mostri text a la posició on es fa clic amb el botó esquerre del ratolí. El moment del clic es pot determinar per propietats de la mateixa manera que wasPressedThisFrame les tecles del teclat.

Primer, col·loqueu un objecte de text per moure'l. La mida i la posició són adequades.

Creeu un script per al procés de clic. MouseButtonClick Deixeu el nom com .

El guió té aquest aspecte:

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

Realitzo el procés de moure l'objecte de text a la posició clicada. La posició local de l'objecte UI és la coordenada del llenç, de manera que és diferent de la posició del ratolí, que és la coordenada de la pantalla.

Atès que l'origen del llenç (0, 0) es troba al centre,RectTransform.sizeDelta utilitzeu per obtenir la meitat de la mida del llenç. L'origen de les coordenades del ratolí es desplaça al centre.

Podeu determinar si heu fet clic o no mouse.xxxxxxxx.wasPressedThisFrame i tornar només true en el moment en què feu clic. Si manteniu premut el botó, continuarà tornant fins que el torneu false a fer.

Després EventSystem de desar l'script, adjunteu-lo a . Aquesta vegada, també utilitzarem Canvas, de manera que configurarem el Canvas i l'objecte de text.

Proveu d'executar el joc i comproveu si l'objecte de text es mou a la ubicació clicada. Com que només processa el moment en què es fa clic, l'objecte de text no es mou encara que mogueu el ratolí mentre feu clic.

Determineu quan deixeu anar el botó del ratolí

Tot i que no apareix com a mostra, wasPressedThisFrame podeu determinar el moment del llançament utilitzant en lloc de wasReleasedThisFrame .

Jutgeu mentre feu clic al botó

mouse.xxxxxxxx.isPressed per continuar tornant sempre true que feu clic al botó. Aquí, m'agradaria girar el text mentre premeu el botó dret.

L'script es desvia del clic esquerre. Modifiqueu-la de la següent manera:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Després de desar l'script, executeu-lo per comprovar-ho. L'objecte continua girant mentre es prem el botó dret.