Nadzorovanje z igralno ploščico (različica paketa vhodnega sistema)
Okolje za preverjanje
- Windows
-
- Windows 11
- Urejevalnik enotnosti
-
- 2020.3.25f1
- Paket vhodnega sistema
-
- 1.2.0
Predpogoji za to konico
Naslednje nastavitve so bile vnaprej narejene kot predpostavka za opis tega namiga.
O XInput in DirectInput
Čeprav je omejena na Windows, obstajata dve obliki povezave za krmilnike iger: DirectInput in XInput. Tukaj "Gamepad" ustreza "XInput".
Ta program Gamepad
obravnava razrede, vendar lahko to obravnava le krmilnike, ki podpirajo "XInput".
Če želite uporabiti krmilnik, ki podpira DirectInput, morate uporabiti drug Joystick
razred.
»DirectInput« je stara oblika povezave in definicija gumba je razmeroma nedvomna in lahko ravna z krmilniki s posebnimi oblikami. V zadnjem času pa je »XInput« postal mainstream, število krmilnih števk, ki ne podpirajo »DirectInput« pa se povečuje. "DirectInput" ima definicije gumbov, kot so "1", "2" in "3", zato morajo ustvarjalci iger ustvariti korespondenco gumbov med igro in krmilcem, tako da jih je mogoče ustrezno nastaviti.
XInput je opredeljen kot naslednja generacija DirectInputa in vključuje vnaprej določene gumbe A in B, sprožilce, palice itd. Zato je mogoče uporabiti le fiksno obliko krmilnika, Ker je definicija gumbov dobro definirana, lahko ustvarjalci iger ustvarijo igre, ki ustrezajo krmilnik, ne da bi skrbeli za postavitev gumbov. Nedavni igralni krmilniki, ki podpirajo samo »XInput« se povečujejo.
Ugotovite, ali je pritisnjena tipka
Lahko določite, ali je gumb xxxxxxxx.isPressed
pritisnjena ali ne z lastnostmi, kot tudi tipkovnico in miško.
Tukaj bi rad prikazal vrsto gumba, ki ga pritiskam v besedilu.
Najprej postavite predmet besedila v prikazu.
Ustvarite skript za razsodbo. Ime datoteke je samovoljno, ampak tukaj GamepadButtons
je .
Scenarij izgleda takole:
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();
}
}
Ko skript EventSystem
shranite, ga priložite in konfigurirajte predmet besedila v prikaznem omrežju.
Poskusite izvajati igro in preverite, ali se vsak gumb odziva.
Mimogrede, naslednji gumbi so opredeljeni kot isti gumb, čeprav je več gumbov pripravljenih, ker se berejo drugače, odvisno od igralne konzole. V vsakem od zgoraj navedenih programov je vključen sodni postopek, tako da ko pritisnete gumb, se prikažejo trije gumbi.
inXbox | PlayStation | več |
---|---|---|
bButton | circleButton | GumbEast |
aButton | navzkrižni gumb | gumbSouth |
xButton | kvadratNati gumb | gumbWest |
yButton | trikotnikButton | gumbNorth |
Kar je mogoče oceniti kot gumb, je naslednje.
- Gumb, ×, gumb dol
- Gumb B, gumb 4, desni gumb
- Gumb X, □ gumb, levi gumb
- Gumb Y, puščica navzdol, gumb Gor
- Gumb Začni, Gumb Meni
- Gumb »Izberite«, »Ogled«
- Levi gumb na rami, gumb L1
- Desni gumb za ramo, gumb R1
- Levi gumb palice
- Desni gumb za palico
Ugotovite, ali je gumb pritisnjena
Sodbo v xxxxxxxx.wasPressedThisFrame
trenutku pritiska lahko določijo lastnosti kot pri tipkovnici in miški.
Vrne vrednost trenutka true
, ko je pritisnjena, false
in se vrne tudi, če je pritisnjena in zadržana.
Prikažimo gumb, pritisnjena kot besedilo kot preverjanje operacije. Postavite besedilni predmet za prikaz.
Ime datoteke skripta je lahko karkoli, ampak tukaj GamepadButtonsOneFrame
je .
Scenarij izgleda takole: Za poenostavnost se presodi le 4 gumbi.
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 shranjevanju EventSystem
skripta ga priložite in nastavite besedilni predmet za prikaz.
Poskusite zagon igre in pritisnite gumb. Mislim, da bo gumb, ki si ga pritisnil, dodan. Vidite lahko tudi, da držanje gumba ne doda nobenega besedila.
Ugotovite, ali je trenutek sprostitve gumba
Vzorca ni, vendar lahko določite, wasPressedThisFrame
wasReleasedThisFrame
ali je to trenutek, ko ga sprostite z lastnostjo namesto z lastnostjo.
Določite, kdaj pritisnete puščične tipke
Določa stiskalnico DPAD. Odvisno od igralne konzole bo letela s puščičnimi tipkami in D-padom, vendar se oba obravnavata kot enaka. DPAD v bistvu določa le, ali potiskate v to smer ali ne. Ni sodbe, kot je "potiskanje malo" kot palica.
Postavi besedilni predmet za prikaz odločitve, ali je pritisnjena ali ne kot preverjanje operacije.
Ustvarite skript. Ime datoteke je samovoljno, ampak tukaj GamepadDpad
je .
Scenarij izgleda takole:
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();
}
}
Informacije o DPAD-u lahko najdete Gamepad.dpad
na .
DPAD ima lastnosti left
up
down
right
za vsako smer, in lahko določite, ali je pritisnjena ali ne z lastnostjo itd. isPressed
DpadControl.ReadValue
Z metodo Vector2
lahko spravite tudi stanje tiska v . Če ni nič pritisnjenega (0, 0), če je levo pritisnjena (-1, 0) in tako naprej.
Po shranjevanju EventSystem
skripta ga priložite in nastavite besedilni predmet za prikaz.
Poskusite zagon igre in interakcijo z DPAD.
Vector2
Mimogrede, je v normaliziranem stanju, tako da ko pritisnete diagonalno, se pridobi kot število, kot je (0,7071, 0,7071) namesto (1, 1).
Določanje pritiskov na sprožilec
Krmilniki Xbox imajo gumbe, imenovane sprožilci na levi in desni strani. Na PlayStationu ustreza L2R2. Ta gumb se razlikuje od običajnega gumba in lahko dobiš količino, ki jo pritiskaš v 0.0~1.0. Nekateri drugi krmilniki so opremljeni z imeni, ki niso sprožilci, pri starejših krmilnikih itd., pa se lahko preprosto postavijo kot gumbi, v tem primeru se sodba stiska le kot 0, 1.
Tukaj bi rad preveril količino sprožilnih pritiskov. Postavi besedilni predmet za prikaz na platno.
Ustvarite skript. Ker ga bomo uporabili drugje, ga bomo tukaj naimen imeli GamepadReadValue
.
Scenarij izgleda takole:
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
Vsak razred leftTrigger
ima lastnost rightTrigger
ReadValue
in lahko dobiš količino stiskal v obsegu 0.0~1.0 tako, da pokličeš metodo.
Sprožilci se lahko obravnavajo tudi kot gumbi, tako isPressed
da lahko tudi presodite, kot so.
isPressed
true
Mimogrede, znesek ReadValue
postane temelji na 0,5.
Po shranjevanju skripta ga EventSystem
priložite in nastavite besedilni predmet za prikaz.
Poskusite igrati igro in premakniti sprožilec.
Določanje informacij o palici
Palica lahko dobi informacije leve palice in desno palico oziroma desno palico, in lahko dobiš količino, koliko palice je potisnjena navzdol v katero smer. Seveda, če nimate palice na krmilnik, ne boste mogli dobiti teh informacij.
Informacije o palici se lahko pridobijo z , Gamepad.rightStick
oziromaGamepad.leftStick
.
Za skript za potrditev operacije bomo preusmerjali skript, uporabljen prej, da bi dobili sprožilec.
// 省略
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
Informacije o tisku lahko poiščite tako, da pokličete Vector2
metodo iz ali ReadValue
.
Vector2
Tako boste lahko dobili, x
y
koliko pritiskate na osi X in Y osi po in lastnosti,
Če želite dobiti smer, ki jo pritiskate, jo lahko v nepremičnini, magnitude
in če želite dobiti znesek, ki ga stiskate, normalized
ga lahko dobiš v nepremičnini.
Poskusite dejansko premakniti igro in upravljati palico.
Prenesite informacije o igralnih ploščicah
ID, ime itd. lahko dobiš iz povezanega igralnega seznama.
Glejte na primer, name
da določite vrsto krmilnika, ki je povezan, ali
Lahko se sklicuje na to, s deviceId
katero igralno ploščico lahko povežete, ko je povezanih več igralnih ploščic.
Tukaj bomo prikazali informacije v besedilu za preverjanje operacije.
Ime skripta je samovoljno, ampak tukaj GamepadInfo
je .
Scenarij izgleda takole:
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
Iz pridobljenih podatkov lahko pridobite različne informacije . Tukaj je nekaj odlomek.
Po shranjevanju skripta ga EventSystem
priložite in nastavite besedilni predmet za prikaz.
Poskusite zagon igre, da preverite, ali so prikazane informacije.