Vadība ar gamepad (ievades sistēmas pakotnes versija)
Verifikācijas vide
- Windows
-
- Operētājsistēmā Windows 11
- Vienotības redaktors
-
- 2020.3.25f1
- Ievades sistēmas pakete
-
- 1.2.0
Priekšnoteikumi šim padomam
Tālāk norādītie iestatījumi ir veikti iepriekš kā priekšnoteikums šī padoma aprakstam.
Par XInput un DirectInput
Lai gan tas ir ierobežots ar Windows, spēļu kontrolieriem ir divi savienojuma formāti: DirectInput un XInput. Šeit "Gamepad" atbilst "XInput".
Šī Gamepad
programma attiecas uz klasēm, taču tā var apstrādāt tikai kontrolierus, kas atbalsta "XInput".
Lai izmantotu kontrolleri, kas atbalsta DirectInput, jums jāizmanto cita Joystick
klase.
"DirectInput" ir vecs savienojuma formāts, un pogas definīcija ir salīdzinoši neskaidra, un tā var apstrādāt kontrolierus ar īpašām formām. Tomēr nesen "XInput" ir kļuvis par galveno, un palielinās to kontrolieru skaits, kuri neatbalsta "DirectInput". "DirectInput" ir pogu definīcijas, piemēram, "1", "2" un "3", tāpēc spēļu veidotājiem ir jāizveido pogu atbilstība starp spēli un kontrolieri, lai tos varētu atbilstoši iestatīt.
XInput ir definēts kā nākamās paaudzes DirectInput, un tas ietver iepriekš definētas A un B pogas, trigerus, nūjas utt. Tāpēc var izmantot tikai fiksētu kontroliera formu, Tā kā pogu definīcija ir labi definēta, spēļu veidotāji var izveidot spēles, kas ir piemērotas kontrolierim, neuztraucoties par pogu izvietojumu. Pieaug jaunāko spēļu kontrolieru skaits, kas atbalsta tikai "XInput".
Nosakiet, vai tiek nospiesta poga
To, vai poga ir nospiesta vai nē, var noteikt pēc rekvizītiem, kā xxxxxxxx.isPressed
arī tastatūras un peles.
Šeit es gribētu parādīt pogas veidu, kuru es nospiežu tekstā.
Vispirms novietojiet displeja teksta objektu.
Izveidojiet sprieduma skriptu. Faila nosaukums ir patvaļīgs, bet šeit GamepadButtons
tas ir .
Skripts izskatās šādi:
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();
}
}
Kad EventSystem
skripts ir saglabāts, pievienojiet to parādāmā teksta objektam un konfigurējiet to.
Mēģiniet palaist spēli un redzēt, vai katra poga reaģē.
Starp citu, šādas pogas tiek definētas kā viena un tā pati poga, lai gan tiek sagatavotas vairākas pogas, jo tās tiek lasītas atšķirīgi atkarībā no spēļu konsoles. Katrā no iepriekš minētajām programmām ir iekļauts sprieduma process, tāpēc, nospiežot pogu, tiek parādītas trīs pogas.
Xbox | PlayStation | un daudz kas cits |
---|---|---|
bButton | circleButton | pogaEast |
aButton | crossButton | pogaSouth |
xButton | squareButton | buttonWest |
yButton | triangleButton | pogaNorth |
Tas, ko var vērtēt kā pogu, ir šāds.
- Poga, × poga, lejupvērstā poga
- B poga, ○ poga, labā poga
- X poga, □ poga, kreisā poga
- Y poga, lejupvērstā bultiņa, augšupvērstā poga
- Poga Sākt, poga Izvēlne
- Poga Atlasīt, skatīt
- Kreisā pleca poga, L1 poga
- Labā pleca poga, R1 poga
- Kreisās nūjas poga
- Labā nūjas poga
Nosakiet, vai poga ir nospiesta
Spriedumu nospiešanas brīdī var noteikt pēc īpašībām, tāpat kā ar xxxxxxxx.wasPressedThisFrame
tastatūru un peli.
Atgriež tā brīža true
vērtību, kad tas tiek nospiests, un atgriež pat tad, ja false
tas tiek nospiests un turēts pēc tam.
Parādīsim nospiesto pogu kā tekstu kā darbības pārbaudi. Novietojiet teksta objektu parādīšanai.
Skripta faila nosaukums var būt jebkas, bet šeit GamepadButtonsOneFrame
tas ir .
Skripts izskatās šādi: Vienkāršības labad tiek vērtētas tikai 4 pogas.
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ēc EventSystem
skripta saglabāšanas pievienojiet to un iestatiet teksta objektu parādīšanai.
Mēģiniet palaist spēli un nospiest pogu. Es domāju, ka jūsu nospiestā poga tiks pievienota. Varat arī redzēt, ka, turot nospiestu pogu, netiek pievienots teksts.
Nosakiet, vai pogas atlaišanas brīdis
Nav parauga, bet jūs varat noteikt, vai tas ir wasPressedThisFrame
brīdis, kad to atbrīvojat, īpašuma vietā wasReleasedThisFrame
izmantojot īpašumu.
Nosakiet, kad nospiežat bulttaustiņus
Nosaka DPAD nospiešanu. Atkarībā no spēļu konsoles tas lidos ar bulttaustiņiem un D-pad, bet abi tiek uzskatīti par vienādiem. DPAD būtībā nosaka tikai to, vai jūs virzāties šajā virzienā vai nē. Nav tāda sprieduma kā "mazliet stumt" kā nūju.
Novieto teksta objektu, lai parādītu lēmumu par to, vai tas ir nospiests vai nav, kā darbības pārbaudi.
Izveidojiet skriptu. Faila nosaukums ir patvaļīgs, bet šeit GamepadDpad
tas ir .
Skripts izskatās šādi:
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 informāciju Gamepad.dpad
varat iegūt vietnē .
DPAD ir left
up
down
right
īpašības katram virzienam, un jūs varat noteikt, vai īpašums to nospiež vai nē utt. isPressed
DpadControl.ReadValue
Varat arī izmantot šo metodi, lai iegūtu preses stāvokli Vector2
. Ja nekas netiek nospiests (0, 0), ja pa kreisi tiek nospiests (-1, 0) utt.
Pēc EventSystem
skripta saglabāšanas pievienojiet to un iestatiet teksta objektu parādīšanai.
Mēģiniet palaist spēli un mijiedarboties ar DPAD.
Vector2
Starp citu, ir normalizētā stāvoklī, tāpēc, nospiežot diagonāli, to iegūst kā skaitli, piemēram, (0,7071, 0,7071), nevis (1, 1).
Nosakiet sprūda nospiešanu
Xbox kontrolleriem kreisajā un labajā pusē ir pogas, ko sauc par trigeriem. PlayStation tas atbilst L2R2. Šī poga atšķiras no parastās pogas, un jūs varat iegūt nospiežamo summu 0.0 ~ 1.0. Daži citi kontrolieri ir aprīkoti ar nosaukumiem, kas nav trigeri, bet vecākiem kontrolieriem utt., Tos var vienkārši novietot kā pogas, un tādā gadījumā nospiešanas spriedums tiek apstrādāts tikai kā 0, 1.
Šeit es gribētu pārbaudīt sprūda presīšu daudzumu. Novieto teksta objektu rādīšanai uz audekla.
Izveidojiet skriptu. Tā kā tas tiks izmantots citur, mēs to nosauksim šeit GamepadReadValue
.
Skripts izskatās šādi:
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
Katrai leftTrigger
klasei ir īpašums, un rightTrigger
ReadValue
, izsaucot metodi, jūs varat iegūt preses daudzumu diapazonā no 0,0 ~ 1,0.
Trigerus var uzskatīt arī par pogām, tāpēc isPressed
varat arī spriest, piemēram.
isPressed
true
Starp citu, kļūšanas ReadValue
summa ir balstīta uz 0, 5.
Pēc skripta EventSystem
saglabāšanas pievienojiet to un iestatiet teksta objektu parādīšanai.
Mēģiniet palaist spēli un pārvietot sprūdu.
Nosakiet informāciju par nūju
Nūja var iegūt informāciju attiecīgi par kreiso nūju un labo nūju, un jūs varat iegūt summu, cik daudz nūja tiek nospiesta uz leju, kurā virzienā. Protams, ja jums nav kontroliera nūjas, jūs nevarēsit iegūt šo informāciju.
Nūjas informāciju var iegūt ar , Gamepad.rightStick
attiecīgiGamepad.leftStick
.
Operācijas apstiprināšanas skriptam mēs novirzīsim iepriekš izmantoto skriptu, lai iegūtu sprūdu.
// 省略
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
Preses informāciju var iegūt, zvanot uz Vector2
metodi no ReadValue
vai .
Vector2
Tātad jūs varat iegūt, cik x
y
daudz jūs nospiežat uz X ass un Y ass, un īpašības,
Ja vēlaties iegūt virzienu, kuru nospiežat, varat to iegūt īpašumā, un, ja vēlaties magnitude
iegūt summu, kuru nospiežat, varat normalized
to iegūt īpašumā.
Mēģiniet faktiski pārvietot spēli un darbināt nūju.
Iegūstiet informāciju par spēļu paneli
Jūs varat iegūt ID, vārdu utt., Izmantojot pievienoto gamepad.
Piemēram, atsaucieties, lai noteiktu name
savienotā kontrollera veidu, vai
Varat atsaukties uz to, ar kuru deviceId
spēļu paneli saistīt, ja ir pievienoti vairāki spēļu paliktņi.
Šeit mēs parādīsim informāciju tekstā, lai pārbaudītu darbību.
Skripta nosaukums ir patvaļīgs, bet šeit GamepadInfo
tas ir .
Skripts izskatās šādi:
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
Jūs varat iegūt dažādu informāciju no izgūtā . Šeit ir daži fragmenti.
Pēc skripta EventSystem
saglabāšanas pievienojiet to un iestatiet teksta objektu parādīšanai.
Mēģiniet palaist spēli, lai redzētu, vai informācija tiek parādīta.