Ovládanie pomocou gamepadu (verzia vstupného systémového balíka)
Prostredie overovania
- Windows
-
- Windows 11
- Editor jednoty
-
- 2020.3.25f1
- Vstupný systémový balík
-
- 1.2.0
Predpoklady pre tento tip
Nasledujúce nastavenia boli vykonané vopred ako predpoklad pre popis tohto tipu.
O spoločnosti XInput a DirectInput
Hoci je obmedzený na Windows, existujú dva formáty pripojenia pre herné ovládače: DirectInput a XInput. Tu "Gamepad" zodpovedá "XInput".
Tento Gamepad
program sa zaoberá triedami, ale to dokáže zvládnuť iba ovládače, ktoré podporujú "XInput".
Ak chcete použiť ovládač, ktorý podporuje DirectInput, musíte použiť inú Joystick
triedu.
"DirectInput" je starý formát pripojenia a definícia tlačidla je pomerne nejednoznačná a dokáže zvládnuť ovládače so špeciálnymi tvarmi. V poslednej dobe sa však "XInput" stal hlavným prúdom a počet ovládačov, ktoré nepodporujú "DirectInput", sa zvyšuje. "DirectInput" má definície tlačidiel, ako napríklad "1", "2" a "3", takže tvorcovia hier musia vytvoriť korešpondenciu tlačidiel medzi hrou a ovládačom, aby ich bolo možné správne nastaviť.
XInput je definovaný ako ďalšia generácia DirectInput a obsahuje preddefinované tlačidlá A a B, spúšte, páčky atď. Preto je možné použiť iba pevný tvar regulátora, Keďže definícia tlačidiel je dobre definovaná, tvorcovia hier môžu vytvárať hry, ktoré vyhovujú ovládaču, bez obáv z umiestnenia tlačidiel. Nedávnych herných ovládačov, ktoré podporujú iba "XInput", pribúda.
Ako zistiť, či sa stláča tlačidlo
To, či je tlačidlo stlačené alebo nie, môžete určiť podľa vlastností, ako xxxxxxxx.isPressed
aj klávesnice a myši.
Tu by som chcel v texte zobraziť typ tlačidla, ktoré stláčam.
Najprv umiestnite objekt zobrazeného textu.
Vytvorte skript verdiktu. Názov súboru je ľubovoľný, ale tu GamepadButtons
je .
Skript vyzerá takto:
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();
}
}
Po EventSystem
uložení skriptu ho priložte k objektu zobrazovaného textu a nakonfigurujte ho.
Skúste spustiť hru a zistite, či každé tlačidlo reaguje.
Mimochodom, nasledujúce tlačidlá sú definované ako rovnaké tlačidlo, aj keď je pripravených viac tlačidiel, pretože sa čítajú odlišne v závislosti od hernej konzoly. V každom z vyššie uvedených programov je zahrnutý proces posudzovania, takže po stlačení tlačidla sa zobrazia tri tlačidlá.
Xbox | , PlayStation | a ďalšie |
---|---|---|
bButton | kruhButton | tlačidloVýchod |
aButton | crossButton | tlačidloJuh |
xButton | squareButton | tlačidloZápad |
yButton | trojuholníkTlačidlo | tlačidloSever |
Čo možno posúdiť ako tlačidlo, je nasledovné.
- Tlačidlo, tlačidlo ×, tlačidlo nadol
- Tlačidlo B, tlačidlo ○, pravé tlačidlo
- Tlačidlo X, tlačidlo □, ľavé tlačidlo
- Tlačidlo Y, tlačidlo so šípkou nadol, tlačidlo nahor
- Tlačidlo Štart, tlačidlo Ponuka
- Vybrať tlačidlo, Zobraziť tlačidlo
- Ľavé ramenné tlačidlo, tlačidlo L1
- Pravé ramenné tlačidlo, tlačidlo R1
- Tlačidlo ľavej páčky
- Pravé tlačidlo páčky
Ako zistiť, či je tlačidlo stlačené
Úsudok v okamihu stlačenia môže byť určený vlastnosťami ako pri xxxxxxxx.wasPressedThisFrame
klávesnici a myši.
Vráti hodnotu okamihu true
stlačenia a vráti sa aj v prípade, že false
je stlačený a podržaný neskôr.
Tlačidlo stlačené ako text zobrazme ako kontrolu operácie. Umiestnenie textového objektu na zobrazenie.
Názov súboru skriptu môže byť čokoľvek, ale tu GamepadButtonsOneFrame
je .
Skript vyzerá takto: Pre jednoduchosť sa posudzujú iba 4 tlačidlá.
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";
}
}
Po EventSystem
uložení skriptu ho pripojte a nastavte textový objekt na zobrazenie.
Skúste spustiť hru a stlačiť tlačidlo. Myslím, že tlačidlo, ktoré ste stlačili, bude pridané. Môžete tiež vidieť, že podržaním tlačidla sa nepridá žiadny text.
Ako zistiť, či nastal okamih uvoľnenia tlačidla
Neexistuje žiadna vzorka, ale môžete určiť, či je wasPressedThisFrame
to okamih, keď ju uvoľníte, použitím vlastnosti namiesto wasReleasedThisFrame
vlastnosti.
Určenie stlačenia klávesov so šípkami
Určuje lis DPAD. V závislosti od hernej konzoly bude lietať so šípkami a smerovým ovládačom, ale s oboma sa zaobchádza rovnako. DPAD v podstate určuje iba to, či tlačíte týmto smerom alebo nie. Neexistuje úsudok ako "trochu tlačiť" ako palica.
Umiestni textový objekt na zobrazenie rozhodnutia, či sa stlačí alebo nie, ako kontrola operácie.
Vytvorte skript. Názov súboru je ľubovoľný, ale tu GamepadDpad
je .
Skript vyzerá takto:
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();
}
}
Informácie Gamepad.dpad
o DPAD môžete získať na adrese .
DPAD má left
up
down
right
vlastnosti pre každý smer a môžete určiť, či je stlačený vlastnosťou alebo nie atď. isPressed
DpadControl.ReadValue
Môžete tiež použiť metódu na zistenie stavu Vector2
tlače v . Ak nie je nič stlačené (0, 0), ak je stlačený ľavý (-1, 0) atď.
Po EventSystem
uložení skriptu ho pripojte a nastavte textový objekt na zobrazenie.
Skúste spustiť hru a komunikovať s DPAD.
Vector2
Mimochodom, je v normalizovanom stave, takže keď stlačíte diagonálne, získa sa ako číslo ako (0, 7071, 0, 7071) namiesto (1, 1).
Určite stlačenia spúšte
Ovládače pre Xbox majú vľavo a vpravo tlačidlá nazývané spúšťače. Na PlayStation zodpovedá L2R2. Toto tlačidlo sa líši od bežného tlačidla a sumu, ktorú stláčate, môžete získať v 0.0 ~ 1.0. Niektoré ďalšie ovládače sú vybavené inými názvami ako spúšťače, ale v starších ovládačoch atď. môžu byť jednoducho umiestnené ako tlačidlá, v takom prípade sa úsudok o stlačení spracováva iba ako 0, 1.
Tu by som chcel skontrolovať množstvo stlačení spúšte. Umiestni textový objekt na zobrazenie na plátne.
Vytvorte skript. Keďže sa bude používať inde, pomenujeme ho tu GamepadReadValue
.
Skript vyzerá takto:
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
Každá leftTrigger
trieda má vlastnosť a rightTrigger
ReadValue
počet lisov v rozsahu 0.0~1.0 môžete získať volaním metódy.
Spúšťače môžu byť tiež považované za tlačidlá, takže isPressed
môžete tiež posúdiť, ako napríklad.
isPressed
true
Mimochodom, množstvo sa stáva ReadValue
na základe 0, 5.
Po uložení skriptu EventSystem
ho pripojte a nastavte textový objekt na zobrazenie.
Skúste spustiť hru a posunúť spúšť.
Určenie informácií o páčke
Páčka môže získať informácie o ľavej a pravej páčke a môžete získať množstvo, o koľko je palica tlačená dole v ktorom smere. Samozrejme, ak na ovládači nemáte páčku, tieto informácie nebudete môcť získať.
Informácie o palici je možné získať pomocou , Gamepad.rightStick
respGamepad.leftStick
.
V prípade skriptu potvrdenia operácie odkloníme skript použitý skôr na získanie spúšťača.
// 省略
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
Tlačové informácie môžete získať zavolaním na metódu Vector2
od ReadValue
alebo .
Vector2
Takže môžete zistiť, koľko tlačíte na os X a os Y podľa a vlastnosti,x
y
Ak chcete získať smer, ktorým tlačíte, môžete ho dostať do nehnuteľnosti a ak magnitude
chcete získať sumu, ktorú tlačíte, normalized
môžete ju získať vo vlastníctve.
Pokúste sa skutočne presunúť hru a ovládať hokejku.
Získanie informácií o gamepade
ID, meno atď. môžete získať z pripojeného gamepadu.
Pozrite si napríklad na identifikáciu name
typu ovládača, ktorý je pripojený, alebo
Môžete si pozrieť, ku ktorému deviceId
gamepadu sa priradiť, keď je pripojených viac gamepadov.
Tu v texte zobrazíme informácie na kontrolu operácie.
Názov skriptu je ľubovoľný, ale tu GamepadInfo
je .
Skript vyzerá takto:
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
Môžete získať rôzne informácie z načítaných . Tu je niekoľko výňatkov.
Po uložení skriptu EventSystem
ho pripojte a nastavte textový objekt na zobrazenie.
Skúste spustiť hru a zistite, či sa zobrazia informácie.