Робота з мишею (версія пакета системи вводу)

Сторінка оновлюється :
Дата створення сторінки :

Середовище перевірки

Вікна
  • вікна 11
Редактор єдності
  • 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;
    }
  }
}

Я виконую процес переміщення текстового об'єкта в клацнуте положення. Локальне положення об'єкта UI є координатою полотна, тому воно відрізняється від положення миші, яка є координатою екрана.

Оскільки початок полотна (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);
    }
  }
}

Після збереження скрипта запустіть його, щоб перевірити. Об'єкт продовжує обертатися до тих пір, поки не натиснута права кнопка.