Ovládanie pomocou joysticku (verzia v balíku vstupného systému)
Prostredie overovania
- Windows
-
- Windows 11
- Editor jednoty
-
- 2020.3.25f1
- Vstupné systémové balíky
-
- 1.2.0
Predpoklady pre tento tip
Nasledujúce nastavenia sú vopred nakonfigurované ako predpoklad na vysvetlenie týchto tipov.
O spoločnosti XInput a DirectInput
Aj keď je obmedzený na Windows, existujú dva formáty pripojenia pre herné ovládače: "DirectInput" a "XInput". "Joystick" tu zodpovedá "DirectInput".
V Joystick
tomto programe sa zaoberáme triedou, ale dokáže spracovať iba ovládače, ktoré podporujú "DirectInput".
Ak chcete použiť ovládač, ktorý podporuje "XInput", musíte použiť inú Gamepad
triedu.
"DirectInput" je starý formát pripojenia a definícia tlačidiel 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. Keďže "DirectInput" definuje tlačidlá ako "1", "2" a "3", tvorcovia hier musia vytvoriť systém, ktorý umožní správne nastavenie korešpondencie tlačidiel hry a ovládača.
"XInput" je definovaný ako ďalšia generácia "DirectInput" a má preddefinované tlačidlá A a B, spúšte, páčky atď. Preto je možné použiť iba tvar ovládača, ktorý je takmer pevný. Keďže definícia tlačidiel je dobre definovaná, tvorcovia hier môžu vytvárať hry, ktoré zodpovedajú ovládaču, bez obáv z umiestnenia tlačidiel. Rastúci počet nedávnych herných ovládačov je kompatibilných iba s "XInput".
Informácie o joystickoch
Ako už bolo spomenuté vyššie, neexistuje definícia tlačidla, takže na jeho skutočné použitie je potrebné pridať nepríjemné procesy, ako napríklad priradenie herných operácií pri skúmaní informácií o každom tlačidle. Nemyslím si, že musíte použiť DirectInput v novej hre, pretože je stará, ale majte na pamäti, že ak ju naozaj chcete podporiť, váš program môže byť komplikovaný.
Táto vzorka je v zásade obmedzená na získanie informácií o uvedených tlačidlách.
name
V skutočnosti musíte skontrolovať a priradiť operácie.
Získavanie informácií joystickom
Umiestnením textového objektu zobrazíte informácie o každom tlačidle na pákovom ovládači.
Vytvorte skript. Názov je ľubovoľný, ale v tomto prípade JoystickInfo
je to .
Skript vyzerá takto: Získané informácie sa líšia v závislosti od typu ovládača. Je veľmi ťažké naprogramovať pre každý ovládač, takže len vymenujem všetky tlačidlá a získam typ tlačidla a informácie o stlačení.
using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.UI;
public class JoystickInfo : 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 joystick = Joystick.current;
if (joystick == null)
{
Debug.Log("ジョイスティックがありません。");
TextObject.text = "";
return;
}
Builder.Clear();
// ジョイスティックの情報取得
Builder.AppendLine($"deviceId:{joystick.deviceId}");
Builder.AppendLine($"name:{joystick.name}");
Builder.AppendLine($"displayName:{joystick.displayName}");
// ジョイスティックにはボタンの大部分が定義されていないので
// 基本的には allControls で列挙して入力の種類と値を確認していく
foreach (var key in joystick.allControls)
{
if (key is StickControl stick)
{
if (stick.up.isPressed) Builder.AppendLine($"{key.name} Up");
if (stick.down.isPressed) Builder.AppendLine($"{key.name} Down");
if (stick.left.isPressed) Builder.AppendLine($"{key.name} Left");
if (stick.right.isPressed) Builder.AppendLine($"{key.name} Right");
var value = stick.ReadValue();
if (value.magnitude > 0f)
{
Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
}
}
else if (key is Vector2Control vec2)
{
var value = vec2.ReadValue();
if (value.magnitude > 0f)
{
Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
}
if (vec2.x.ReadValue() != 0f)
{
Builder.AppendLine($"{key.name}.x:{vec2.x.ReadValue()}");
}
if (vec2.y.ReadValue() != 0f)
{
Builder.AppendLine($"{key.name}.x:{vec2.y.ReadValue()}");
}
}
else if (key is ButtonControl button)
{
if (button.isPressed) Builder.AppendLine($"{key.name} isPress");
var value = button.ReadValue();
if (value != 0f)
{
Builder.AppendLine($"{key.name}:{value}");
}
}
else if (key is AxisControl axis)
{
if (axis.IsPressed()) Builder.AppendLine($"{key.name} isPress");
var value = axis.ReadValue();
if (value != 0f)
{
Builder.AppendLine($"{key.name}:{value}");
}
}
else
{
Builder.AppendLine($"Type={key.GetType()}");
}
}
// 押しているボタン一覧をテキストで表示
TextObject.text = Builder.ToString();
}
}
Informácie Joystick.current
o pripojenom joysticku môžete získať v .
Joystick
Potom dostaneme všetky informácie z triedy.
Joystick
Ako môžete vidieť z triedy, existujú definície ako a , ale neexistujú žiadne definície, stick
trigger
ako napríklad tlačidlo A alebo tlačidlo Štart.
Preto by ste mali použiť vlastnosti na vymenovanie všetkých tlačidiel,allControls
páčok a zistiť typ tlačidla a stlačiť informácie.
Po uložení EventSystem
skriptu ho pripojte a nastavte textový objekt na zobrazovanie informácií.
Skúste hru spustiť pomocou ovládača, ktorý podporuje DirectInput. Každú informáciu je možné získať.
V závislosti od ovládača sa po stlačení páčky, klávesu so šípkou atď. nemusí zobraziť hodnota podľa plánu. Keďže tlačidlá nie sú definované týmto spôsobom, je ťažké získať presné informácie o stlačení každého tlačidla. Okrem toho môžete vidieť, že je dosť ťažké plne podporovať joystick, napríklad usporiadanie tlačidiel sa líši v závislosti od ovládača.
Ak má hra podporovať joysticky, bolo by žiaduce mať obrazovku nastavení, ako je konfigurácia klávesov, aby si každý používateľ mohol prispôsobiť rozloženie tlačidiel ovládača, ktorý má.
Ako získať informácie o viacerých joystickoch
Informácie o Joystick.all
všetkých pripojených joystickoch je možné získať v .
ReadOnlyArray
Môže foreach
byť vymenovaný v a tak ďalej.
Keďže každá hodnota je Joystick
trieda, môžete získať informácie o joysticku ako v predchádzajúcom programe.