Juhtimine gamepadiga (sisendsüsteemi paketi versioon)
Kontrollimise keskkond
- Windows
-
- Windows 11
- Ühtsuse toimetaja
-
- 2020.3.25f1
- Sisendsüsteemi pakett
-
- 1.2.0
Selle näpunäite eeltingimused
Selle vihje kirjeldamise eelduseks on eelnevalt tehtud järgmised sätted.
Teave XInputi ja DirectInputi kohta
Kuigi see on piiratud Windowsiga, on mängukontrollerite jaoks kaks ühendusvormingut: DirectInput ja XInput. Siin vastab "Gamepad" "XInput".
See Gamepad
programm tegeleb klassidega, kuid see võib käsitleda ainult kontrollereid, mis toetavad "XInput".
DirectInputi toetava kontrolleri kasutamiseks peate kasutama teist Joystick
klassi.
"DirectInput" on vana ühendusvorming ja nupu määratlus on suhteliselt ebaselge ning see saab hakkama spetsiaalse kujuga kontrolleritega. Kuid hiljuti on "XInput" muutunud peavooluks ja kontrollerite arv, mis ei toeta "DirectInput", kasvab. "DirectInput" sisaldab nuppude määratlusi, nagu "1", "2" ja "3", nii et mängu loojad peavad looma nupu vastavuse mängu ja kontrolleri vahel, et neid saaks sobivalt seadistada.
XInput on määratletud kui DirectInputi järgmine põlvkond ja see sisaldab eelmääratletud A- ja B-nuppe, päästikuid, pulki jne. Seetõttu saab kasutada ainult kontrolleri fikseeritud kuju, Kuna nuppude määratlus on hästi määratletud, saavad mänguloojad luua kontrollerile sobivaid mänge, muretsemata nuppude paigutuse pärast. Hiljutised mängukontrollerid, mis toetavad ainult "XInputi", suurenevad.
Nupule vajutamise kindlakstegemine
Saate määrata, kas nuppu vajutatakse või mitte, omaduste, samuti xxxxxxxx.isPressed
klaviatuuri ja hiire abil.
Siin tahaksin kuvada, millist tüüpi nuppu ma tekstis vajutan.
Esmalt asetage kuvatav tekstiobjekt.
Looge kohtuotsuse jaoks skript. Faili nimi on meelevaldne, kuid siin GamepadButtons
see on .
Skript näeb välja selline:
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();
}
}
Pärast EventSystem
skripti salvestamist manustage see kuvatava tekstiobjektiga ja konfigureerige see.
Proovige mängu käivitada ja vaadake, kas iga nupp reageerib.
Muide, järgmised nupud on määratletud kui sama nupp, kuigi mitu nuppu on valmis, sest neid loetakse sõltuvalt mängukonsoolist erinevalt. Kõigis ülaltoodud programmides on kaasatud kohtuotsusprotsess, nii et nupu vajutamisel kuvatakse kolm nuppu.
Xbox | PlayStation | ja palju muud |
---|---|---|
bButton | circleButton | nuppEast |
aButton | crossButton | nuppSouth |
xButton | ruutButton | nuppLääne |
yButton | kolmnurkNööp | nuppNorth |
Mida saab nupuna hinnata, on järgmine.
- Nupp, × nupp, alla nupp
- B-nupp, ○ nupp, parem nupp
- X-nupp, □ nupp, vasak nupp
- Nupp Y, allanoolenupp, nupp Üles
- Nupp Start, nupp Menüü
- Vali nupp, Vaade nupp
- Vasaku õla nupp, nupp L1
- Parema õla nupp, R1 nupp
- Vasaku pulga nupp
- Parempoolne nupp
Tehke kindlaks, kas nuppu vajutatakse
Kohtuotsust vajutamise hetkel saab määrata omaduste järgi nagu klaviatuuri ja hiire puhul xxxxxxxx.wasPressedThisFrame
.
Tagastab selle vajutamise hetke true
väärtuse ja tagastab isegi siis, kui false
seda vajutatakse ja hoitakse seejärel all.
Kuvame vajutatud nuppu tekstina operatsioonikontrollina. Asetage tekstiobjekt kuvamiseks.
Skripti failinimi võib olla midagi, kuid siin GamepadButtonsOneFrame
see on .
Skript näeb välja selline: Lihtsuse huvides hinnatakse ainult 4 nuppu.
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";
}
}
Pärast EventSystem
skripti salvestamist lisage see ja määrake kuvamiseks tekstiobjekt.
Proovige mängu käivitada ja nuppu vajutada. Ma arvan, et teie vajutatud nupp lisatakse. Samuti näete, et nupu all hoidmine ei lisa teksti.
Tehke kindlaks, kas nupu vabastamise hetk
Näidist pole, kuid saate kindlaks teha, kas see on wasPressedThisFrame
hetk, mil selle vabastate, kasutades atribuudi asemel wasReleasedThisFrame
atribuuti.
Nooleklahvide vajutamise aja määramine
Määrab DPAD-i vajutamise. Sõltuvalt mängukonsoolist lendab see nooleklahvide ja D-padiga, kuid mõlemat käsitletakse samana. DPAD määrab põhimõtteliselt ainult selle, kas te liigute selles suunas või mitte. Ei ole sellist hinnangut nagu "natuke surudes" nagu kepp.
Paigutab tekstiobjekti, et kuvada otsus, kas seda vajutatakse operatsioonikontrollina või mitte.
Skripti loomine. Faili nimi on meelevaldne, kuid siin GamepadDpad
see on .
Skript näeb välja selline:
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();
}
}
DPAD-i teavet Gamepad.dpad
saate aadressilt .
DPAD-il on left
up
down
right
omadused iga suuna jaoks ja saate kindlaks teha, kas atribuut vajutab seda või mitte jne. isPressed
DpadControl.ReadValue
Meetodit saate kasutada ka ajakirjanduse oleku Vector2
saamiseks . Kui midagi ei vajutata (0, 0), kui vasakule vajutatakse (-1, 0) ja nii edasi.
Pärast EventSystem
skripti salvestamist lisage see ja määrake kuvamiseks tekstiobjekt.
Proovige mängu käivitada ja DPAD-iga suhelda.
Vector2
Muide, on normaliseeritud olekus, nii et kui vajutate diagonaalselt, saadakse see numbrina, näiteks (0, 7071, 0, 7071) asemel (1, 1).
Määrake päästikuvajutused
Xboxi kontrolleritel on vasakul ja paremal nupud, mida nimetatakse päästikuteks. PlayStationil vastab see L2R2-le. See nupp erineb tavalisest nupust ja vajutatava summa saate 0,0 ~ 1,0. Mõned teised kontrollerid on varustatud muude nimedega kui päästikud, kuid vanemates kontrollerites jne võib neid lihtsalt nuppudena paigutada, sel juhul käsitletakse vajutamise otsust ainult kui 0, 1.
Siinkohal tahaksin kontrollida päästikuvajutuste hulka. Paigutab lõuendile kuvatava tekstiobjekti.
Skripti loomine. Kuna seda kasutatakse mujal, nimetame selle siin GamepadReadValue
.
Skript näeb välja selline:
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
Igal leftTrigger
klassil on omadus ja rightTrigger
ReadValue
meetodile helistades saate vajutuste arvu vahemikus 0.0 ~ 1.0.
Päästikuid saab käsitleda ka nuppudena, nii et isPressed
saate hinnata ka näiteks.
isPressed
true
Muide, muutub ReadValue
summa 0, 5-le.
Pärast skripti EventSystem
salvestamist lisage see ja määrake kuvamiseks tekstiobjekt.
Proovige mängu käivitada ja päästikut liigutada.
Pulgateabe määramine
Kepp saab teavet vastavalt vasaku ja parema pulga kohta ning saate selle, kui palju keppi millises suunas alla surutakse. Muidugi, kui teil pole kontrolleril pulka, ei saa te seda teavet saada.
Pulgainfot saab kätte vastavalt , Gamepad.rightStick
Gamepad.leftStick
Operatsiooni kinnitamise skripti jaoks suuname päästiku saamiseks varem kasutatud skripti.
// 省略
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
Pressiteavet saate, helistades Vector2
meetodile või ReadValue
.
Vector2
Nii saate teada, kui x
y
palju vajutate X-teljele ja Y-teljele ja omadustele,
Kui soovite saada suunda, mida vajutate, saate selle kinnisvarasse ja kui soovite magnitude
saada vajutatavat summat, saate normalized
selle kinnisvarasse.
Proovige mängu tegelikult liigutada ja keppi kasutada.
Hankige gamepadi teave
ID, nime jne saate ühendatud mängupuldist.
Näiteks vaadake ühendatud kontrolleri tüübi tuvastamiseks name
või
Saate vaadata, millise deviceId
mängupuldiga seostada, kui mitu mängupulti on ühendatud.
Siin kuvame tekstis sisalduva teabe toimingu kontrollimiseks.
Skripti nimi on meelevaldne, kuid siin GamepadInfo
see on .
Skript näeb välja selline:
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
Mitmesugust teavet saate otsitud . Siin on mõned väljavõtted.
Pärast skripti EventSystem
salvestamist lisage see ja määrake kuvamiseks tekstiobjekt.
Proovige mängu käivitada, et näha, kas teave kuvatakse.