Controllo con un gamepad (versione del pacchetto del sistema di input)
Ambiente di verifica
- Finestre
-
- Windows 11
- Unity Editor
-
- 2020.3.25F1
- Pacchetto del sistema di input
-
- 1.2.0
Prerequisiti per questo suggerimento
Le seguenti impostazioni sono state effettuate in anticipo come premessa per la descrizione di questo suggerimento.
Informazioni su XInput e DirectInput
Sebbene sia limitato a Windows, esistono due formati di connessione per i controller di gioco: DirectInput e XInput. Qui, "Gamepad" corrisponde a "XInput".
Questo Gamepad
programma si occupa di classi, ma può gestire solo controller che supportano "XInput".
Per utilizzare un controller che supporta DirectInput, è necessario utilizzare una classe diversa Joystick
.
"DirectInput" è un vecchio formato di connessione e la definizione del pulsante è relativamente ambigua e può gestire controller con forme speciali. Tuttavia, di recente, "XInput" è diventato mainstream e il numero di controller che non supportano "DirectInput" è in aumento. "DirectInput" ha definizioni di pulsanti come "1", "2" e "3", quindi i creatori di giochi devono creare una corrispondenza di pulsanti tra il gioco e il controller in modo che possano essere impostati in modo appropriato.
XInput è definito come la prossima generazione di DirectInput e include pulsanti A e B predefiniti, trigger, stick, ecc. Pertanto, è possibile utilizzare solo una forma fissa del controller, Poiché la definizione dei pulsanti è ben definita, i creatori di giochi possono creare giochi adatti al controller senza preoccuparsi del posizionamento dei pulsanti. I controller di gioco recenti che supportano solo "XInput" sono in aumento.
Determinare se viene premuto un pulsante
È possibile determinare se un pulsante viene premuto o meno dalle proprietà, nonché xxxxxxxx.isPressed
dalla tastiera e dal mouse.
Qui, vorrei visualizzare il tipo di pulsante che sto premendo nel testo.
Innanzitutto, posizionate un oggetto di testo di visualizzazione.
Creare uno script per il verdetto. Il nome del file è arbitrario, ma eccolo qui GamepadButtons
.
Lo script è simile al seguente:
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();
}
}
Dopo EventSystem
aver salvato lo script, collegarlo e configurare l'oggetto di testo visualizzato.
Prova a eseguire il gioco e verifica se ogni pulsante risponde.
A proposito, i seguenti pulsanti sono definiti come lo stesso pulsante, sebbene vengano preparati più pulsanti perché vengono letti in modo diverso a seconda della console di gioco. In ciascuno dei programmi di cui sopra, è incluso un processo di giudizio, quindi quando si preme il pulsante, vengono visualizzati tre pulsanti.
Xbox | PlayStation | e altro ancora |
---|---|---|
bButton | circleButton | buttonEast |
aButton | crossButton | buttonSouth |
xButton | squareButton | buttonWest |
yButton | triangoloPulsante | buttonNorth |
Ciò che può essere giudicato come un pulsante è il seguente.
- Un pulsante, × pulsante, giù
- Pulsante B, pulsante ○, pulsante destro
- Pulsante X, pulsante □, pulsante sinistro
- Pulsante Y, pulsante freccia giù, pulsante su
- Pulsante Start, pulsante Menu
- Seleziona pulsante, pulsante Visualizza
- Pulsante spalla sinistra, pulsante L1
- Pulsante spalla destra, pulsante R1
- Pulsante della levetta sinistra
- Pulsante della levetta destra
Determinare se il pulsante viene premuto
Il giudizio al momento della pressione può essere determinato dalle proprietà come con xxxxxxxx.wasPressedThisFrame
la tastiera e il mouse.
Restituisce il valore del momento true
in cui viene premuto e restituisce anche se false
viene premuto e tenuto premuto successivamente.
Visualizziamo il pulsante premuto come testo come controllo delle operazioni. Posizionare un oggetto di testo per la visualizzazione.
Il nome del file dello script può essere qualsiasi cosa, ma eccolo qui GamepadButtonsOneFrame
.
Lo script è simile al seguente: Per semplicità, vengono giudicati solo 4 pulsanti.
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";
}
}
Dopo EventSystem
aver salvato lo script, allegarlo e impostare un oggetto di testo per la visualizzazione.
Prova a eseguire il gioco e a premere il pulsante. Penso che il pulsante che hai premuto verrà aggiunto. Puoi anche vedere che tenendo premuto il pulsante non viene aggiunto alcun testo.
Determinare se il momento in cui il pulsante viene rilasciato
Non esiste un esempio, ma è possibile determinare se è wasPressedThisFrame
il momento in cui lo si rilascia utilizzando una proprietà anziché wasReleasedThisFrame
una proprietà.
Determinare quando si premono i tasti freccia
Determina la pressione del DPAD. A seconda della console di gioco, volerà con i tasti freccia e la croce direzionale, ma entrambi sono trattati allo stesso modo. Il DPAD determina fondamentalmente solo se stai spingendo in quella direzione o meno. Non c'è giudizio come "spingere un po'" come un bastone.
Inserisce un oggetto di testo per visualizzare una decisione se premerlo o meno come controllo dell'operazione.
Creare uno script. Il nome del file è arbitrario, ma eccolo qui GamepadDpad
.
Lo script è simile al seguente:
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();
}
}
È possibile ottenere informazioni Gamepad.dpad
su DPAD all'indirizzo .
DPAD ha left
up
down
right
proprietà per ogni direzione ed è possibile determinare se viene premuto o meno dalla proprietà e così via. isPressed
DpadControl.ReadValue
È inoltre possibile utilizzare il metodo per ottenere lo stato Vector2
della stampa in . Se non viene premuto nulla (0, 0), se viene premuto a sinistra (-1, 0) e così via.
Dopo EventSystem
aver salvato lo script, allegarlo e impostare un oggetto di testo per la visualizzazione.
Prova a eseguire il gioco e a interagire con il DPAD.
Vector2
A proposito, è in uno stato normalizzato, quindi quando si preme diagonalmente, si ottiene come un numero come (0,7071, 0,7071) invece di (1, 1).
Determinare le pressioni del grilletto
I controller Xbox hanno pulsanti chiamati trigger a sinistra e a destra. Su PlayStation, corrisponde a L2R2. Questo pulsante è diverso da un pulsante normale e puoi ottenere la quantità che stai premendo in 0.0 ~ 1.0. Alcuni altri controller sono dotati di nomi diversi dai trigger, ma nei controller più vecchi, ecc., Possono essere semplicemente posizionati come pulsanti, nel qual caso il giudizio di pressione viene gestito solo come 0, 1.
Qui, vorrei controllare la quantità di pressioni del grilletto. Inserisce un oggetto di testo per la visualizzazione nell'area di disegno.
Creare uno script. Dal momento che sarà usato altrove, lo chiameremo qui GamepadReadValue
.
Lo script è simile al seguente:
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
Ogni leftTrigger
classe ha una proprietà ed rightTrigger
ReadValue
è possibile ottenere la quantità di presse nell'intervallo 0,0 ~ 1,0 chiamando il metodo.
I trigger possono anche essere trattati come pulsanti, quindi isPressed
puoi anche giudicare come.
isPressed
true
A proposito, la quantità di diventa ReadValue
si basa su 0, 5.
Dopo aver salvato lo script, EventSystem
allegarlo e impostare un oggetto di testo per la visualizzazione.
Prova a eseguire il gioco e a spostare il grilletto.
Determinare le informazioni sul bastone
Il bastone può ottenere le informazioni rispettivamente della levetta sinistra e della levetta destra e puoi ottenere la quantità di quanto il bastone viene spinto verso il basso in quale direzione. Naturalmente, se non si dispone di una chiavetta sul controller, non sarà possibile ottenere queste informazioni.
Le informazioni stick possono essere recuperate rispettivamente con , Gamepad.rightStick
.Gamepad.leftStick
Per lo script di conferma dell'operazione, devieremo lo script utilizzato in precedenza per ottenere il trigger.
// 省略
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
È possibile ottenere le informazioni stampa chiamando il Vector2
metodo da ReadValue
o .
Vector2
Quindi puoi ottenere quanto x
y
stai premendo sull'asse X e sull'asse Y da e proprietà,
Se vuoi ottenere la direzione che stai premendo, puoi ottenerlo nella proprietà, e se vuoi magnitude
ottenere la quantità che stai premendo, puoi normalized
ottenerlo nella proprietà.
Prova a muovere effettivamente il gioco e azionare il bastone.
Ottieni informazioni sul gamepad
È possibile ottenere l'ID, il nome, ecc. dal gamepad collegato.
Ad esempio, fare riferimento a per identificare name
il tipo di controller connesso, oppure
È possibile fare riferimento a quale deviceId
gamepad associare quando sono collegati più gamepad.
Qui, mostreremo le informazioni nel testo per verificare l'operazione.
Il nome dello script è arbitrario, ma eccolo qui GamepadInfo
.
Lo script è simile al seguente:
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
È possibile ottenere varie informazioni dal file . Ecco alcuni estratti.
Dopo aver salvato lo script, EventSystem
allegarlo e impostare un oggetto di testo per la visualizzazione.
Prova a eseguire il gioco per vedere se vengono visualizzate le informazioni.