Funcionamiento con el ratón (versión del paquete del sistema de entrada)

Actualización de la página :
Fecha de creación de la página :

Entorno de verificación

Windows
  • Ventanas 11
Unity Editor
  • 2020.3.25f1
Paquete del sistema de entrada
  • 1.2.0

Requisitos previos para esta sugerencia

Los siguientes ajustes se han realizado de antemano como premisa para la descripción de este consejo.

Obtener la posición del ratón

La posición del ratón en la pantalla del juego se puede Mouse.position obtener en . Aquí, me gustaría mostrar la información de ubicación.

Coloca un objeto de texto en el lienzo que muestra información del mouse.

La información del ratón se recupera mediante secuencias de comandos. En este caso, crearemos un archivo de script llamado en el proyecto MouseInfo .

Introduzca el script de la siguiente manera:

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.currentPuede obtener información sobre el mouse actualmente activo. Mouse.position tiene la posición actual del mouse en , por lo que ReadValue puede obtener el valor del formulario Vector2 mediante el Vector2Control método.

La posición adquirida del ratón se establece en un objeto de texto. StringBuilder No se preocupe demasiado por usar , ya que es para agregar más tarde.

Después de EventSystem guardar el script, adjúntelo al objeto. Objeto de texto se establece en un objeto de texto sobre el que mostrar información.

Intenta ejecutar el juego y mover el ratón. Creo que la posición del ratón aparecerá en la pantalla en tiempo real.

Por cierto, las coordenadas de la posición del ratón son (0, 0) en la esquina inferior izquierda de la pantalla del juego. El eje X (izquierda y derecha) se vuelve positivo a medida que avanzas hacia la derecha y negativo a medida que vas hacia la izquierda. El eje Y (arriba y abajo) se vuelve positivo a medida que subes y negativo a medida que bajas. Por lo tanto, el valor máximo de cada eje está en la esquina superior derecha de la pantalla del juego.

Además, ten en cuenta que esta coordenada es solo para el espacio de la pantalla del juego, por lo que es posible que el tamaño de píxel en el juego y el tamaño de píxel de las coordenadas de la pantalla del dispositivo no coincidan.

Obtenga la cantidad de desplazamiento de la rueda

El desplazamiento con la rueda del ratón también se puede recuperar en el script. La cantidad Mouse.scroll de desplazamiento se puede obtener con . A diferencia de la posición del mouse, solo puede obtener la cantidad desplazada instantáneamente. Ten en cuenta que no puedes obtener qué tan lejos te has desplazado.

Lo agregaré a la operación de desplazamiento que creé MouseInfo anteriormente.

// 省略

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 contiene la cantidad desplazada hasta ahora, por lo que Defina un campo ScrollValue dedicado para contener la cantidad de desplazamiento.

Mouse.scroll Luego, puede obtener la cantidad desplazada en ese momento, por lo que acumularemos ese valor. Por ejemplo, si ScrollValue desplaza la rueda dos veces, se conservará la cantidad de desplazamiento dos veces.

El resto es mostrar este valor como texto.

Ahora ejecuta el juego y gira la rueda. Creo que verás la cantidad de desplazamiento.

Mouse.scrollVector2 tiene un valor de , pero si es una rueda de solo desplazamiento vertical, creo que solo se establecerá el valor de Y.

Por cierto, si se desplaza hacia abajo, el valor subirá y bajará en 120 unidades. Este es un valor definido por Windows, por lo que el número puede cambiar dependiendo de otros entornos y tipos de mouse.

Determinar cuándo se hace clic en un botón del ratón

Aquí, me gustaría mover una muestra que muestra texto en la posición donde se hace clic con el botón izquierdo del mouse. El momento de hacer clic se puede determinar mediante propiedades de la misma manera que wasPressedThisFrame las teclas del teclado.

Primero, coloque un objeto de texto para moverlo. El tamaño y la posición son apropiados.

Cree un script para el proceso de clic. MouseButtonClick Deje el nombre como .

El script tiene este aspecto:

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

Realizo el proceso de mover el objeto de texto a la posición en la que se hace clic. La posición local del objeto de interfaz de usuario es la coordenada del lienzo, por lo que es diferente de la posición del mouse, que es la coordenada de pantalla.

Dado que el origen del lienzo (0, 0) está en el centro,RectTransform.sizeDelta use para obtener la mitad del tamaño del lienzo. El origen de las coordenadas del ratón se desplaza hacia el centro.

Puede determinar si hizo clic o no mouse.xxxxxxxx.wasPressedThisFrame y devolver solo true en el momento en que haga clic. Si hace clic y mantiene presionado el botón, continuará regresando hasta que false vuelva a hacer clic en él.

Después de EventSystem guardar el script, adjúntelo a . Esta vez, también usaremos Canvas, así que configura el Canvas y el objeto de texto.

Intente ejecutar el juego y vea si el objeto de texto se mueve a la ubicación en la que se hizo clic. Dado que sólo procesa el momento en que se hace clic, el objeto de texto no se mueve incluso si mueve el ratón mientras hace clic.

Determinar cuándo suelta el botón del mouse

Aunque no aparece como ejemplo, wasPressedThisFrame puede determinar el momento de lanzamiento utilizando en lugar de wasReleasedThisFrame .

Juzgar mientras hace clic en el botón

mouse.xxxxxxxx.isPressed para continuar regresando siempre true que haga clic en el botón. Aquí, me gustaría rotar el texto mientras presiono el botón derecho.

El script se desvía del clic izquierdo. Modifíquelo de la siguiente manera:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Después de guardar el script, ejecútelo para comprobarlo. El objeto continúa girando mientras se presiona el botón derecho.