Operando com o mouse (Versão do Pacote do Sistema de Entrada)

Página atualizada :
Data de criação de página :

Ambiente de verificação

Windows
  • Janelas 11
Unity Editor
  • 25.3.2020F1
Pacote do sistema de entrada
  • 1.2.0

Pré-requisitos para esta dica

As configurações a seguir foram feitas com antecedência como premissa para a descrição desta dica.

Obter a posição do mouse

A posição do mouse na tela do jogo pode Mouse.position ser obtida em . Aqui, eu gostaria de exibir as informações de localização.

Coloca um objeto de texto no Canvas que exibe informações do mouse.

As informações do mouse são recuperadas por script. Neste caso, criaremos um arquivo de script chamado no projeto MouseInfo .

Digite o script da seguinte maneira:

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.currentVocê pode obter informações sobre o mouse ativo no momento. Mouse.position tem a posição atual do mouse no , para que ReadValue você possa obter o valor no formulário Vector2 usando o Vector2Control método.

A posição adquirida do mouse é definida como um objeto de texto. StringBuilder Não se preocupe muito em usar o , pois é para adicionar mais tarde.

Depois de EventSystem salvar o script, anexe-o ao objeto. Objeto de texto é definido como um objeto de texto para exibir informações sobre.

Tente executar o jogo e mover o mouse. Acho que a posição do mouse vai aparecer na tela em tempo real.

A propósito, as coordenadas da posição do mouse são (0, 0) no canto inferior esquerdo da tela do jogo. O eixo X (esquerda e direita) torna-se positivo à medida que você vai para a direita e negativo à medida que você vai para a esquerda. O eixo Y (para cima e para baixo) torna-se positivo à medida que sobe e negativo à medida que desce. Portanto, o valor máximo de cada eixo está no canto superior direito da tela do jogo.

Além disso, observe que essa coordenada é apenas para o espaço da tela do jogo, portanto, o tamanho do pixel no jogo e o tamanho do pixel das coordenadas da tela do dispositivo podem não corresponder.

Obter a quantidade de rolagem da roda

A rolagem com a roda do mouse também pode ser recuperada no script. A quantidade Mouse.scroll de rolagem pode ser obtida com o . Ao contrário da posição do mouse, você só pode obter a quantidade rolada instantaneamente. Observe que você não pode obter até onde você rolou.

Vou adicioná-lo à operação de rolagem que criei 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 não mantém a quantidade rolada até agora, então Defina um campo ScrollValue dedicado para conter a quantidade de rolagem.

Mouse.scroll Então, você pode obter o valor rolado naquele momento, então vamos acumular esse valor. Por exemplo, se ScrollValue você rolar a roda duas vezes, a quantidade de rolado duas vezes será mantida.

O resto é exibir esse valor como texto.

Agora execute o jogo e gire a roda. Acho que você vai ver a quantidade de rolagem.

Mouse.scrollVector2 tem um valor de , mas se for uma roda somente de rolagem vertical, acho que apenas o valor de Y será definido.

Aliás, se você rolar para baixo, o valor vai subir e descer em 120 unidades. Esse é um valor definido pelo Windows, portanto, o número pode mudar dependendo de outros ambientes e tipos de mouse.

Determinar quando um botão do mouse é clicado

Aqui, eu gostaria de mover um exemplo que exibe texto na posição em que o botão esquerdo do mouse é clicado. O tempo de clique pode ser determinado pelas propriedades da mesma forma que wasPressedThisFrame as teclas do teclado.

Primeiro, coloque um objeto de texto para mover. O tamanho e a posição são apropriados.

Crie um script para o processo de clique. MouseButtonClick Deixe o nome como .

O script tem a seguinte aparência:

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

Eu executo o processo de mover o objeto de texto para a posição clicada. A posição local do objeto da interface do usuário é a coordenada do Canvas, portanto, é diferente da posição do mouse, que é a coordenada da tela.

Como a origem do Canvas (0, 0) está no centro,RectTransform.sizeDelta use para obter metade do tamanho do Canvas. A origem das coordenadas do mouse é deslocada para o centro.

Você pode determinar se clicou ou não mouse.xxxxxxxx.wasPressedThisFrame e retornar apenas true no momento em que clicar. Se você clicar e segurar o botão, ele continuará a retornar até que você false clique nele novamente.

Depois de EventSystem salvar o script, anexe-o ao . Desta vez, também usaremos o Canvas, então defina o Canvas e o objeto de texto.

Tente executar o jogo e veja se o objeto de texto se move para o local clicado. Como ele só processa o momento em que é clicado, o objeto de texto não se move mesmo se você mover o mouse enquanto clica.

Determine quando você solta o botão do mouse

Embora não esteja listado como um exemplo, wasPressedThisFrame você pode determinar o tempo de lançamento usando em vez de wasReleasedThisFrame .

Julgue enquanto clica no botão

mouse.xxxxxxxx.isPressed para continuar a retornar, desde true que você clique no botão. Aqui, eu gostaria de girar o texto enquanto pressiona o botão direito.

O script é desviado do clique esquerdo. Modifique-o da seguinte maneira:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Depois de salvar o script, execute-o para verificá-lo. O objeto continua a girar enquanto o botão direito é pressionado.