Έλεγχος με Gamepad (Input System Package Version)

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

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

παράθυρα
  • Παράθυρα 11
Επεξεργαστής ενότητας
  • 2020.3.25στ1
Πακέτο συστήματος εισόδου
  • 1.2.0

Προϋποθέσεις για αυτήν τη συμβουλή

Οι ακόλουθες ρυθμίσεις έχουν γίνει εκ των προτέρων ως προϋπόθεση για την περιγραφή αυτής της συμβουλής.

Πληροφορίες για το XInput και το DirectInput

Αν και περιορίζεται στα Windows, υπάρχουν δύο μορφές σύνδεσης για ελεγκτές παιχνιδιών: DirectInput και XInput. Εδώ, το "Gamepad" αντιστοιχεί στο "XInput".

Αυτό Gamepad το πρόγραμμα ασχολείται με, αλλά αυτό μπορεί να χειριστεί μόνο ελεγκτές που υποστηρίζουν "XInput". Για να χρησιμοποιήσετε έναν ελεγκτή που υποστηρίζει DirectInput, πρέπει να χρησιμοποιήσετε διαφορετική Joystick κλάση.

Το "DirectInput" είναι μια παλιά μορφή σύνδεσης και ο ορισμός του κουμπιού είναι σχετικά διφορούμενος και μπορεί να χειριστεί ελεγκτές με ειδικά σχήματα. Ωστόσο, πρόσφατα, το "XInput" έχει γίνει mainstream, και ο αριθμός των ελεγκτών που δεν υποστηρίζουν το "DirectInput" αυξάνεται. Το "DirectInput" έχει ορισμούς κουμπιών όπως "1", "2" και "3", επομένως οι δημιουργοί παιχνιδιών πρέπει να δημιουργήσουν μια αντιστοιχία κουμπιών μεταξύ του παιχνιδιού και του χειριστηρίου, ώστε να μπορούν να ρυθμιστούν κατάλληλα.

Το XInput ορίζεται ως η επόμενη γενιά DirectInput και περιλαμβάνει προκαθορισμένα κουμπιά A και B, εναύσματα, ραβδιά κ.λπ. Επομένως, μπορεί να χρησιμοποιηθεί μόνο ένα σταθερό σχήμα του ελεγκτή, Δεδομένου ότι ο ορισμός των κουμπιών είναι καλά καθορισμένος, οι δημιουργοί παιχνιδιών μπορούν να δημιουργήσουν παιχνίδια που ταιριάζουν στο χειριστήριο χωρίς να ανησυχούν για την τοποθέτηση των κουμπιών. Οι πρόσφατοι ελεγκτές παιχνιδιών που υποστηρίζουν μόνο το "XInput" αυξάνονται.

Προσδιορίστε εάν πατάτε ένα κουμπί

Μπορείτε να καθορίσετε εάν ένα κουμπί θα πατηθεί ή όχι από τις ιδιότητες, καθώς xxxxxxxx.isPressed και από το πληκτρολόγιο και το ποντίκι. Εδώ, θα ήθελα να εμφανίσω τον τύπο του κουμπιού που πατάω στο κείμενο.

Πρώτα, τοποθετήστε ένα εμφανιζόμενο αντικείμενο κειμένου.

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

Το σενάριο μοιάζει με αυτό:

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class GamepadButtons : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  StringBuilder Builder = new StringBuilder();

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // 1つ目のゲームパッドの情報を取得
    var gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ボタンを押している間は xxxxxxxx.isPressed が true を返します

    // B ボタンや East ボタン、○ボタンは読み方が違うだけで同じボタンです
    // これは PlayStation や Xbox, Switch などでボタンの読み方が違うためです
    if (gamepad.aButton.isPressed) Builder.AppendLine($"A");
    if (gamepad.bButton.isPressed) Builder.AppendLine($"B");
    if (gamepad.xButton.isPressed) Builder.AppendLine($"X");
    if (gamepad.yButton.isPressed) Builder.AppendLine($"Y");

    if (gamepad.buttonEast.isPressed) Builder.AppendLine($"East");
    if (gamepad.buttonWest.isPressed) Builder.AppendLine($"West");
    if (gamepad.buttonNorth.isPressed) Builder.AppendLine($"North");
    if (gamepad.buttonSouth.isPressed) Builder.AppendLine($"South");

    if (gamepad.circleButton.isPressed) Builder.AppendLine($"Circle");
    if (gamepad.crossButton.isPressed) Builder.AppendLine($"Cross");
    if (gamepad.triangleButton.isPressed) Builder.AppendLine($"Triangle");
    if (gamepad.squareButton.isPressed) Builder.AppendLine($"Square");

    // コントローラーの中央にあるスタートボタン、セレクトボタン、メニューボタン、ビューボタンなどに該当します。
    if (gamepad.startButton.isPressed) Builder.AppendLine($"Start");
    if (gamepad.selectButton.isPressed) Builder.AppendLine($"Select");

    // 左と右のスティックをまっすぐ押し込んだかどうかを判定します
    if (gamepad.leftStickButton.isPressed) Builder.AppendLine($"LeftStickButton");
    if (gamepad.rightStickButton.isPressed) Builder.AppendLine($"RightStickButton");

    // 左上と右上にあるボタン。PlayStation だと L1 や R1 に該当します
    if (gamepad.leftShoulder.isPressed) Builder.AppendLine($"LeftShoulder");
    if (gamepad.rightShoulder.isPressed) Builder.AppendLine($"RightShoulder");

    // 押しているボタン一覧をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Αφού EventSystem αποθηκεύσετε τη δέσμη ενεργειών, επισυνάψτε την και ρυθμίστε τις παραμέτρους του αντικειμένου κειμένου εμφάνισης.

Δοκιμάστε να εκτελέσετε το παιχνίδι και δείτε αν κάθε κουμπί ανταποκρίνεται.

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

Xbox,PlayStation και πολλά άλλα
bΚουμπί circleΚουμπί κουμπίΑνατολή
αΚουμπί crossButton κουμπίΝότος
xΚουμπί τετράγωνοΚουμπί κουμπίΔύση
yButton τρίγωνοΚουμπί κουμπίΒορράς

Αυτό που μπορεί να κριθεί ως κουμπί έχει ως εξής.

  • Ένα κουμπί, × κουμπί, κάτω κουμπί
  • Κουμπί B, κουμπί ○, δεξί κουμπί
  • Κουμπί X, κουμπί □, αριστερό κουμπί
  • Κουμπί Y, κουμπί κάτω βέλους, κουμπί επάνω
  • Κουμπί "Έναρξη", κουμπί "Μενού"
  • Κουμπί επιλογής, κουμπί προβολής
  • Κουμπί αριστερού ώμου, κουμπί L1
  • Κουμπί δεξιού ώμου, κουμπί R1
  • Κουμπί αριστερού μοχλού
  • Κουμπί δεξιού μοχλού

Προσδιορίστε εάν το κουμπί έχει πατηθεί

Η κρίση τη στιγμή του τύπου μπορεί να καθοριστεί από τις ιδιότητες όπως και με το πληκτρολόγιο και xxxxxxxx.wasPressedThisFrame το ποντίκι. Επιστρέφει την τιμή της στιγμής true που πατιέται και επιστρέφει ακόμα και αν false πατηθεί και κρατηθεί στη συνέχεια.

Ας εμφανίσουμε το κουμπί πατημένο ως κείμενο ως έλεγχο λειτουργίας. Τοποθετήστε ένα αντικείμενο κειμένου για εμφάνιση.

Το όνομα αρχείου του σεναρίου μπορεί να είναι οτιδήποτε, αλλά εδώ GamepadButtonsOneFrame είναι .

Το σενάριο μοιάζει με αυτό: Για απλότητα, κρίνονται μόνο 4 κουμπιά.

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class GamepadButtonsOneFrame : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // 1つ目のゲームパッドの情報を取得
    var gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    // ボタンが押された瞬間かどうかを判定
    if (gamepad.aButton.wasPressedThisFrame) TextObject.text += "A";
    if (gamepad.bButton.wasPressedThisFrame) TextObject.text += "B";
    if (gamepad.xButton.wasPressedThisFrame) TextObject.text += "X";
    if (gamepad.yButton.wasPressedThisFrame) TextObject.text += "Y";
  }
}

Αφού EventSystem αποθηκεύσετε το σενάριο, επισυνάψτε το και ορίστε ένα αντικείμενο κειμένου για εμφάνιση.

Δοκιμάστε να εκτελέσετε το παιχνίδι και να πατήσετε το κουμπί. Νομίζω ότι το κουμπί που πατήσατε θα προστεθεί. Μπορείτε επίσης να δείτε ότι κρατώντας πατημένο το κουμπί δεν προστίθεται κείμενο.

Προσδιορίστε εάν τη στιγμή που απελευθερώνεται το κουμπί

Δεν υπάρχει δείγμα, αλλά μπορείτε να προσδιορίσετε αν είναι wasPressedThisFrame η στιγμή που το αποδεσμεύετε, χρησιμοποιώντας μια ιδιότητα αντί για wasReleasedThisFrame μια ιδιότητα.

Προσδιορίστε πότε πατάτε τα πλήκτρα βέλους

Καθορίζει το πάτημα του DPAD. Ανάλογα με την κονσόλα παιχνιδιών, θα πετάξει με τα πλήκτρα βέλους και το πληκτρολόγιο κατεύθυνσης, αλλά και τα δύο αντιμετωπίζονται ως ίδια. Το DPAD βασικά καθορίζει μόνο εάν πιέζετε προς αυτή την κατεύθυνση ή όχι. Δεν υπάρχει κρίση όπως το «σπρώχνοντας λίγο» σαν ραβδί.

Τοποθετεί ένα αντικείμενο κειμένου για να εμφανίσει μια απόφαση εάν θα πατηθεί ή όχι ως έλεγχος λειτουργίας.

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

Το σενάριο μοιάζει με αυτό:

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class GamepadDpad : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  StringBuilder Builder = new StringBuilder();

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // 1つ目のゲームパッドの情報を取得
    var gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // Dpad の押下情報を Vector2 として取得するパターン
    var value = gamepad.dpad.ReadValue();
    Builder.Append($"(x:{value.x}, y:{value.y})");

    // Dpad の各方向のボタンを押しているかどうかの判定
    if (gamepad.dpad.left.isPressed) Builder.Append(" left");
    if (gamepad.dpad.right.isPressed) Builder.Append(" right");
    if (gamepad.dpad.up.isPressed) Builder.Append(" up");
    if (gamepad.dpad.down.isPressed) Builder.Append(" down");

    // Dpad の情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Μπορείτε να λάβετε πληροφορίες Gamepad.dpad DPAD στο .

Το DPAD έχει leftupdown rightιδιότητες για κάθε κατεύθυνση και μπορείτε να προσδιορίσετε εάν πιέζεται ή όχι από την ιδιότητα κ.λπ. isPressed

DpadControl.ReadValue Μπορείτε επίσης να χρησιμοποιήσετε τη μέθοδο για να λάβετε την κατάσταση Vector2 του τύπου στο . Εάν δεν πατηθεί τίποτα (0, 0), εάν πατηθεί αριστερά (-1, 0) και ούτω καθεξής.

Αφού EventSystem αποθηκεύσετε το σενάριο, επισυνάψτε το και ορίστε ένα αντικείμενο κειμένου για εμφάνιση.

Δοκιμάστε να εκτελέσετε το παιχνίδι και να αλληλεπιδράσετε με το DPAD.

Vector2 Παρεμπιπτόντως, βρίσκεται σε κανονικοποιημένη κατάσταση, οπότε όταν πατάτε διαγώνια, λαμβάνεται ως αριθμός όπως (0,7071, 0,7071) αντί για (1, 1).

Προσδιορισμός πατημάτων σκανδάλης

Τα χειριστήρια Xbox έχουν κουμπιά που ονομάζονται σκανδάλες αριστερά και δεξιά. Στο PlayStation, αντιστοιχεί στο L2R2. Αυτό το κουμπί είναι διαφορετικό από ένα κανονικό κουμπί και μπορείτε να λάβετε το ποσό που πατάτε σε 0,0 ~ 1,0. Ορισμένοι άλλοι ελεγκτές είναι εξοπλισμένοι με ονόματα εκτός από σκανδάλες, αλλά σε παλαιότερους ελεγκτές κ.λπ., μπορούν απλώς να τοποθετηθούν ως κουμπιά, οπότε η κρίση του πατήματος αντιμετωπίζεται μόνο ως 0, 1.

Εδώ, θα ήθελα να ελέγξω την ποσότητα των πατημάτων σκανδάλης. Τοποθετεί ένα αντικείμενο κειμένου για εμφάνιση στον καμβά.

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

Το σενάριο μοιάζει με αυτό:

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class GamepadReadValue : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  StringBuilder Builder = new StringBuilder();

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // 1つ目のゲームパッドの情報を取得
    var gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // トリガーの押下量を取得
    Builder.AppendLine($"LeftTrigger:{gamepad.leftTrigger.ReadValue()}");
    Builder.AppendLine($"RightTrigger:{gamepad.rightTrigger.ReadValue()}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Gamepad Κάθε leftTriggerκλάση έχει μια ιδιότητα και rightTrigger ReadValue μπορείτε να πάρετε το ποσό των πιεστηρίων στην περιοχή 0,0 ~ 1,0 καλώντας τη μέθοδο. Οι σκανδάλες μπορούν επίσης να αντιμετωπιστούν ως κουμπιά, ώστε isPressed να μπορείτε επίσης να κρίνετε όπως. isPressed true Παρεμπιπτόντως, το ποσό του γίνεται ReadValue βασίζεται στο 0, 5.

Αφού αποθηκεύσετε το σενάριο, EventSystem επισυνάψτε το και ορίστε ένα αντικείμενο κειμένου για εμφάνιση.

Δοκιμάστε να εκτελέσετε το παιχνίδι και να μετακινήσετε τη σκανδάλη.

Προσδιορισμός πληροφοριών ραβδιού

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

Οι πληροφορίες ραβδιών μπορούν να ανακτηθούν με , Gamepad.rightStick αντίστοιχαGamepad.leftStick.

Για το σενάριο επιβεβαίωσης λειτουργίας, θα εκτρέψουμε το σενάριο που χρησιμοποιήθηκε νωρίτερα για να λάβουμε το έναυσμα.

// 省略

public class GamepadReadValue : MonoBehaviour
{
  // 省略

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

    // トリガーの押下量を取得
    Builder.AppendLine($"LeftTrigger:{gamepad.leftTrigger.ReadValue()}");
    Builder.AppendLine($"RightTrigger:{gamepad.rightTrigger.ReadValue()}");

    // スティックの入力を取得
    var leftStickValue = gamepad.leftStick.ReadValue();
    Builder.AppendLine($"LeftStick:{leftStickValue.normalized * leftStickValue.magnitude}");
    var rightStickValue = gamepad.rightStick.ReadValue();
    Builder.AppendLine($"RightStick:{rightStickValue.normalized * rightStickValue.magnitude}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

leftStickrightStick Μπορείτε να λάβετε τις πληροφορίες τύπου καλώντας τη Vector2 μέθοδο από ReadValue ή . Vector2 Έτσι μπορείτε να πάρετε πόσο x y πιέζετε τον άξονα X και τον άξονα Y από και ιδιότητες, Εάν θέλετε να πάρετε την κατεύθυνση που πιέζετε, μπορείτε να το πάρετε στο ακίνητο και αν θέλετε magnitude να πάρετε το ποσό που πιέζετε, μπορείτε normalized να το πάρετε στο ακίνητο.

Προσπαθήστε πραγματικά να μετακινήσετε το παιχνίδι και να χειριστείτε το ραβδί.

Λήψη πληροφοριών gamepad

Μπορείτε να λάβετε το αναγνωριστικό, το όνομα κ.λπ. από το συνδεδεμένο gamepad. Για παράδειγμα, ανατρέξτε στο για να προσδιορίσετε name τον τύπο του ελεγκτή που είναι συνδεδεμένος ή Μπορείτε να ανατρέξετε σε ποιο deviceId gamepad θα συσχετίσετε όταν είναι συνδεδεμένα πολλά gamepad.

Εδώ, θα εμφανίσουμε τις πληροφορίες στο κείμενο για να ελέγξουμε τη λειτουργία.

Το όνομα του σεναρίου είναι αυθαίρετο, αλλά εδώ GamepadInfo είναι .

Το σενάριο μοιάζει με αυτό:

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class GamepadInfo : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  StringBuilder Builder = new StringBuilder();

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // 1つ目のゲームパッドの情報を取得
    var gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ゲームパッドの各情報を取得
    Builder.AppendLine($"deviceId:{gamepad.deviceId}");
    Builder.AppendLine($"name:{gamepad.name}");
    Builder.AppendLine($"displayName:{gamepad.displayName}");
    Builder.AppendLine($"shortDisplayName:{gamepad.shortDisplayName}");
    Builder.AppendLine($"path:{gamepad.path}");
    Builder.AppendLine($"layout:{gamepad.layout}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Gamepad Μπορείτε να λάβετε διάφορες πληροφορίες από το ανακτημένο . Εδώ είναι μερικά αποσπάσματα.

Αφού αποθηκεύσετε το σενάριο, EventSystem επισυνάψτε το και ορίστε ένα αντικείμενο κειμένου για εμφάνιση.

Δοκιμάστε να εκτελέσετε το παιχνίδι για να δείτε αν εμφανίζονται οι πληροφορίες.