Λειτουργία με το ποντίκι (Input System Package Version)

Σελίδα ενημέρωση :
Ημερομηνία δημιουργίας σελίδας :

Περιβάλλον επαλήθευσης

παράθυρα
  • Παράθυρα 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 (αριστερά και δεξιά) γίνεται θετικός καθώς πηγαίνετε προς τα δεξιά και αρνητικός καθώς πηγαίνετε προς τα αριστερά. Ο άξονας Υ (πάνω και κάτω) γίνεται θετικός καθώς ανεβαίνετε και αρνητικός καθώς κατεβαίνετε. Επομένως, η μέγιστη τιμή κάθε άξονα βρίσκεται στην επάνω δεξιά γωνία της οθόνης του παιχνιδιού.

Επίσης, λάβετε υπόψη ότι αυτή η συντεταγμένη είναι μόνο για τον χώρο της οθόνης του παιχνιδιού, επομένως το μέγεθος pixel στο παιχνίδι και το μέγεθος pixel των συντεταγμένων οθόνης της συσκευής ενδέχεται να μην ταιριάζουν.

Λάβετε την ποσότητα κύλισης του τροχού

Η κύλιση με τον τροχό του ποντικιού μπορεί επίσης να ανακτηθεί στο σενάριο. Το ποσό 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 αποθηκεύσετε τη δέσμη ενεργειών, επισυνάψτε την στο . Αυτή τη φορά, θα χρησιμοποιήσουμε επίσης καμβά, οπότε ορίστε τον καμβά και το αντικείμενο κειμένου.

Δοκιμάστε να εκτελέσετε το παιχνίδι και δείτε αν το αντικείμενο κειμένου μετακινείται στη θέση στην οποία κάνατε κλικ. Δεδομένου ότι επεξεργάζεται μόνο τη στιγμή που γίνεται κλικ, το αντικείμενο κειμένου δεν μετακινείται ακόμα κι αν μετακινήσετε το ποντίκι ενώ κάνετε κλικ.

Προσδιορίστε πότε αφήνετε το κουμπί του ποντικιού

Παρόλο που δεν παρατίθεται ως δείγμα, wasPressedThisFrame μπορείτε να προσδιορίσετε το χρόνο απελευθέρωσης χρησιμοποιώντας αντί για wasReleasedThisFrame .

Κρίνετε ενώ κάνετε κλικ στο κουμπί

mouse.xxxxxxxx.isPressed για να συνεχίσετε να επιστρέφετε αρκεί true να κάνετε κλικ στο κουμπί. Εδώ, θα ήθελα να περιστρέψω το κείμενο πατώντας το δεξί κουμπί.

Το σενάριο εκτρέπεται από το αριστερό κλικ. Τροποποιήστε το ως εξής:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

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

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

Αφού αποθηκεύσετε το σενάριο, εκτελέστε το για να το ελέγξετε. Το αντικείμενο συνεχίζει να περιστρέφεται όσο πατάτε το δεξί κουμπί.