Bediening met een Gamepad (Input System Package Version)

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Verificatieomgeving

Ramen
  • Voor Windows 11
Unity Editor
  • 2020.3.25f1
Input systeem pakket
  • 1.2.0

Vereisten voor deze tip

De volgende instellingen zijn vooraf gemaakt als uitgangspunt voor de beschrijving van deze tip.

Over XInput en DirectInput

Hoewel het beperkt is tot Windows, zijn er twee verbindingsindelingen voor gamecontrollers: DirectInput en XInput. Hier komt "Gamepad" overeen met "XInput".

Dit Gamepad programma houdt zich bezig met klassen, maar dit kan alleen controllers verwerken die "XInput" ondersteunen. Als u een controller wilt gebruiken die DirectInput ondersteunt, moet u een andere Joystick klasse gebruiken.

"DirectInput" is een oud verbindingsformaat en de definitie van de knop is relatief dubbelzinnig en kan controllers met speciale vormen aan. Onlangs is "XInput" echter mainstream geworden en het aantal controllers dat "DirectInput" niet ondersteunt, neemt toe. "DirectInput" heeft knopdefinities zoals "1", "2" en "3", dus makers van games moeten een knopcorrespondentie maken tussen het spel en de controller, zodat ze op de juiste manier kunnen worden ingesteld.

XInput wordt gedefinieerd als de volgende generatie DirectInput en bevat vooraf gedefinieerde A- en B-knoppen, triggers, sticks, enz. Daarom kan alleen een vaste vorm van de controller worden gebruikt, Omdat de definitie van knoppen goed is gedefinieerd, kunnen gamemakers games maken die bij de controller passen zonder zich zorgen te maken over de plaatsing van knoppen. Recente gamecontrollers die alleen "XInput" ondersteunen, nemen toe.

Bepalen of een knop wordt ingedrukt

U kunt bepalen of een knop wordt ingedrukt of niet, zowel door eigenschappen als xxxxxxxx.isPressed door toetsenbord en muis. Hier wil ik het type knop dat ik indruk in de tekst weergeven.

Plaats eerst een weergavetekstobject.

Maak een script voor het vonnis. De bestandsnaam is willekeurig, maar hier GamepadButtons is het .

Het script ziet er als volgt uit:

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();
  }
}

Nadat EventSystem u het script hebt opgeslagen, koppelt u het aan het weergavetekstobject en configureert u het.

Probeer het spel uit te voeren en kijk of elke knop reageert.

Overigens zijn de volgende knoppen gedefinieerd als dezelfde knop, hoewel er meerdere knoppen zijn voorbereid omdat ze anders worden gelezen, afhankelijk van de spelcomputer. In elk van de bovenstaande programma's is een beoordelingsproces opgenomen, dus wanneer u op de knop drukt, worden drie knoppen weergegeven.

XboxPlayStation en meer
bButton circleButton knopOost
aButton crossButton knopZuid
xButton squareButton knopWest
yButton driehoekButton knopNoord

Wat als een knop kan worden beoordeeld, is als volgt.

  • Een knop, × knop, omlaagknop
  • B-knop, ○-knop, rechterknop
  • X-knop, □-knop, linkerknop
  • Y-knop, pijl-omlaag, knop omhoog
  • Startknop, Menuknop
  • Knop Selecteren, Knop Bekijken
  • Linkerschouderknop, L1-knop
  • Rechterschouderknop, R1-knop
  • Linker stick knop
  • Rechter stick knop

Bepalen of de knop wordt ingedrukt

Het oordeel op het moment van drukken kan worden bepaald door de eigenschappen zoals bij xxxxxxxx.wasPressedThisFrame het toetsenbord en de muis. Berekent de waarde van het moment true waarop erop wordt gedrukt en retourneert zelfs als false het daarna wordt ingedrukt en vastgehouden.

Laten we de ingedrukte knop weergeven als tekst als een bedieningscontrole. Plaats een tekstobject voor weergave.

De bestandsnaam van het script kan van alles zijn, maar hier GamepadButtonsOneFrame is het .

Het script ziet er als volgt uit: Voor de eenvoud worden slechts 4 knoppen beoordeeld.

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";
  }
}

Nadat u EventSystem het script hebt opgeslagen, koppelt u het aan en stelt u een tekstobject in voor weergave.

Probeer het spel uit te voeren en op de knop te drukken. Ik denk dat de knop die je hebt ingedrukt, zal worden toegevoegd. Je kunt ook zien dat het ingedrukt houden van de knop geen tekst toevoegt.

Bepaal of het moment waarop de knop wordt losgelaten

Er is geen voorbeeld, maar u kunt bepalen of dit het moment is wasPressedThisFrame waarop u het vrijgeeft door een eigenschap te gebruiken in plaats van wasReleasedThisFrame een eigenschap.

Bepalen wanneer u op de pijltoetsen drukt

Bepaalt de pers van de DPAD. Afhankelijk van de spelcomputer vliegt het met de pijltjestoetsen en de D-pad, maar beide worden als hetzelfde behandeld. De DPAD bepaalt in principe alleen of je in die richting duwt of niet. Er is geen oordeel als "een beetje duwen" als een stok.

Hiermee plaatst u een tekstobject om een beslissing weer te geven, ongeacht of deze wordt ingedrukt of niet, als een bewerkingscontrole.

Maak een script. De bestandsnaam is willekeurig, maar hier GamepadDpad is het .

Het script ziet er als volgt uit:

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();
  }
}

U kunt DPAD-informatie Gamepad.dpad krijgen op .

DPAD heeft leftupdown righteigenschappen voor elke richting en u kunt bepalen of deze wordt ingedrukt of niet door de eigenschap enz. isPressed

DpadControl.ReadValue U kunt de methode ook gebruiken om de staat Vector2 van de pers in . Als er niets wordt ingedrukt (0, 0), als links wordt ingedrukt (-1, 0), enzovoort.

Nadat u EventSystem het script hebt opgeslagen, koppelt u het aan en stelt u een tekstobject in voor weergave.

Probeer het spel uit te voeren en interactie te hebben met de DPAD.

Vector2 Is trouwens in een genormaliseerde toestand, dus wanneer u diagonaal drukt, wordt het verkregen als een getal zoals (0,7071, 0,7071) in plaats van (1, 1).

Triggerdrukken bepalen

Xbox-controllers hebben links en rechts knoppen die triggers worden genoemd. Op PlayStation komt het overeen met L2R2. Deze knop is anders dan een normale knop en u kunt de hoeveelheid die u indrukt in 0,0 ~ 1,0 krijgen. Sommige andere controllers zijn uitgerust met andere namen dan triggers, maar in oudere controllers, enz., Kunnen ze eenvoudig als knoppen worden geplaatst, in welk geval het oordeel van het indrukken alleen als 0, 1 wordt behandeld.

Hier wil ik het aantal triggerdrukken controleren. Hiermee plaatst u een tekstobject voor weergave op het canvas.

Maak een script. Omdat het elders zal worden gebruikt, zullen we het hier GamepadReadValue noemen .

Het script ziet er als volgt uit:

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 Elke leftTriggerklasse heeft een eigenschap en u kunt het aantal persen rightTrigger ReadValue in het bereik van 0,0 ~ 1,0 krijgen door de methode aan te roepen. Triggers kunnen ook worden behandeld als knoppen, zodat isPressed u ook kunt beoordelen zoals. isPressed true Trouwens, het aantal wordt ReadValue gebaseerd op 0,5.

Nadat u het script hebt opgeslagen, koppelt u het aan en stelt u EventSystem een tekstobject in voor weergave.

Probeer het spel uit te voeren en de trigger te verplaatsen.

Stickinformatie bepalen

De stick kan de informatie van respectievelijk de linkerstick en de rechterstick krijgen en je kunt de hoeveelheid krijgen van hoeveel de stick in welke richting naar beneden wordt geduwd. Natuurlijk, als je geen stick op je controller hebt, kun je deze informatie niet krijgen.

Stickinformatie kan worden opgehaald met Gamepad.rightStick respectievelijk , .Gamepad.leftStick

Voor het bevestigingsscript van de bewerking zullen we het script dat eerder is gebruikt om de trigger te krijgen, omleiden.

// 省略

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 U kunt de persinformatie krijgen door de Vector2 methode aan te roepen van ReadValue of . Vector2 U kunt dus krijgen hoeveel x y u op de X-as en Y-as drukt door en eigenschappen, Als u de richting wilt krijgen die u drukt, kunt u het in de woning krijgen en als u het bedrag wilt krijgen dat u drukt, kunt u magnitude normalized het in het pand krijgen.

Probeer het spel daadwerkelijk te verplaatsen en de stick te bedienen.

Gamepad-informatie opvragen

U kunt de ID, naam, enz. Van de aangesloten gamepad krijgen. Raadpleeg bijvoorbeeld om het type controller te identificeren name dat is aangesloten, of U kunt verwijzen naar welke deviceId gamepad u wilt koppelen wanneer meerdere gamepads zijn aangesloten.

Hier zullen we de informatie in de tekst weergeven om de werking te controleren.

De scriptnaam is willekeurig, maar hier GamepadInfo is het .

Het script ziet er als volgt uit:

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 U kunt verschillende informatie krijgen van de opgehaalde . Hier zijn enkele fragmenten.

Nadat u het script hebt opgeslagen, koppelt u het aan en stelt u EventSystem een tekstobject in voor weergave.

Probeer het spel uit te voeren om te zien of de informatie wordt weergegeven.