Működtetés joystickkal (Input System csomagolt változat)
Ellenőrzési környezet
- Windows
-
- Windows 11 esetén
- Unity-szerkesztő
-
- 2020.3.25f1
- Bemeneti rendszercsomagok
-
- 1.2.0
A tipp előfeltételei
A következő beállítások előre konfigurálva vannak a tippek magyarázatának előfeltételeként.
Az XInput és a DirectInput ismertetése
Bár a Windowsra korlátozódik, a játékvezérlők számára két csatlakozási formátum létezik: "DirectInput" és "XInput". A "Joystick" itt a "DirectInput" -nak felel meg.
Ebben Joystick
a programban egy osztállyal van dolgunk, de csak a "DirectInput" -ot támogató vezérlőket tudja kezelni.
Az "XInput" funkciót támogató vezérlő használatához másik Gamepad
osztályt kell használnia.
A "DirectInput" egy régi csatlakozási formátum, és a gombok meghatározása viszonylag kétértelmű, és speciális formájú vezérlőket képes kezelni. A közelmúltban azonban az "XInput" mainstream lett, és a "DirectInput" -ot nem támogató vezérlők száma növekszik. Mivel a "DirectInput" a gombokat "1", "2" és "3" néven határozza meg, a játékkészítőknek olyan rendszert kell létrehozniuk, amely lehetővé teszi a játék és a vezérlő gombjainak megfelelő beállítását.
Az "XInput" a "DirectInput" következő generációja, és előre definiált A és B gombokkal, triggerekkel, karokkal stb. rendelkezik. Ezért csak a vezérlő alakja használható, ami szinte rögzített. Mivel a gombok meghatározása jól definiált, a játékkészítők olyan játékokat hozhatnak létre, amelyek megfelelnek a vezérlőnek anélkül, hogy aggódniuk kellene a gombok elhelyezése miatt. Egyre több újabb játékvezérlő csak az "XInput" -val kompatibilis.
A joystickokról
Mint fentebb említettük, a gombnak nincs meghatározása, így annak tényleges használatához zavaró folyamatokat kell hozzáadni, mint például a játékműveletek hozzárendelése az egyes gombok információinak vizsgálata közben. Nem hiszem, hogy új játékban kell használnia a DirectInputot, mert régi, de ne feledje, hogy ha valóban támogatni akarja, a program bonyolult lehet.
Ez a minta alapvetően a felsorolt gombokkal kapcsolatos információk megszerzésére korlátozódik.
name
Valójában ellenőriznie és hozzárendelnie kell a műveleteket.
Joystick információszerzés
Helyezzen el egy szöveges objektumot a joystick egyes gombjaival kapcsolatos információk megjelenítéséhez.
Hozzon létre egy szkriptet. A név önkényes, de ebben az esetben JoystickInfo
.
A szkript így néz ki: A kapott információk a vezérlő típusától függően változnak. Nagyon nehéz programozni az egyes vezérlőkhöz, ezért csak felsorolom az összes gombot, és megkapom a gomb típusát, és megnyomom az információkat.
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();
}
}
A csatlakoztatott joystickról információt Joystick.current
kaphat itt: .
Joystick
Ezt követően minden információt megkapunk az osztálytól.
Joystick
Amint az osztályból látható, vannak olyan definíciók, mint a és , de nincsenek olyan definíciók, stick
trigger
mint az A gomb vagy a Start gomb.
Ezért a Tulajdonságok segítségével számba kell vennie az összes gombot, kart, és meg kell találnia a gomb típusát,allControls
és meg kell nyomnia az információkat.
A parancsfájl mentése EventSystem
után csatolja és állítson be egy szöveges objektumot az információk megjelenítéséhez.
Próbálja meg futtatni a játékot olyan kontrollerrel, amely támogatja a DirectInput funkciót. Minden információ visszakereshető.
A vezérlőtől függően előfordulhat, hogy nem kapja meg a kívánt értéket, amikor megnyom egy botot, nyílbillentyűt stb. Mivel a gombok nincsenek ilyen módon definiálva, nehéz pontos nyomkövetési információkat szerezni az egyes gombokhoz. Ezenkívül láthatjuk, hogy meglehetősen nehéz teljes mértékben támogatni a joystickot, például a gombok elrendezése a vezérlőtől függően eltérő.
Ha a játék támogatja a joystickokat, kívánatos lenne egy beállítási képernyő, mint egy kulcskonfiguráció, hogy minden felhasználó testreszabhassa a vezérlője gombelrendezését.
Hogyan juthat el több joystickhoz
Az összes csatlakoztatott joystickkal kapcsolatos Joystick.all
információ a .
ReadOnlyArray
Fel foreach
lehet sorolni és így tovább.
Mivel minden érték Joystick
egy osztály, az előző programhoz hasonlóan joystick-információkat kaphat.