Toimimine juhtkangiga (sisendsüsteemi pakitud versioon)

Lehekülg uuendatud :
Lehe loomise kuupäev :

Kontrollimise keskkond

Windows
  • Windows 11
Ühtsuse toimetaja
  • 2020.3.25f1
Sisendsüsteemi paketid
  • 1.2.0

Selle näpunäite eeltingimused

Järgmised sätted on eelkonfigureeritud nende näpunäidete selgitamise eeltingimusena.

Teave XInputi ja DirectInputi kohta

Kuigi see on piiratud Windowsiga, on mängukontrollerite jaoks kaks ühendusvormingut: "DirectInput" ja "XInput". "Joystick" vastab siin "DirectInput".

Selles Joystick programmis tegeleme klassiga, kuid see saab hakkama ainult kontrolleritega, mis toetavad "DirectInput". "XInput" toetava kontrolleri kasutamiseks peate kasutama teist Gamepad klassi.

"DirectInput" on vana ühendusvorming ja nuppude määratlus on suhteliselt ebaselge ning see saab hakkama spetsiaalsete kujunditega kontrolleritega. Kuid hiljuti on "XInput" muutunud peavooluks ja kontrollerite arv, mis ei toeta "DirectInput", kasvab. Kuna "DirectInput" määratleb nupud kui "1", "2" ja "3", peavad mängu loojad looma süsteemi, mis võimaldab mängu ja kontrolleri nuppude vastavust sobivalt seadistada.

"XInput" on määratletud kui järgmise põlvkonna "DirectInput" ja sellel on eelnevalt määratletud A- ja B-nupud, päästikud, pulgad jne. Seetõttu saab kasutada ainult kontrolleri kuju, mis on peaaegu fikseeritud. Kuna nuppude määratlus on hästi määratletud, saavad mängu loojad luua kontrolleriga sobivaid mänge, muretsemata nuppude paigutuse pärast. Üha rohkem hiljutisi mängukontrollereid ühildub ainult "XInputiga".

Juhtkangide kohta

Nagu eespool mainitud, ei ole nupu määratlust, nii et selle tegelikuks kasutamiseks on vaja lisada tülikaid protsesse, näiteks mänguoperatsioonide määramist, uurides iga nupu teavet. Ma ei usu, et peate DirectInputi uues mängus kasutama, kuna see on vana, kuid pidage meeles, et kui soovite seda tõesti toetada, võib teie programm olla keeruline.

See proov piirdub põhimõtteliselt teabe hankimisega loetletud nuppude kohta. name Tegelikult peate toiminguid kontrollima ja määrama.

Juhtkangi teabe omandamine

Asetage tekstiobjekt, et kuvada teavet juhtkangi iga nupu kohta.

Skripti loomine. Nimi on meelevaldne, kuid antud juhul JoystickInfo , see on .

Skript näeb välja selline: Saadud teave varieerub sõltuvalt kontrolleri tüübist. Iga kontrolleri jaoks on väga raske programmeerida, nii et ma lihtsalt loetlen kõik nupud ja saan nupu tüübi ja vajutage teavet.

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

Ühendatud juhtkangi kohta saate teavet Joystick.current jaotisest . Joystick Pärast seda saame klassist iga teabe.

Joystick Nagu klassist näete, on selliseid määratlusi nagu ja , stick trigger kuid puuduvad sellised määratlused nagu nupp A või nupp Start. Seetõttu peaksite kasutama atribuute, et loetleda kõik nupud, pulgadallControls ja teada saada nupu tüüp ja vajutage teavet.

Kui skript on salvestatud, EventSystem lisage see ja määrake tekstiobjekt teabe kuvamiseks.

Proovige mängu käivitada kontrolleriga, mis toetab DirectInputi. Iga infokildu on võimalik alla laadida.

Sõltuvalt kontrollerist ei pruugi te pulga, nooleklahvi jms vajutamisel saada ettenähtud väärtust. Kuna nuppe ei ole sel viisil määratletud, on iga nupu kohta raske saada täpset vajutusteavet. Lisaks näete, et juhtkangi täielik toetamine on üsna raske, näiteks nuppude paigutus erineb sõltuvalt kontrollerist.

Kui mäng on mõeldud juhtkangide toetamiseks, oleks soovitav, et seadistusekraan oleks nagu võtmekonfiguratsioon, et iga kasutaja saaks kohandada oma kontrolleri nuppude paigutust.

Kuidas saada teavet mitme juhtkangi kohta

Teavet kõigi ühendatud juhtkangide kohta Joystick.all saab . ReadOnlyArray Seda foreach saab loetleda ja nii edasi.

Kuna iga väärtus on Joystick klass, saate juhtkangi teavet nagu eelmises programmis.