Käyttö ohjaussauvalla (syöttöjärjestelmän pakattu versio)
Varmennusympäristö
- Windows
-
- Windows 11
- Unity-editori
-
- 2020.3.25F1
- Syöttöjärjestelmän paketit
-
- 1.2.0
Tämän vinkin edellytykset
Seuraavat asetukset on määritetty valmiiksi näiden vihjeiden selityksen edellytykseksi.
Tietoja XInputista ja DirectInputista
Vaikka se on rajoitettu Windowsiin, peliohjaimille on kaksi yhteysmuotoa: "DirectInput" ja "XInput". "Joystick" vastaa tässä "DirectInput".
Tässä Joystick
ohjelmassa käsittelemme luokkaa, mutta se pystyy käsittelemään vain ohjaimia, jotka tukevat "DirectInputia".
Jos haluat käyttää ohjainta, joka tukee "XInputia", sinun on käytettävä toista Gamepad
luokkaa.
"DirectInput" on vanha yhteysmuoto, ja painikkeiden määritelmä on suhteellisen epäselvä, ja se pystyy käsittelemään ohjaimia, joilla on erityisiä muotoja. Viime aikoina "XInput" on kuitenkin tullut valtavirtaan, ja niiden ohjainten määrä, jotka eivät tue "DirectInputia", kasvaa. Koska "DirectInput" määrittelee painikkeet "1", "2" ja "3", pelintekijöiden on luotava järjestelmä, joka mahdollistaa pelin ja ohjaimen painikkeiden vastaavuuden asettamisen asianmukaisesti.
"XInput" määritellään seuraavan sukupolven "DirectInput" -tuotteeksi, ja siinä on ennalta määritetyt A- ja B-painikkeet, liipaisimet, sauvat jne. Siksi ohjaimen muotoa voidaan käyttää vain, joka on melkein kiinteä. Koska painikkeiden määritelmä on hyvin määritelty, pelintekijät voivat luoda ohjainta vastaavia pelejä huolimatta painikkeiden sijoittelusta. Yhä useammat viimeaikaiset peliohjaimet ovat yhteensopivia vain "XInputin" kanssa.
Tietoja ohjaussauvoista
Kuten edellä mainittiin, painiketta ei ole määritelty, joten sen käyttämiseksi on tarpeen lisätä hankalia prosesseja, kuten pelitoimintojen määrittäminen tutkittaessa kunkin painikkeen tietoja. Mielestäni sinun ei tarvitse käyttää DirectInputia uudessa pelissä, koska se on vanha, mutta muista, että jos todella haluat tukea sitä, ohjelmasi voi olla monimutkainen.
Tämä näyte rajoittuu periaatteessa tietojen saamiseen luetelluista painikkeista.
name
Itse asiassa sinun on tarkistettava ja määritettävä toiminnot.
Joystick-tietojen hankinta
Aseta tekstiobjekti näyttämään tietoja jokaisesta ohjaussauvan painikkeesta.
Luo komentosarja. Nimi on mielivaltainen, mutta tässä tapauksessa JoystickInfo
se on .
Skripti näyttää tältä: Saadut tiedot vaihtelevat ohjaimen tyypin mukaan. Jokaiselle ohjaimelle on erittäin vaikea ohjelmoida, joten luettelen vain kaikki painikkeet ja saan painiketyypin ja painan tietoja.
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();
}
}
Saat tietoja Joystick.current
liitetystä ohjaussauvasta kohdassa .
Joystick
Sen jälkeen saamme kaikki tiedot luokasta.
Joystick
Kuten luokasta näet, on olemassa määritelmiä, kuten ja , mutta määritelmiä, kuten A-painiketta tai käynnistyspainiketta, stick
trigger
ei ole.
Siksi sinun tulisi käyttää ominaisuuksia luetellaksesi kaikki painikkeet,allControls
sauvat ja selvittääksesi painiketyypin ja painamalla tietoja.
Kun skripti on tallennettu, EventSystem
liitä se tekstiobjektiin ja aseta se tietojen näyttämistä varten.
Yritä suorittaa peli ohjaimella, joka tukee DirectInput-toimintoa. Jokainen tieto voidaan hakea.
Ohjaimesta riippuen et ehkä saa aiottua arvoa, kun painat sauvaa, nuolinäppäintä jne. Koska painikkeita ei ole määritelty tällä tavalla, on vaikea saada tarkkoja painallustietoja jokaisesta painikkeesta. Lisäksi voit nähdä, että ohjaussauvaa on melko vaikea tukea täysin, kuten painikkeiden järjestely vaihtelee ohjaimesta riippuen.
Jos pelin on tarkoitus tukea ohjaussauvoja, olisi toivottavaa, että asetusnäyttö, kuten näppäinmääritys, jotta jokainen käyttäjä voi mukauttaa ohjaimen painikkeiden asettelua.
Kuinka saada tietoja useista ohjaussauvoista
Tietoja kaikista kytketyistä Joystick.all
ohjaussauvoista saa kohdasta .
ReadOnlyArray
Se foreach
voidaan luetella ja niin edelleen.
Koska jokainen arvo on Joystick
luokka, voit saada ohjaussauvan tietoja kuten edellisessä ohjelmassa.