Steuerung mit einem Gamepad (Input System Package Version)
Verifizierungsumgebung
- Fenster
-
- Windows 11
- Unity-Editor
-
- 2020.3.25f1
- Eingabesystem-Paket
-
- 1.2.0
Voraussetzungen für diesen Tipp
Die folgenden Einstellungen wurden im Vorfeld als Prämisse für die Beschreibung dieses Tipps vorgenommen.
Informationen zu XInput und DirectInput
Obwohl es auf Windows beschränkt ist, gibt es zwei Verbindungsformate für Gamecontroller: DirectInput und XInput. Hier entspricht "Gamepad" "XInput".
Dieses Gamepad
Programm befasst sich mit Klassen, kann aber nur mit Controllern umgehen, die "XInput" unterstützen.
Um einen Controller zu verwenden, der DirectInput unterstützt, müssen Sie eine andere Joystick
Klasse verwenden.
"DirectInput" ist ein altes Verbindungsformat und die Definition der Schaltfläche ist relativ mehrdeutig, und es kann Controller mit speziellen Formen verarbeiten. In letzter Zeit ist "XInput" jedoch zum Mainstream geworden, und die Anzahl der Controller, die "DirectInput" nicht unterstützen, nimmt zu. "DirectInput" verfügt über Tastendefinitionen wie "1", "2" und "3", sodass Spieleentwickler eine Tastenentsprechung zwischen dem Spiel und dem Controller erstellen müssen, damit sie entsprechend festgelegt werden können.
XInput ist als die nächste Generation von DirectInput definiert und enthält vordefinierte A- und B-Tasten, Trigger, Sticks usw. Daher kann nur eine feste Form des Reglers verwendet werden, Da die Definition von Tasten gut definiert ist, können Spieleentwickler Spiele erstellen, die zum Controller passen, ohne sich Gedanken über die Platzierung der Tasten machen zu müssen. Neuere Gamecontroller, die nur "XInput" unterstützen, nehmen zu.
Feststellen, ob eine Taste gedrückt wird
Ob eine Taste gedrückt wird oder nicht, können Sie sowohl über Eigenschaften als auch xxxxxxxx.isPressed
über Tastatur und Maus bestimmen.
Hier möchte ich die Art der Schaltfläche, die ich drücke, im Text anzeigen.
Platzieren Sie zunächst ein Anzeigetextobjekt.
Erstellen Sie ein Skript für das Urteil. Der Dateiname ist willkürlich, aber hier GamepadButtons
ist er .
Das Skript sieht wie folgt aus:
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();
}
}
Nachdem EventSystem
Sie das Skript gespeichert haben, fügen Sie es an das Anzeigetextobjekt an und konfigurieren Sie es.
Versuchen Sie, das Spiel auszuführen, und prüfen Sie, ob jede Taste reagiert.
Die folgenden Schaltflächen sind übrigens als dieselbe Schaltfläche definiert, obwohl mehrere Schaltflächen vorbereitet sind, da sie je nach Spielkonsole unterschiedlich gelesen werden. In jedem der oben genannten Programme ist ein Beurteilungsprozess enthalten, sodass beim Drücken der Taste drei Tasten angezeigt werden.
Xbox, | PlayStation | und mehr |
---|---|---|
bKnopf | circleButton | buttonEast |
aKnopf | crossButton | buttonSüd |
xButton | squareButton | buttonWest |
yButton | triangleButton | buttonNorth |
Was als Knopf beurteilt werden kann, ist wie folgt.
- Eine Taste, × Taste, eine Abwärtstaste
- B-Taste, ○-Taste, rechte Taste
- X-Taste, □-Taste, Linke Taste
- Y-Taste, Pfeil-nach-unten-Taste, Aufwärts-Taste
- Start-Taste, Menü-Taste
- Schaltfläche auswählen, Schaltfläche anzeigen
- Linke Schultertaste, L1-Taste
- Rechte Schultertaste, R1-Taste
- Linke Stick-Taste
- Rechte Stick-Taste
Stellen Sie fest, ob die Taste gedrückt ist
Das Urteil im Moment des Drückens kann wie bei xxxxxxxx.wasPressedThisFrame
Tastatur und Maus durch die Eigenschaften bestimmt werden.
Gibt den Wert des Moments true
zurück, in dem es gedrückt wird, und gibt es auch dann zurück, wenn false
es danach gedrückt und gehalten wird.
Lassen Sie uns die gedrückte Schaltfläche als Text als Operationsprüfung anzeigen. Platzieren Sie ein Textobjekt für die Anzeige.
Der Dateiname des Skripts kann beliebig sein, aber hier GamepadButtonsOneFrame
ist er .
Das Skript sieht wie folgt aus: Der Einfachheit halber werden nur 4 Tasten bewertet.
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";
}
}
Nachdem EventSystem
Sie das Skript gespeichert haben, hängen Sie es an ein Textobjekt für die Anzeige an, und legen Sie es fest.
Versuchen Sie, das Spiel zu starten und die Taste zu drücken. Ich denke, der Knopf, den Sie gedrückt haben, wird hinzugefügt. Sie können auch sehen, dass durch Gedrückthalten der Taste kein Text hinzugefügt wird.
Bestimmen Sie, ob der Moment, in dem die Taste losgelassen wird,
Es gibt kein Beispiel, aber Sie können feststellen, ob es der Moment ist wasPressedThisFrame
, in dem Sie es freigeben, indem Sie eine Eigenschaft anstelle einer wasReleasedThisFrame
Eigenschaft verwenden.
Bestimmen Sie, wann Sie die Pfeiltasten drücken
Bestimmt die Presse des DPAD. Je nach Spielkonsole fliegt es mit den Pfeiltasten und dem D-Pad, aber beide werden als gleich behandelt. Der DPAD bestimmt im Grunde nur, ob Sie in diese Richtung drängen oder nicht. Es gibt kein Urteil wie "ein wenig schieben" wie ein Stock.
Platziert ein Textobjekt, um eine Entscheidung anzuzeigen, ob es gedrückt wird oder nicht, als Vorgangsprüfung.
Erstellen Sie ein Skript. Der Dateiname ist willkürlich, aber hier GamepadDpad
ist er .
Das Skript sieht wie folgt aus:
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();
}
}
DPAD-Informationen Gamepad.dpad
erhalten Sie unter .
DPAD hat left
up
down
right
Eigenschaften für jede Richtung, und Sie können bestimmen, ob sie von der Eigenschaft usw. gedrückt wird oder nicht. isPressed
DpadControl.ReadValue
Sie können die Methode auch verwenden, um den Status Vector2
der Presse in . Wenn nichts gedrückt wird (0, 0), wenn links gedrückt wird (-1, 0) und so weiter.
Nachdem EventSystem
Sie das Skript gespeichert haben, hängen Sie es an ein Textobjekt für die Anzeige an, und legen Sie es fest.
Versuchen Sie, das Spiel auszuführen und mit dem DPAD zu interagieren.
Vector2
Übrigens befindet es sich in einem normalisierten Zustand, d. h. wenn Sie diagonal drücken, wird es als Zahl wie (0,7071, 0,7071) anstelle von (1, 1) erhalten.
Bestimmen von Abzugsdrücken
Xbox-Controller haben links und rechts Tasten, die als Trigger bezeichnet werden. Auf der PlayStation entspricht es L2R2. Diese Taste unterscheidet sich von einer normalen Taste, und Sie können den Betrag, den Sie drücken, in 0,0 ~ 1,0 erhalten. Einige andere Controller sind mit anderen Namen als Triggern ausgestattet, aber in älteren Controllern usw. können sie einfach als Tasten platziert werden, in diesem Fall wird das Urteil des Drückens nur als 0, 1 behandelt.
Hier möchte ich die Anzahl der Abzugsdrücke überprüfen. Platziert ein Textobjekt für die Anzeige im Canvas-Bereich.
Erstellen Sie ein Skript. Da es an anderer Stelle verwendet wird, werden wir es hier GamepadReadValue
benennen .
Das Skript sieht wie folgt aus:
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
Jede leftTrigger
Klasse hat eine Eigenschaft, und Sie können die Anzahl der Pressvorgänge im Bereich von 0,0 ~ 1,0 rightTrigger
ReadValue
abrufen, indem Sie die Methode aufrufen.
Auslöser können auch als Schaltflächen behandelt werden, sodass isPressed
Sie auch beurteilen können, wie z.
isPressed
true
Die Anzahl der Becomes ReadValue
basiert übrigens auf 0,5.
Nachdem Sie das Skript gespeichert haben, hängen Sie EventSystem
es an ein Textobjekt für die Anzeige an, und legen Sie es fest.
Versuchen Sie, das Spiel auszuführen und den Auslöser zu bewegen.
Stick-Informationen ermitteln
Der Stick kann die Informationen des linken Sticks bzw. des rechten Sticks abrufen, und Sie können den Betrag erhalten, um den der Stick in welche Richtung nach unten gedrückt wird. Wenn Sie keinen Stick auf Ihrem Controller haben, können Sie diese Informationen natürlich nicht abrufen.
Stick-Informationen können mit bzw Gamepad.leftStick
. abgerufen Gamepad.rightStick
werden.
Für das Vorgangsbestätigungsskript leiten wir das zuvor verwendete Skript um, um den Trigger abzurufen.
// 省略
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
Sie können die Presseinformationen abrufen, indem Sie die Vector2
Methode von ReadValue
oder aufrufen.
Vector2
So können Sie ermitteln, wie viel Sie auf der X-Achse und der Y-Achse drücken, x
y
indem Sie Eigenschaften
Wenn Sie die Richtung erhalten möchten, in die Sie drücken, können Sie sie in der Eigenschaft erhalten, und wenn Sie die Menge erhalten möchten, die Sie drücken, können Sie magnitude
normalized
sie in der Eigenschaft erhalten.
Versuchen Sie, das Spiel tatsächlich zu bewegen und den Stick zu bedienen.
Gamepad-Informationen abrufen
Sie können die ID, den Namen usw. vom angeschlossenen Gamepad abrufen.
Siehe z. B. zu, um den Typ des angeschlossenen Controllers zu identifizieren name
, oder
Sie können sich darauf beziehen, mit welchem Gamepad eine Verbindung hergestellt werden soll, deviceId
wenn mehrere Gamepads angeschlossen sind.
Hier zeigen wir die Informationen im Text an, um den Vorgang zu überprüfen.
Der Skriptname ist willkürlich, aber hier GamepadInfo
ist er .
Das Skript sieht wie folgt aus:
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
Sie können verschiedene Informationen aus der abgerufenen . Hier einige Auszüge.
Nachdem Sie das Skript gespeichert haben, hängen Sie EventSystem
es an ein Textobjekt für die Anzeige an, und legen Sie es fest.
Versuchen Sie, das Spiel auszuführen, um zu sehen, ob die Informationen angezeigt werden.