Vezérlés játékvezérlővel (bemeneti rendszercsomag verziója)

Oldal frissítve :
Oldal létrehozásának dátuma :

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 leftupdown righttulajdonsá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 leftTriggerosztá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();
  }
}

leftStickrightStick 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.