Работа с мишката (версия на пакета за въвеждане на системата)

Страницата се актуализира :
Дата на създаване на страница :

Среда за проверка

Уиндоус
  • Прозорци 11
Редактор на единство
  • 2020.3.25ф1
Пакет на входната система
  • 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;
    }
  }
}

Извършвам процеса на преместване на текстовия обект в щракнатата позиция. Локалната позиция на обекта на потребителския интерфейс е координатата на платното, така че е различна от позицията на мишката, която е координатата на екрана.

Тъй като произходът на платното (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);
    }
  }
}

След като запишете скрипта, стартирайте го, за да го проверите. Обектът продължава да се върти, докато е натиснат десният бутон.