Operando com o mouse (Versão do Pacote do Sistema de Entrada)
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.current
Você 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.scroll
Vector2
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.