Ovládání pomocí gamepadu (verze balíčku vstupního systému)
Ověřovací prostředí
- Windows
-
- Systém Windows 11
- Editor jednoty
-
- 2020.3.25f1
- Vstupní systémový balíček
-
- 1.2.0
Předpoklady pro tento tip
Následující nastavení byla provedena předem jako předpoklad pro popis tohoto tipu.
Informace o aplikacích XInput a DirectInput
Ačkoli je omezen na Windows, existují dva formáty připojení pro herní řadiče: DirectInput a XInput. Zde "Gamepad" odpovídá "XInput".
Tento Gamepad
program se zabývá třídami, ale může pracovat pouze s řadiči, které podporují "XInput".
Chcete-li použít řadič, který podporuje rozhraní DirectInput, je nutné použít jinou Joystick
třídu.
"DirectInput" je starý formát připojení a definice tlačítka je poměrně nejednoznačná a dokáže zpracovat řadiče se speciálními tvary. V poslední době se však "XInput" stal hlavním proudem a počet řadičů, které nepodporují "DirectInput", se zvyšuje. "DirectInput" má definice tlačítek, jako jsou "1", "2" a "3", takže tvůrci her musí vytvořit shodu tlačítek mezi hrou a ovladačem, aby je bylo možné správně nastavit.
XInput je definován jako další generace DirectInput a zahrnuje předdefinovaná tlačítka A a B, spouštěče, páčky atd. Proto lze použít pouze pevný tvar regulátoru, Vzhledem k tomu, že definice tlačítek je dobře definována, mohou tvůrci her vytvářet hry, které vyhovují ovladači, aniž by se museli starat o umístění tlačítek. Nedávné herní ovladače, které podporují pouze "XInput", se zvyšují.
Zjištění, zda je stisknuto tlačítko
Můžete určit, zda je tlačítko stisknuto nebo ne vlastnostmi, stejně jako xxxxxxxx.isPressed
klávesnice a myš.
Zde bych chtěl zobrazit typ tlačítka, které v textu mačkám.
Nejprve umístěte textový objekt zobrazení.
Vytvořte skript pro verdikt. Název souboru je libovolný, ale tady GamepadButtons
je .
Skript vypadá 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 jej připojte k objektu zobrazovaného textu a nakonfigurujte jej.
Zkuste spustit hru a zjistěte, zda každé tlačítko reaguje.
Mimochodem, následující tlačítka jsou definována jako stejné tlačítko, i když je připraveno více tlačítek, protože se čtou odlišně v závislosti na herní konzoli. V každém z výše uvedených programů je zahrnut proces posuzování, takže po stisknutí tlačítka se zobrazí tři tlačítka.
Xbox, | PlayStation | a další |
---|---|---|
bButton | circleButton | buttonEast |
aButton | crossButton | buttonSouth |
xButton | squareButton | buttonWest |
yButton | triangleButton | buttonNorth |
Co lze posoudit jako tlačítko, je následující.
- Tlačítko, × tlačítko, tlačítko dolů
- Tlačítko B, tlačítko ○, pravé tlačítko
- Tlačítko X, □ tlačítko, levé tlačítko
- Tlačítko Y, tlačítko se šipkou dolů, tlačítko nahoru
- Tlačítko Start, tlačítko Menu
- Tlačítko Vybrat, tlačítko Zobrazit
- Levé rameno, L1 tlačítko
- Pravé rameno, tlačítko R1
- Tlačítko levé páčky
- Tlačítko pravé páčky
Zjistěte, zda je tlačítko stisknuto
Úsudek v okamžiku stisknutí může být určen vlastnostmi jako u xxxxxxxx.wasPressedThisFrame
klávesnice a myši.
Vrátí hodnotu okamžiku, kdy true
je stisknut, a vrátí se, i když false
je stisknut a poté podržen.
Podívejme se na stisknuté tlačítko jako text jako kontrolu operace. Umístěte textový objekt k zobrazení.
Název souboru skriptu může být cokoliv, ale tady GamepadButtonsOneFrame
je .
Skript vypadá takto: Pro jednoduchost jsou posuzována pouze 4 tlačítka.
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 jej připojte a nastavte textový objekt pro zobrazení.
Zkuste spustit hru a stisknout tlačítko. Myslím, že tlačítko, které jste stiskli, bude přidáno. Můžete také vidět, že podržením tlačítka nepřidáte žádný text.
Zjistěte, zda v okamžiku uvolnění tlačítka
Neexistuje žádná ukázka, ale můžete určit, zda je wasPressedThisFrame
to okamžik, kdy ji uvolníte pomocí vlastnosti místo wasReleasedThisFrame
vlastnosti.
Určení, kdy stisknete klávesy se šipkami
Určuje stisknutí DPAD. V závislosti na herní konzoli bude létat se šipkami a směrovým ovladačem, ale oba jsou považovány za stejné. DPAD v podstatě pouze určuje, zda tlačíte tímto směrem nebo ne. Neexistuje žádný soud jako "trochu tlačit" jako hůl.
Umístí textový objekt tak, aby zobrazil rozhodnutí, zda je stisknut nebo ne jako kontrola operace.
Vytvořte skript. Název souboru je libovolný, ale tady GamepadDpad
je .
Skript vypadá 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();
}
}
Informace o Gamepad.dpad
DPAD můžete získat na adrese .
DPAD má left
up
down
right
vlastnosti pro každý směr a můžete určit, zda je stlačen nebo ne vlastností atd. isPressed
DpadControl.ReadValue
Můžete také použít metodu k získání stavu Vector2
tisku v . Pokud není nic stisknuto (0, 0), pokud je stisknuto vlevo (-1, 0) atd.
Po EventSystem
uložení skriptu jej připojte a nastavte textový objekt pro zobrazení.
Zkuste spustit hru a komunikovat s DPAD.
Vector2
Mimochodem, je v normalizovaném stavu, takže když stisknete diagonálně, získá se jako číslo, jako je (0,7071, 0,7071) místo (1, 1).
Určení stisků spouště
Ovladače pro Xbox mají vlevo a vpravo tlačítka nazývaná spouštěče. Na PlayStation to odpovídá L2R2. Toto tlačítko se liší od normálního tlačítka a můžete získat částku, kterou stisknete v 0,0 ~ 1,0. Některé jiné ovladače jsou vybaveny jinými názvy než spouštěči, ale ve starších ovladačích atd. mohou být jednoduše umístěny jako tlačítka, v takovém případě je úsudek stisknutí zpracován pouze jako 0, 1.
Zde bych chtěl zkontrolovat počet stisknutí spouště. Umístí textový objekt pro zobrazení na plátno.
Vytvořte skript. Vzhledem k tomu, že bude použit jinde, pojmenujeme jej zde GamepadReadValue
.
Skript vypadá 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
třída má vlastnost a rightTrigger
ReadValue
můžete získat počet stisknutí v rozsahu 0,0 ~ 1,0 voláním metody.
Spouštěče mohou být také považovány za tlačítka, takže isPressed
můžete také posoudit například.
isPressed
true
Mimochodem, množství se stává ReadValue
na základě 0,5.
Po uložení skriptu EventSystem
jej připojte a nastavte textový objekt pro zobrazení.
Zkuste spustit hru a stisknout spoušť.
Určení informací o tyči
Hůl může získat informace o levé páčce a pravé páčce a můžete získat množství toho, jak moc je hůl tlačena dolů v jakém směru. Samozřejmě, pokud nemáte na ovladači páčku, nebudete moci tyto informace získat.
Informace o tyči lze získat pomocí , Gamepad.rightStick
respGamepad.leftStick
.
Pro potvrzovací skript operace přesměrujeme skript použitý dříve k získání triggeru.
// 省略
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
Informace o tisku můžete získat voláním Vector2
metody z nebo .ReadValue
Vector2
Takže můžete získat, kolik x
y
tlačíte na osu X a osu Y podle a vlastnosti,
Pokud chcete získat směr, který tlačíte, můžete ji získat v nemovitosti, a pokud magnitude
chcete získat částku, kterou tlačíte, normalized
můžete ji získat v nemovitosti.
Pokuste se skutečně hýbat hrou a ovládat páčku.
Získání informací o gamepadu
ID, jméno atd. můžete získat z připojeného gamepadu.
Například odkaz na k identifikaci name
typu řadiče, který je připojen, nebo
Můžete se podívat, ke kterému gamepadu se chcete přidružit, deviceId
když je připojeno více gamepadů.
Zde zobrazíme informace v textu pro kontrolu operace.
Název skriptu je libovolný, ale tady GamepadInfo
je .
Skript vypadá 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ískat různé informace z načteného . Zde je několik výňatků.
Po uložení skriptu EventSystem
jej připojte a nastavte textový objekt pro zobrazení.
Zkuste spustit hru, abyste zjistili, zda se informace zobrazí.