Работа с помощью мыши (версия системного пакета ввода)

Страница обновлена :
Дата создания страницы :

Среда верификации

Виндоус
  • Windows 11
Редактор Unity
  • 2020.3.25f1
Входной системный пакет
  • 1.2.0

Предпосылки для этого совета

Следующие настройки были сделаны заранее в качестве предпосылки для описания этого совета.

Получите положение мыши

Положение мыши на игровом экране можно Mouse.position получить в . Здесь я хотел бы отобразить информацию о местоположении.

Помещает на холст текстовый объект, отображающий сведения о мыши.

Сведения о мыши извлекаются с помощью сценариев. В этом случае мы создадим файл скрипта с именем в проекте MouseInfo .

Введите скрипт следующим образом:

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Вы можете получить информацию о текущей активной мыши. Mouse.position имеет текущее положение мыши в , поэтому ReadValue вы можете получить значение в форме Vector2 с помощью методаVector2Control.

Полученное положение мыши устанавливается на текстовый объект. StringBuilder Не беспокойтесь слишком сильно об использовании , так как это для добавления позже.

После EventSystem сохранения скрипта присоедините его к объекту. Текстовый объект — это текстовый объект, о котором отображается информация.

Попробуйте запустить игру и переместить мышь. Я думаю, что положение мыши будет отображаться на экране в режиме реального времени.

Кстати, координаты положения мыши находятся (0, 0) в левом нижнем углу игрового экрана. Ось X (влево и вправо) становится положительной, когда вы идете вправо, и отрицательной, когда вы идете влево. Ось Y (вверх и вниз) становится положительной, когда вы поднимаетесь, и отрицательной, когда вы спускаетесь. Поэтому максимальное значение каждой оси находится в правом верхнем углу игрового экрана.

Также обратите внимание, что эта координата предназначена только для пространства игрового экрана, поэтому размер пикселя в игре и размер пикселя координат экрана устройства могут не совпадать.

Получить величину прокрутки колеса

Прокрутка с помощью колесика мыши также может быть восстановлена в скрипте. Величину Mouse.scroll прокрутки можно получить с помощью . В отличие от положения мыши, вы можете прокрутить сумму только мгновенно. Обратите внимание, что вы не можете узнать, как далеко вы прокрутили.

Я добавлю его в операцию прокрутки, которую я создал MouseInfo ранее.

// 省略

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 не удерживает сумму, прокрученную до сих пор, поэтому Определите специальное поле ScrollValue для хранения суммы прокрутки.

Mouse.scroll Затем вы можете получить прокрученную сумму в этот момент, поэтому мы будем накапливать это значение. Например, если ScrollValue вы прокрутите колесо дважды, количество прокрутенных дважды будет сохранено.

Остальное - отобразить это значение в виде текста.

Теперь запускайте игру и крутите колесо. Я думаю, вы увидите количество прокрутки.

Mouse.scrollVector2 имеет значение , но если это вертикальное колесо прокрутки, я думаю, что будет установлено только значение Y.

Кстати, если прокрутить вниз, то значение будет идти вверх и вниз в 120 единиц. Это значение определяется Windows, поэтому оно может меняться в зависимости от других сред и типов мыши.

Определение времени нажатия кнопки мыши

Здесь я хотел бы переместить образец, который отображает текст в том месте, где нажата левая кнопка мыши. Время щелчка можно определить по свойствам так же, как wasPressedThisFrame и клавиши клавиатуры.

Сначала поместите текстовый объект для перемещения. Размер и положение соответствующие.

Создайте сценарий для процесса щелчка. MouseButtonClick Оставьте имя как .

Скрипт выглядит следующим образом:

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

Я выполняю процесс перемещения текстового объекта в выбранную позицию. Локальное положение объекта пользовательского интерфейса является координатой Canvas, поэтому оно отличается от положения мыши, которое является координатой экрана.

Поскольку начало Холста (0, 0) находится в центре, используйте,RectTransform.sizeDelta чтобы получить половину размера Холста. Начало координат мыши смещается к центру.

Вы можете определить, щелкнули вы или нет mouse.xxxxxxxx.wasPressedThisFrame , и вернуться только true в тот момент, когда вы щелкнули. Если вы нажмете и удерживаете кнопку, она будет продолжать возвращаться, пока вы false не нажмете ее снова.

После EventSystem сохранения сценария прикрепите его к . На этот раз мы также будем использовать Canvas, поэтому установите Canvas и текстовый объект.

Попробуйте запустить игру и посмотрите, переместится ли текстовый объект в выбранное место. Поскольку он обрабатывает только момент щелчка, текстовый объект не перемещается, даже если вы перемещаете мышь во время щелчка.

Определите, когда вы отпускаете кнопку мыши

Несмотря на то, что он не указан в качестве примера, wasPressedThisFrame вы можете определить время выпуска, используя вместо wasReleasedThisFrame .

Судить при нажатии кнопки

mouse.xxxxxxxx.isPressed чтобы продолжать возвращаться, пока true вы нажимаете кнопку. Здесь я хотел бы повернуть текст при нажатии правой кнопки.

Скрипт отклоняется от клика левой кнопкой мыши. Измените его следующим образом:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

После сохранения скрипта запустите его, чтобы проверить. Объект продолжает вращаться до тех пор, пока нажата правая кнопка.