Sterowanie za pomocą gamepada (wersja pakietu systemu wejściowego)
Środowisko weryfikacji
- Windows
-
- Okna 11
- Edytor Unity
-
- 2020.3.25f1
- Pakiet systemu wejściowego
-
- 1.2.0
Wymagania wstępne dotyczące tej porady
Poniższe ustawienia zostały wcześniej wprowadzone jako przesłanka do opisu tej wskazówki.
Informacje o XInput i DirectInput
Chociaż jest ograniczony do systemu Windows, istnieją dwa formaty połączeń dla kontrolerów gier: DirectInput i XInput. Tutaj "Gamepad" odpowiada "XInput".
Ten Gamepad
program zajmuje się klasami, ale może obsługiwać tylko kontrolery obsługujące "XInput".
Aby użyć kontrolera, który obsługuje DirectInput, musisz użyć innej Joystick
klasy.
"DirectInput" to stary format połączenia, a definicja przycisku jest stosunkowo niejednoznaczna i może obsługiwać kontrolery o specjalnych kształtach. Jednak ostatnio "XInput" stał się głównym nurtem, a liczba kontrolerów, które nie obsługują "DirectInput" rośnie. "DirectInput" ma definicje przycisków, takie jak "1", "2" i "3", więc twórcy gry muszą stworzyć zgodność przycisków między grą a kontrolerem, aby można je było odpowiednio ustawić.
XInput jest zdefiniowany jako następna generacja DirectInput i zawiera predefiniowane przyciski A i B, wyzwalacze, drążki itp. Dlatego można stosować tylko stały kształt sterownika, Ponieważ definicja przycisków jest dobrze zdefiniowana, twórcy gier mogą tworzyć gry pasujące do kontrolera, nie martwiąc się o rozmieszczenie przycisków. Ostatnio rośnie liczba kontrolerów gier, które obsługują tylko "XInput".
Określanie, czy przycisk jest naciskany
Przycisk, który jest naciskany, można określić, korzystając z właściwości oraz xxxxxxxx.isPressed
klawiatury i myszy.
Tutaj chciałbym wyświetlić typ przycisku, który naciskam w tekście.
Najpierw umieść obiekt tekstu wyświetlanego.
Utwórz skrypt werdyktu. Nazwa pliku jest dowolna, ale tutaj GamepadButtons
jest .
Skrypt wygląda tak:
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
zapisaniu skryptu dołącz go do obiektu tekstu wyświetlanego i skonfiguruj go.
Spróbuj uruchomić grę i sprawdź, czy każdy przycisk reaguje.
Nawiasem mówiąc, poniższe przyciski są zdefiniowane jako ten sam przycisk, chociaż wiele przycisków jest przygotowanych, ponieważ są one odczytywane inaczej w zależności od konsoli do gier. W każdym z powyższych programów uwzględniony jest proces osądzania, więc po naciśnięciu przycisku wyświetlane są trzy przyciski.
:Xbox | , PlayStation | i nie tylko |
---|---|---|
bPrzycisk | circleButton | przyciskWschód |
aButton | crossButton | przyciskPołudnie |
xButton | squareButton | buttonWest |
yButton | triangleButton | przyciskPółnoc |
To, co można ocenić jako przycisk, jest następujące.
- Przycisk, przycisk ×, przycisk w dół
- Przycisk B, przycisk ○, prawy przycisk
- Przycisk X, przycisk □, lewy przycisk
- Przycisk Y, przycisk strzałki w dół, przycisk W górę
- Przycisk Start, przycisk Menu
- Przycisk wyboru, przycisk widoku
- Lewy przycisk na ramieniu, przycisk L1
- Prawy przycisk na ramieniu, przycisk R1
- Lewy przycisk drążka
- Prawy przycisk drążka
Określanie, czy przycisk jest wciśnięty
Osąd w momencie naciśnięcia może być określony przez właściwości, jak w przypadku xxxxxxxx.wasPressedThisFrame
klawiatury i myszy.
Zwraca wartość momentu naciśnięcia i zwraca wartość nawet true
wtedy, gdy false
zostanie naciśnięta i przytrzymana po tym dniu.
Wyświetlmy naciśnięty przycisk jako tekst jako test operacji. Umieść obiekt tekstowy do wyświetlenia.
Nazwa pliku skryptu może być dowolna, ale tutaj GamepadButtonsOneFrame
jest .
Skrypt wygląda tak: Dla uproszczenia oceniane są tylko 4 przyciski.
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
zapisaniu skryptu dołącz go do obiektu tekstowego i ustaw obiekt tekstowy do wyświetlenia.
Spróbuj uruchomić grę i nacisnąć przycisk. Myślę, że przycisk, który nacisnąłeś, zostanie dodany. Widać też, że przytrzymanie przycisku nie dodaje żadnego tekstu.
Określ, czy moment zwolnienia przycisku
Nie ma próbki, ale można określić, czy jest wasPressedThisFrame
to moment zwolnienia go, używając właściwości zamiast wasReleasedThisFrame
właściwości.
Określanie, kiedy naciskasz strzałek
Określa prasę DPAD. W zależności od konsoli do gier będzie latać z strzałek i padem kierunkowym, ale oba są traktowane tak samo. DPAD w zasadzie określa tylko, czy naciskasz w tym kierunku, czy nie. Nie ma takiego osądu jak "pchanie trochę" jak kij.
Umieszcza obiekt tekstowy w celu wyświetlenia decyzji, niezależnie od tego, czy zostanie naciśnięty, czy nie, jako test operacji.
Utwórz skrypt. Nazwa pliku jest dowolna, ale tutaj GamepadDpad
jest .
Skrypt wygląda tak:
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();
}
}
Informacje Gamepad.dpad
o DPAD można uzyskać pod adresem .
DPAD ma left
up
down
right
właściwości dla każdego kierunku i można określić, czy jest on naciskany, czy nie przez właściwość itp. isPressed
DpadControl.ReadValue
Możesz również użyć tej metody, aby uzyskać stan Vector2
prasy w formacie . Jeśli nic nie jest wciśnięte (0, 0), jeśli lewa jest wciśnięta (-1, 0) i tak dalej.
Po EventSystem
zapisaniu skryptu dołącz go do obiektu tekstowego i ustaw obiekt tekstowy do wyświetlenia.
Spróbuj uruchomić grę i wejść w interakcję z DPAD.
Vector2
Nawiasem mówiąc, jest w stanie znormalizowanym, więc po naciśnięciu po przekątnej uzyskuje się go jako liczbę, taką jak (0, 7071, 0, 7071) zamiast (1, 1).
Określanie naciśnięć spustowych
Kontrolery dla konsoli Xbox mają przyciski zwane wyzwalaczami po lewej i prawej stronie. Na PlayStation odpowiada L2R2. Ten przycisk różni się od zwykłego przycisku i możesz uzyskać kwotę, którą naciskasz w 0,0 ~ 1,0. Niektóre inne kontrolery są wyposażone w nazwy inne niż wyzwalacze, ale w starszych kontrolerach itp. mogą być po prostu umieszczone jako przyciski, w którym to przypadku ocena naciśnięcia jest obsługiwana tylko jako 0, 1.
Tutaj chciałbym sprawdzić ilość naciśnięć spustowych. Umieszcza obiekt tekstowy do wyświetlenia na kanwie.
Utwórz skrypt. Ponieważ będzie używany gdzie indziej, nazwiemy go tutaj GamepadReadValue
.
Skrypt wygląda tak:
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żda leftTrigger
klasa ma właściwość i rightTrigger
ReadValue
można uzyskać ilość naciśnięć w zakresie 0,0 ~ 1,0, wywołując metodę.
Wyzwalacze można również traktować jako przyciski, więc isPressed
można również oceniać takie jak.
isPressed
true
Nawiasem mówiąc, kwota staje się ReadValue
oparta na 0, 5.
Po zapisaniu skryptu EventSystem
dołącz go do obiektu tekstowego i ustaw obiekt tekstowy do wyświetlenia.
Spróbuj uruchomić grę i przesunąć spust.
Określanie informacji o patyku
Drążek może uzyskać informacje odpowiednio lewego i prawego drążka, a ty możesz uzyskać ilość kija popchniętego w dół w którym kierunku. Oczywiście, jeśli nie masz kija na kontrolerze, nie będziesz w stanie uzyskać tych informacji.
Informacje o sztyfcie można pobrać odpowiednio za pomocą , Gamepad.rightStick
.Gamepad.leftStick
W przypadku skryptu potwierdzającego operację przekierujemy skrypt użyty wcześniej, aby uzyskać wyzwalacz.
// 省略
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
Informacje prasowe można uzyskać, wywołując Vector2
metodę z ReadValue
lub .
Vector2
Możesz więc uzyskać jak x
y
bardzo naciskasz na oś X i oś Y przez i właściwości,
Jeśli chcesz uzyskać kierunek, który naciskasz, możesz go uzyskać w nieruchomości, a jeśli magnitude
chcesz uzyskać kwotę, którą naciskasz, normalized
możesz ją uzyskać w nieruchomości.
Spróbuj faktycznie przesunąć grę i obsługiwać drążek.
Uzyskiwanie informacji o gamepadzie
Możesz uzyskać identyfikator, nazwę itp. z podłączonego gamepada.
Na przykład zapoznaj się z sekcją, aby zidentyfikować name
typ podłączonego kontrolera lub
Możesz dowiedzieć się, z którym deviceId
gamepadem chcesz się skojarzyć, gdy podłączonych jest wiele gamepadów.
Tutaj wyświetlimy informacje w tekście, aby sprawdzić operację.
Nazwa skryptu jest dowolna, ale tutaj GamepadInfo
jest .
Skrypt wygląda tak:
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
Możesz uzyskać różne informacje z pobranego pliku . Oto kilka fragmentów.
Po zapisaniu skryptu EventSystem
dołącz go do obiektu tekstowego i ustaw obiekt tekstowy do wyświetlenia.
Spróbuj uruchomić grę, aby zobaczyć, czy informacje się pojawią.