Λειτουργία με joystick (συσκευασμένη έκδοση συστήματος εισόδου)

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

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

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

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

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

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

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

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

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

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

Σχετικά με τα χειριστήρια

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

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

Απόκτηση πληροφοριών Joystick

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

Δημιουργήστε ένα σενάριο. Το όνομα είναι αυθαίρετο, αλλά σε αυτή την περίπτωση JoystickInfo , είναι .

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

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

public class JoystickInfo : 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 joystick = Joystick.current;
    if (joystick == null)
    {
      Debug.Log("ジョイスティックがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ジョイスティックの情報取得
    Builder.AppendLine($"deviceId:{joystick.deviceId}");
    Builder.AppendLine($"name:{joystick.name}");
    Builder.AppendLine($"displayName:{joystick.displayName}");

    // ジョイスティックにはボタンの大部分が定義されていないので
    // 基本的には allControls で列挙して入力の種類と値を確認していく
    foreach (var key in joystick.allControls)
    {
      if (key is StickControl stick)
      {
        if (stick.up.isPressed) Builder.AppendLine($"{key.name} Up");
        if (stick.down.isPressed) Builder.AppendLine($"{key.name} Down");
        if (stick.left.isPressed) Builder.AppendLine($"{key.name} Left");
        if (stick.right.isPressed) Builder.AppendLine($"{key.name} Right");

        var value = stick.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
      }
      else if (key is Vector2Control vec2)
      {
        var value = vec2.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
        if (vec2.x.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.x.ReadValue()}");
        }
        if (vec2.y.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.y.ReadValue()}");
        }
      }
      else if (key is ButtonControl button)
      {
        if (button.isPressed) Builder.AppendLine($"{key.name} isPress");
        var value = button.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else if (key is AxisControl axis)
      {
        if (axis.IsPressed()) Builder.AppendLine($"{key.name} isPress");

        var value = axis.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else
      {
        Builder.AppendLine($"Type={key.GetType()}");
      }
    }

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

Μπορείτε να λάβετε πληροφορίες Joystick.current σχετικά με το συνδεδεμένο joystick στο . Joystick Μετά από αυτό, θα λάβουμε κάθε πληροφορία από την τάξη.

Joystick Όπως μπορείτε να δείτε από την τάξη, υπάρχουν ορισμοί όπως και , stick trigger αλλά δεν υπάρχουν ορισμοί όπως το κουμπί A ή το κουμπί έναρξης. Επομένως, θα πρέπει να χρησιμοποιήσετε τις Ιδιότητες για να απαριθμήσετε όλα τα κουμπιά,allControls τους μοχλούς και να μάθετε τον τύπο κουμπιού και τις πληροφορίες τύπου.

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

Δοκιμάστε να εκτελέσετε το παιχνίδι με ένα χειριστήριο που υποστηρίζει DirectInput. Κάθε πληροφορία μπορεί να ανακτηθεί.

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

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

Πώς να λάβετε πληροφορίες για πολλά χειριστήρια

Πληροφορίες σχετικά με Joystick.all όλα τα συνδεδεμένα χειριστήρια μπορείτε να λάβετε στο . ReadOnlyArray Μπορεί foreach να απαριθμηθεί και ούτω καθεξής.

Δεδομένου ότι κάθε τιμή είναι Joystick μια κλάση, μπορείτε να λάβετε πληροφορίες joystick όπως στο προηγούμενο πρόγραμμα.