Έλεγχος με 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 έχει left
up
down
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();
}
}
leftStick
rightStick
Μπορείτε να λάβετε τις πληροφορίες τύπου καλώντας τη 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
επισυνάψτε το και ορίστε ένα αντικείμενο κειμένου για εμφάνιση.
Δοκιμάστε να εκτελέσετε το παιχνίδι για να δείτε αν εμφανίζονται οι πληροφορίες.