Vezérlés játékvezérlővel (bemeneti rendszercsomag verziója)
Ellenőrzési környezet
- Windows
-
- Windows 11 esetén
- Unity-szerkesztő
-
- 2020.3.25f1
- Bemeneti rendszercsomag
-
- 1.2.0
A tipp előfeltételei
A következő beállításokat előre elvégeztük a tipp leírásá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. Itt a "Gamepad" megfelel az "XInput" -nak.
Ez Gamepad
a program osztályokkal foglalkozik, de csak az "XInput" -ot támogató vezérlőket tudja kezelni.
A DirectInput funkciót támogató vezérlő használatához másik Joystick
osztályt kell használnia.
A "DirectInput" egy régi csatlakozási formátum, és a gomb 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. A "DirectInput" olyan gombdefiníciókkal rendelkezik, mint az "1", "2" és "3", így a játékkészítőknek létre kell hozniuk egy gombkapcsolatot a játék és a vezérlő között, hogy megfelelően beállíthassák őket.
Az XInput a DirectInput következő generációja, amely előre definiált A és B gombokat, ravaszokat, karokat stb. tartalmaz. Ezért csak a vezérlő rögzített alakja használható, 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. A legújabb játékvezérlők, amelyek csak az "XInput" -ot támogatják, növekednek.
Annak megállapítása, hogy megnyomott-e egy gombot
A tulajdonságok, valamint xxxxxxxx.isPressed
a billentyűzet és az egér alapján meghatározhatja, hogy egy gombot megnyomnak-e vagy sem.
Itt szeretném megjeleníteni a szövegben a megnyomott gomb típusát.
Először helyezzen el egy megjelenített szöveges objektumot.
Hozzon létre egy szkriptet az ítélethez. A fájlnév tetszőleges, de itt GamepadButtons
van .
A szkript így néz ki:
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();
}
}
A parancsfájl mentése után EventSystem
csatolja és konfigurálja a megjelenített szöveg objektumot.
Próbálja meg futtatni a játékot, és nézze meg, hogy az egyes gombok reagálnak-e.
Egyébként a következő gombok ugyanannak a gombnak vannak definiálva, bár több gomb is elő van készítve, mert a játékkonzoltól függően másképp olvashatók. A fenti programok mindegyikében szerepel egy ítéleti folyamat, így a gomb megnyomásakor három gomb jelenik meg.
Xbox | , PlayStation | és még sok más |
---|---|---|
bGomb | circleButton | gombKelet |
aGomb | crossButton | gombDél |
xGomb | squareButton | gombNyugat |
yGomb | triangleButton | gombÉszak |
Amit gombként lehet megítélni, az a következő.
- Egy gomb, × gomb, le gomb
- B gomb, ○ gomb, jobb gomb
- X gomb, □ gomb, bal gomb
- Y gomb, Le nyílgomb, Fel gomb
- Start gomb, Menü gomb
- Válassza a Gomb, Megtekintés gomb lehetőséget
- Bal vállgomb, L1 gomb
- Jobb vállgomb, R1 gomb
- Bal kar gomb
- Jobb kar gomb
Annak megállapítása, hogy megnyomta-e a gombot
A megnyomás pillanatában az ítéletet a tulajdonságok határozhatják meg, mint a billentyűzet és az egér esetében xxxxxxxx.wasPressedThisFrame
.
A megnyomás pillanatának true
értékét adja eredményül, és akkor is visszatér, ha false
ezt követően lenyomja és lenyomva tartja.
Jelenítsük meg a lenyomott gombot szövegként műveleti ellenőrzésként. Helyezzen el egy szöveges objektumot megjelenítésre.
A szkript fájlneve bármi lehet, de itt GamepadButtonsOneFrame
van .
A szkript így néz ki: Az egyszerűség kedvéért csak 4 gombot ítélünk meg.
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";
}
}
A szkript mentése után EventSystem
csatolja és állítson be egy szöveges objektumot megjelenítésre.
Próbálja meg futtatni a játékot, és nyomja meg a gombot. Azt hiszem, a megnyomott gomb hozzá lesz adva. Azt is láthatja, hogy a gomb lenyomva tartása nem ad hozzá szöveget.
Annak megállapítása, hogy a gomb felengedésének pillanatában történt-e
Nincs minta, de megállapíthatja, hogy wasPressedThisFrame
ez a kiadás pillanata-e, ha tulajdonság helyett wasReleasedThisFrame
tulajdonságot használ.
A nyílbillentyűk megnyomásának meghatározása
Meghatározza a DPAD sajtóját. A játékkonzoltól függően a nyílbillentyűkkel és az I-választóval repül, de mindkettőt azonosként kezelik. A DPAD alapvetően csak azt határozza meg, hogy ebbe az irányba halad-e vagy sem. Nincs olyan ítélkezés, mint "egy kicsit nyomni", mint egy botot.
Szöveges objektumot helyez el, hogy műveleti ellenőrzésként megjelenítse a döntést, függetlenül attól, hogy megnyomta-e vagy sem.
Hozzon létre egy szkriptet. A fájlnév tetszőleges, de itt GamepadDpad
van .
A szkript így néz ki:
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();
}
}
A DPAD-információkat Gamepad.dpad
a következő címen kaphatja: .
A DPAD minden irányhoz rendelkezik left
up
down
right
tulajdonságokkal, és meghatározhatja, hogy a tulajdonság megnyomja-e vagy sem stb. isPressed
DpadControl.ReadValue
A módszer segítségével a sajtó állapotát Vector2
is lekérheti. Ha semmi sincs megnyomva (0, 0), ha balra nyomja meg (-1, 0) és így tovább.
A szkript mentése után EventSystem
csatolja és állítson be egy szöveges objektumot megjelenítésre.
Próbálja meg futtatni a játékot, és lépjen kapcsolatba a DPAD-val.
Vector2
By the way, normalizált állapotban van, így ha átlósan megnyomja, akkor az (1, 1) helyett (0, 7071, 0, 7071) számként kapjuk meg.
Ravaszprések meghatározása
Az Xbox kontrollerek bal és jobb oldalán ravasznak nevezett gombok találhatók. PlayStationön ez megfelel az L2R2-nek. Ez a gomb különbözik a normál gombtól, és a megnyomott mennyiséget 0.0 ~ 1.0-ban kaphatja meg. Néhány más vezérlő a triggerektől eltérő nevekkel van ellátva, de a régebbi vezérlőkben stb. egyszerűen gombként helyezhetők el, ebben az esetben a megnyomás megítélése csak 0, 1.
Itt szeretném ellenőrizni a trigger prések mennyiségét. Szöveges objektumot helyez el a vásznon való megjelenítésre.
Hozzon létre egy szkriptet. Mivel máshol fogják használni, itt GamepadReadValue
fogjuk nevezni .
A szkript így néz ki:
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
Minden leftTrigger
osztálynak van egy tulajdonsága, és rightTrigger
ReadValue
a metódus hívásával megkaphatja a 0,0 ~ 1,0 tartományban lévő lenyomások számát.
A triggerek gombokként is kezelhetők, így isPressed
megítélheti azokat is, mint.
isPressed
true
By the way, a vál ReadValue
mennyisége 0, 5-en alapul.
A szkript EventSystem
mentése után csatolja és állítson be egy szöveges objektumot megjelenítésre.
Próbálja meg futtatni a játékot, és mozgassa el a ravaszt.
A botkormány információinak meghatározása
A bot megkaphatja a bal és a jobb bot információit, és megkaphatja, hogy a botot mennyire nyomják le melyik irányba. Természetesen, ha nincs bot a kontrolleren, akkor nem fogja tudni megszerezni ezeket az információkat.
A botkormány információi a , illetve Gamepad.leftStick
segítségével Gamepad.rightStick
kérhetők le.
A műveletet megerősítő szkript esetében átirányítjuk az eseményindító lekért szkriptjét.
// 省略
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
A sajtóinformációkat a metódus ReadValue
hívásával Vector2
kaphatja meg.
Vector2
Így megkaphatja, hogy mennyit x
y
nyom az X tengelyen és az Y tengelyen és tulajdonságok,
Ha meg akarja kapni a megnyomott irányt, akkor megkaphatja az ingatlanban, és ha magnitude
meg akarja kapni a megnyomott összeget, normalized
akkor megkaphatja az ingatlanban.
Próbáld meg ténylegesen mozgatni a játékot és működtetni a botot.
Játékvezérlővel kapcsolatos információk lekérése
Az azonosítót, nevet stb. A csatlakoztatott játékvezérlőről kaphatja meg.
Például a következőre kattintva azonosíthatja name
a csatlakoztatott vezérlő típusát, vagy
Hivatkozhat arra, hogy melyik deviceId
játékvezérlőhöz kapcsolódjon, ha több játékvezérlő van csatlakoztatva.
Itt megjelenítjük a szövegben szereplő információkat a művelet ellenőrzéséhez.
A szkript neve tetszőleges, de itt GamepadInfo
van .
A szkript így néz ki:
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
Különböző információkat kaphat a lekért . Íme néhány részlet.
A szkript EventSystem
mentése után csatolja és állítson be egy szöveges objektumot megjelenítésre.
Próbálja meg futtatni a játékot, és ellenőrizze, hogy megjelennek-e az információk.