Ohjaus peliohjaimella (syöttöjärjestelmäpaketin versio)
Varmennusympäristö
- Windows
-
- Windows 11
- Unity-editori
-
- 2020.3.25F1
- Syöttöjärjestelmän paketti
-
- 1.2.0
Tämän vinkin edellytykset
Seuraavat asetukset on tehty etukäteen tämän vinkin kuvauksen lähtökohtana.
Tietoja XInputista ja DirectInputista
Vaikka se on rajoitettu Windowsiin, peliohjaimille on kaksi yhteysmuotoa: DirectInput ja XInput. Tässä "Gamepad" vastaa "XInput".
Tämä Gamepad
ohjelma käsittelee luokkia, mutta tämä voi käsitellä vain ohjaimia, jotka tukevat "XInput".
Jos haluat käyttää ohjainta, joka tukee DirectInputia, sinun on käytettävä eri Joystick
luokkaa.
"DirectInput" on vanha yhteysmuoto ja painikkeen 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. "DirectInput" sisältää painikemäärittelyt, kuten "1", "2" ja "3", joten pelintekijöiden on luotava painikkeiden vastaavuus pelin ja ohjaimen välille, jotta ne voidaan asettaa oikein.
XInput määritellään seuraavan sukupolven DirectInputiksi, ja se sisältää ennalta määritetyt A- ja B-painikkeet, liipaisimet, sauvat jne. Siksi voidaan käyttää vain ohjaimen kiinteää muotoa, Koska painikkeiden määritelmä on hyvin määritelty, pelin luojat voivat luoda ohjaimelle sopivia pelejä huolimatta painikkeiden sijoittelusta. Viimeaikaiset peliohjaimet, jotka tukevat vain "XInputia", lisääntyvät.
Selvitä, painetaanko painiketta
Voit määrittää, painetaanko painiketta vai ei, ominaisuuksien sekä xxxxxxxx.isPressed
näppäimistön ja hiiren perusteella.
Tässä haluaisin näyttää tekstissä painikkeen tyypin, jota painan.
Aseta ensin näyttötekstiobjekti.
Luo käsikirjoitus tuomiolle. Tiedostonimi on mielivaltainen, mutta tässä GamepadButtons
se on .
Skripti näyttää tältä:
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();
}
}
Kun EventSystem
olet tallentanut komentosarjan, liitä se näyttötekstiobjektiin ja määritä se.
Yritä suorittaa peli ja katso, reagoiko jokainen painike.
Muuten, seuraavat painikkeet määritellään samaksi painikkeeksi, vaikka useita painikkeita valmistellaan, koska ne luetaan eri tavalla pelikonsolista riippuen. Jokaisessa edellä mainitussa ohjelmassa on arviointiprosessi, joten kun painat painiketta, näyttöön tulee kolme painiketta.
Xbox, | PlayStation | ja paljon muuta |
---|---|---|
b-painike | circleButton | -painike Itä |
aPainike | risti-painike | -painikeEtelä |
x-painike | neliö-painike | -painikeLänteen |
y-painike | kolmioPainike | -painikePohjoinen |
Se, mitä voidaan arvioida painikkeena, on seuraava.
- Painike, ×painike, alas-painike
- B-näppäin, ○-painike, oikea painike
- X-painike, □-painike, vasen painike
- Y-painike, Alanuoli-painike, Ylös-painike
- Käynnistä-painike, Valikko-painike
- Valitse painike, näytä-painike
- Vasen olkapainike, L1-painike
- Oikea olkapainike, R1-näppäin
- Vasen sauva -painike
- Oikea sauvapainike
Määritä, painetaanko painiketta
Lehdistön hetken tuomio voidaan määrittää ominaisuuksilla, kuten xxxxxxxx.wasPressedThisFrame
näppäimistöllä ja hiirellä.
Palauttaa painallushetken true
arvon ja palauttaa arvon, vaikka false
painaisi sitä painettuna sen jälkeen.
Näytetään painettu painike tekstinä toimintotarkistuksena. Aseta tekstiobjekti näytettäväksi.
Skriptin tiedostonimi voi olla mikä tahansa, mutta tässä GamepadButtonsOneFrame
se on .
Skripti näyttää tältä: Yksinkertaisuuden vuoksi vain 4 painiketta arvioidaan.
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";
}
}
Kun olet EventSystem
tallentanut komentosarjan, liitä se ja aseta tekstiobjekti näytettäväksi.
Yritä suorittaa peli ja painaa painiketta. Luulen, että painamasi painike lisätään. Voit myös nähdä, että painikkeen pitäminen painettuna ei lisää tekstiä.
Määritä, vapautetaanko painike sillä hetkellä, kun painike vapautetaan
Mallia ei ole, mutta voit määrittää, vapauttaako se wasPressedThisFrame
hetken, käyttämällä ominaisuutta ominaisuuden sijaan wasReleasedThisFrame
.
Määritä, milloin painat nuolinäppäimiä
Määrittää DPAD: n painalluksen. Pelikonsolista riippuen se lentää nuolinäppäimillä ja suuntaohjaimella, mutta molempia käsitellään samoina. DPAD määrittää periaatteessa vain sen, työnnätkö siihen suuntaan vai et. Ei ole tuomitsemista, kuten "työntää vähän" kuin keppi.
Sijoittaa tekstiobjektin näyttämään päätöksen, painetaanko sitä vai ei, toiminnon tarkistuksena.
Luo komentosarja. Tiedostonimi on mielivaltainen, mutta tässä GamepadDpad
se on .
Skripti näyttää tältä:
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();
}
}
Saat DPAD-tietoja Gamepad.dpad
osoitteesta .
DPAD: lla on left
up
down
right
ominaisuuksia jokaiselle suunnalle, ja voit määrittää, painaako ominaisuus sitä vai ei jne. isPressed
DpadControl.ReadValue
Voit myös käyttää menetelmää saadaksesi lehdistön tilan Vector2
. Jos mitään ei paineta (0, 0), jos vasemmalle painetaan (-1, 0) ja niin edelleen.
Kun olet EventSystem
tallentanut komentosarjan, liitä se ja aseta tekstiobjekti näytettäväksi.
Kokeile suorittaa peli ja olla vuorovaikutuksessa DPAD:n kanssa.
Vector2
Muuten, on normalisoidussa tilassa, joten kun painat vinosti, se saadaan numerona, kuten (0, 7071, 0, 7071) (1, 1) sijasta.
Määritä liipaisimen painallukset
Xbox-ohjaimissa on painikkeita, joita kutsutaan liipaisimiksi vasemmalla ja oikealla. PlayStationilla se vastaa L2R2: ta. Tämä painike eroaa tavallisesta painikkeesta, ja saat painamasi määrän 0.0 ~ 1.0. Jotkut muut ohjaimet on varustettu muilla nimillä kuin liipaisimilla, mutta vanhemmissa ohjaimissa jne. ne voidaan yksinkertaisesti sijoittaa painikkeiksi, jolloin painamisen tuomio käsitellään vain 0, 1.
Tässä haluaisin tarkistaa liipaisimen painallusten määrän. Sijoittaa piirtoalueelle näytettävän tekstiobjektin.
Luo komentosarja. Koska sitä käytetään muualla, nimeämme sen täällä GamepadReadValue
.
Skripti näyttää tältä:
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
Jokaisella leftTrigger
luokalla on ominaisuus ja rightTrigger
ReadValue
voit saada puristimien määrän alueella 0,0 ~ 1,0 kutsumalla menetelmää.
Liipaisimia voidaan käsitellä myös painikkeina, joten isPressed
voit myös arvioida esimerkiksi.
isPressed
true
Muuten, tulee määrä ReadValue
perustuu 0, 5: een.
Kun olet tallentanut komentosarjan, EventSystem
liitä se ja aseta tekstiobjekti näytettäväksi.
Yritä suorittaa peli ja liikuttaa liipaisinta.
Määritä sauvan tiedot
Keppi voi saada vasemman sauvan ja oikean sauvan tiedot, ja voit saada kuinka paljon keppiä työnnetään alas mihin suuntaan. Tietenkin, jos ohjaimessasi ei ole tikkua, et voi saada näitä tietoja.
Stick-tiedot voidaan hakea , Gamepad.rightStick
vastaavastiGamepad.leftStick
.
Toiminnon vahvistuskomentosarjaa varten ohjaamme aiemmin käytetyn komentosarjan liipaisimen saamiseksi.
// 省略
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();
}
}
leftStick
rightStick
Saat lehdistötiedot kutsumalla Vector2
menetelmää tai ReadValue
.
Vector2
Joten saat kuinka x
y
paljon painat X- ja Y-akselia ja ominaisuuksia,
Jos haluat saada painamasi suunnan, voit saada sen kiinteistöön, ja jos magnitude
haluat saada painamasi määrän, voit normalized
saada sen kiinteistöön.
Yritä todella liikuttaa peliä ja käyttää keppiä.
Hanki peliohjaimen tiedot
Voit saada tunnuksen, nimen jne.
Katso esimerkiksi, että voit tunnistaa name
kytketyn ohjaimen tyypin tai
Voit katsoa, mihin peliohjaimeen liittyy, deviceId
kun useita peliohjaimia on kytketty.
Tässä näytämme tekstin tiedot toiminnan tarkistamiseksi.
Käsikirjoituksen nimi on mielivaltainen, mutta tässä GamepadInfo
se on .
Skripti näyttää tältä:
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
Voit saada erilaisia tietoja haetusta . Tässä muutamia otteita.
Kun olet tallentanut komentosarjan, EventSystem
liitä se ja aseta tekstiobjekti näytettäväksi.
Yritä suorittaa peli nähdäksesi, näkyvätkö tiedot.