Toimimine juhtkangiga (sisendsüsteemi pakitud versioon)
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.