Управление с геймпад (версия на пакета за въвеждане на системата)

Страницата се актуализира :
Дата на създаване на страница :

Среда за проверка

Уиндоус
  • Прозорци 11
Редактор на единство
  • 2020.3.25ф1
Пакет на входната система
  • 1.2.0

Предпоставки за този съвет

Следните настройки са направени предварително като предпоставка за описанието на този съвет.

За XInput и DirectInput

Въпреки че е ограничен до Windows, има два формата за връзка за игрови контролери: DirectInput и XInput. Тук "Геймпад" съответства на "XInput".

Тази Gamepad програма се занимава с класове, но това може да се справи само с контролери, които поддържат "XInput". За да използвате контролер, който поддържа DirectInput, трябва да използвате различен Joystick клас.

"DirectInput" е стар формат на свързване и дефиницията на бутона е сравнително двусмислена и може да обработва контролери със специални форми. Напоследък обаче "XInput" се превърна в мейнстрийм, а броят на контролерите, които не поддържат "DirectInput", се увеличава. "DirectInput" има дефиниции на бутони като "1", "2" и "3", така че създателите на игри трябва да създадат съответствие на бутоните между играта и контролера, така че те да могат да бъдат настроени по подходящ начин.

XInput се определя като следващото поколение DirectInput и включва предварително дефинирани A и B бутони, тригери, пръчки и др. Следователно може да се използва само фиксирана форма на контролера, Тъй като дефиницията на бутоните е добре дефинирана, създателите на игри могат да създават игри, които отговарят на контролера, без да се притесняват за поставянето на бутони. Последните контролери за игри, които поддържат само "XInput", се увеличават.

Определяне дали се натиска бутон

Можете да определите дали даден бутон да бъде натиснат или не по свойства, както xxxxxxxx.isPressed и по клавиатура и мишка. Тук бих искал да покажа типа бутон, който натискам в текста.

Първо, поставете показван текстов обект.

Създайте сценарий за присъдата. Името на файла е произволно, но ето GamepadButtons го .

Сценарият изглежда така:

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

След като EventSystem запишете скрипта, прикачете го към и конфигурирайте обекта на показвания текст.

Опитайте да стартирате играта и вижте дали всеки бутон отговаря.

Между другото, следните бутони се определят като един и същ бутон, въпреки че са подготвени множество бутони, защото се четат по различен начин в зависимост от игровата конзола. Във всяка от горните програми е включен процес на преценка, така че когато натиснете бутона, се показват три бутона.

XboxPlayStation и други
бБутон кръгов бутон бутонИзток
aБутон кръстосан бутон бутонЮг
xБутон квадратен бутон бутонЗапад
yБутон Бутон триъгълник бутонСевер

Това, което може да се прецени като бутон, е следното.

  • Бутон, бутон ×, бутон надолу
  • B бутон, ○ бутон, десен бутон
  • Бутон X, бутон □, ляв бутон
  • Бутон Y, бутон със стрелка надолу, бутон "Нагоре"
  • Бутон "Старт", бутон "Меню"
  • Бутон "Избор", бутон "Изглед"
  • Бутон на лявото рамо, бутон L1
  • Десен бутон на рамото, бутон R1
  • Бутон за лява пръчка
  • Десен бутон за пръчка

Определете дали бутонът е натиснат

Преценката в момента на натискане може да се определи от свойствата, както при xxxxxxxx.wasPressedThisFrame клавиатурата и мишката. Връща стойността на момента true , в който е натиснат, и се връща дори ако false е натиснат и задържан след това.

Нека покажем бутона, натиснат като текст като проверка на операцията. Поставяне на текстов обект за показване.

Името на файла на скрипта може да бъде всичко, но тук GamepadButtonsOneFrame е .

Сценарият изглежда така: За простота се оценяват само 4 бутона.

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

След като EventSystem запишете скрипта, прикачете го към и задайте текстов обект за показване.

Опитайте да стартирате играта и да натиснете бутона. Мисля, че бутонът, който сте натиснали, ще бъде добавен. Можете също така да видите, че задържането на бутона не добавя никакъв текст.

Определете дали моментът, в който бутонът е освободен

Няма извадка, но можете да определите дали това е wasPressedThisFrame моментът, в който я пускате, като използвате свойство вместо wasReleasedThisFrame свойство.

Определете кога да натиснете клавишите със стрелки

Определя пресата на DPAD. В зависимост от игровата конзола, тя ще лети с клавишите със стрелки и D-pad, но и двете се третират като еднакви. DPAD основно определя само дали натискате в тази посока или не. Няма преценка като "бутане малко" като пръчка.

Поставя текстов обект, за да покаже решение дали да бъде натиснат, или не като проверка на операция.

Създаване на скрипт. Името на файла е произволно, но ето GamepadDpad го .

Сценарият изглежда така:

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

Можете да получите информация за Gamepad.dpad DPAD на адрес .

DPAD има leftupdown rightсвойства за всяка посока и можете да определите дали е натиснат или не от имота и т.н. isPressed

DpadControl.ReadValue Можете също да използвате метода, за да получите състоянието Vector2 на пресата в . Ако нищо не е натиснато (0, 0), ако лявото е натиснато (-1, 0) и т.н.

След като EventSystem запишете скрипта, прикачете го към и задайте текстов обект за показване.

Опитайте да стартирате играта и да взаимодействате с DPAD.

Vector2 Между другото, е в нормализирано състояние, така че когато натиснете диагонално, се получава като число като (0.7071, 0.7071) вместо (1, 1).

Определяне на преси за задействане

Xbox контролерите имат бутони, наречени тригери отляво и отдясно. На PlayStation тя съответства на L2R2. Този бутон е различен от нормалния бутон и можете да получите сумата, която натискате в 0.0 ~ 1.0. Някои други контролери са оборудвани с имена, различни от тригерите, но при по-старите контролери и т.н., те могат просто да бъдат поставени като бутони, в който случай преценката за натискане се обработва само като 0, 1.

Тук бих искал да проверя количеството на спусъчните преси. Поставя текстов обект за показване върху платното.

Създаване на скрипт. Тъй като ще се използва другаде, ще го наречем тук GamepadReadValue .

Сценарият изглежда така:

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 Всеки leftTriggerклас има свойство и rightTrigger ReadValue можете да получите количеството преси в диапазона от 0.0 ~ 1.0, като извикате метода. Тригерите също могат да бъдат третирани като бутони, така че isPressed можете да прецените и като например. isPressed true Между другото, размерът на става ReadValue се основава на 0,5.

След като запишете скрипта, EventSystem прикачете го към и задайте текстов обект за показване.

Опитайте се да стартирате играта и да преместите спусъка.

Определете информацията за пръчката

Пръчката може да получи информацията съответно на лявата пръчка и дясната пръчка и можете да получите количеството колко пръчката е избутана надолу в коя посока. Разбира се, ако нямате пръчка на контролера си, няма да можете да получите тази информация.

Стик информация могат да бъдат извлечени с , Gamepad.rightStick съответноGamepad.leftStick.

За скрипта за потвърждение на операцията ще отклоним скрипта, използван по-рано, за да получим спусъка.

// 省略

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 Можете да получите информация за пресата, като се обадите на Vector2 метода от ReadValue или . Vector2 Така че можете да получите колко x y натискате върху оста X и оста Y от и свойства, Ако искате да получите посоката, в която натискате, можете да я получите в имота, а ако magnitude искате да получите сумата, която натискате, normalized можете да я получите в имота.

Опитайте се действително да преместите играта и да работите с пръчката.

Получаване на информация за геймпада

Можете да получите идентификационния номер, името и т.н. от свързания геймпад. Например, обърнете се към , за да идентифицирате name типа контролер, който е свързан, или Можете да направите справка за това с кой deviceId геймпад да се свържете, когато са свързани няколко геймпада.

Тук ще покажем информацията в текста, за да проверим операцията.

Името на скрипта е произволно, но ето го .GamepadInfo

Сценарият изглежда така:

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 Можете да получите различна информация от извлечените . Ето някои откъси.

След като запишете скрипта, EventSystem прикачете го към и задайте текстов обект за показване.

Опитайте да стартирате играта, за да видите дали информацията се появява.