Obsługa za pomocą myszy (wersja pakietu systemu wprowadzania)

Strona zaktualizowana :
Data utworzenia strony :

Środowisko weryfikacji

Windows
  • Okna 11
Edytor Unity
  • 2020.3.25f1
Pakiet systemu wejściowego
  • 1.2.0

Wymagania wstępne dotyczące tej porady

Poniższe ustawienia zostały wcześniej wprowadzone jako przesłanka do opisu tej wskazówki.

Uzyskiwanie pozycji myszy

Pozycję myszy na ekranie gry można Mouse.position uzyskać w formacie . Tutaj chciałbym wyświetlić informacje o lokalizacji.

Umieszcza na kanwie obiekt tekstowy wyświetlający informacje o myszy.

Informacje o myszy są pobierane przez skrypty. W takim przypadku utworzymy plik skryptu o nazwie w projekcie MouseInfo .

Wprowadź skrypt w następujący sposób:

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.currentMożesz uzyskać informacje o aktualnie aktywnej myszy. Mouse.position ma bieżące położenie myszy w , dzięki czemu ReadValue można uzyskać wartość w formularzu za Vector2 pomocą Vector2Control metody.

Uzyskana pozycja myszy jest ustawiana na obiekt tekstowy. StringBuilder Nie przejmuj się zbytnio używaniem , ponieważ jest to dodawanie później.

Po EventSystem zapisaniu skryptu dołącz go do obiektu. Obiekt tekstowy jest ustawiony na obiekt tekstowy, o którym mają być wyświetlane informacje.

Spróbuj uruchomić grę i poruszyć myszą. Myślę, że pozycja myszy pojawi się na ekranie w czasie rzeczywistym.

Nawiasem mówiąc, współrzędne pozycji myszy znajdują się (0, 0) w lewym dolnym rogu ekranu gry. Oś X (lewa i prawa) staje się dodatnia, gdy idziesz w prawo, i ujemna, gdy idziesz w lewo. Oś Y (w górę iw dół) staje się dodatnia, gdy idziesz w górę i ujemna, gdy idziesz w dół. Dlatego maksymalna wartość każdej osi znajduje się w prawym górnym rogu ekranu gry.

Należy również pamiętać, że ta współrzędna dotyczy tylko przestrzeni ekranu gry, więc rozmiar pikseli w grze i rozmiar pikseli współrzędnych ekranu urządzenia mogą się nie zgadzać.

Uzyskiwanie ilości przewijania koła

Przewijanie za pomocą kółka myszy można również pobrać w skrypcie. Przewijaną ilość Mouse.scroll można uzyskać za pomocą . W przeciwieństwie do pozycji myszy, możesz tylko natychmiast przewinąć kwotę. Pamiętaj, że nie możesz sprawdzić odległości przewijania.

Dodam go do operacji przewijania, którą utworzyłem MouseInfo wcześniej.

// 省略

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 nie trzyma kwoty przewijanej do tej pory, więc Zdefiniuj dedykowane pole ScrollValue , w którym będzie przechowywana przewijana ilość.

Mouse.scroll Następnie możesz uzyskać zwojoną kwotę w tym momencie, więc zgromadzimy tę wartość. Na przykład, jeśli ScrollValue przewiniesz kółko dwukrotnie, liczba przewijanych dwukrotnie zostanie zachowana.

Reszta to wyświetlenie tej wartości jako tekstu.

Teraz uruchom grę i zakręć kołem. Myślę, że zobaczysz ilość przewijania.

Mouse.scrollVector2 ma wartość , ale jeśli jest to pionowe kółko przewijania, myślę, że tylko wartość Y zostanie ustawiona.

Nawiasem mówiąc, jeśli przewiniesz w dół, wartość wzrośnie iw dół w jednostkach 120. Jest to wartość zdefiniowana przez system Windows, więc liczba może się zmieniać w zależności od innych środowisk i typów myszy.

Określanie, kiedy przycisk myszy został kliknięty

Tutaj chciałbym przenieść próbkę, która wyświetla tekst w miejscu, w którym kliknięto lewym przyciskiem myszy. Czas kliknięcia może być określony przez właściwości w taki sam sposób, wasPressedThisFrame jak klawiatury.

Najpierw umieść obiekt tekstowy do przeniesienia. Rozmiar i pozycja są odpowiednie.

Utwórz skrypt dla procesu klikania. MouseButtonClick Pozostaw nazwę jako .

Skrypt wygląda tak:

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

Wykonuję proces przesuwania obiektu tekstowego do klikniętej pozycji. Lokalne położenie obiektu interfejsu użytkownika jest współrzędną obszaru roboczego, więc różni się od położenia myszy, które jest współrzędną ekranu.

Ponieważ początek płótna (0, 0) znajduje się w środku, użyj go,RectTransform.sizeDelta aby uzyskać połowę rozmiaru płótna. Początek współrzędnych myszy jest przesunięty do środka.

Możesz określić, czy mouse.xxxxxxxx.wasPressedThisFrame kliknąłeś, i zwrócić tylko true w momencie kliknięcia. Jeśli klikniesz i przytrzymasz przycisk, będzie on kontynuowany, dopóki nie klikniesz false go ponownie.

Po EventSystem zapisaniu skryptu dołącz go do programu . Tym razem również użyjemy Canvas, więc ustaw Canvas i obiekt tekstowy.

Spróbuj uruchomić grę i sprawdź, czy obiekt tekstowy zostanie przeniesiony do klikniętej lokalizacji. Ponieważ obiekt tekstowy przetwarza tylko moment kliknięcia, nie porusza się, nawet jeśli poruszysz myszą podczas klikania.

Określanie, kiedy zwalniasz przycisk myszy

Chociaż nie jest wymieniony jako przykład, można określić czas wydania, wasPressedThisFrame używając zamiast wasReleasedThisFrame .

Sędzia po kliknięciu przycisku

mouse.xxxxxxxx.isPressed , aby kontynuować powrót, dopóki true klikniesz przycisk. Tutaj chciałbym obrócić tekst, naciskając prawy przycisk.

Skrypt zostanie przekierowany z skryptu po kliknięciu lewym przyciskiem myszy. Zmodyfikuj go w następujący sposób:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Po zapisaniu skryptu uruchom go, aby go sprawdzić. Obiekt będzie się obracał tak długo, jak długo zostanie naciśnięty prawy przycisk.