Funcionament amb un joystick (versió empaquetada del sistema d'entrada)
Entorn de verificació
- Windows
-
- Finestres 11
- Editor d'unitat
-
- 25.3.2020
- Paquets del sistema d'entrada
-
- 1.2.0
Requisits previs per a aquest consell
Els següents paràmetres estan preconfigurats com a requisit previ per a l'explicació d'aquests consells.
Quant a XInput i DirectInput
Tot i que està limitat a Windows, hi ha dos formats de connexió per als controladors de joc: "DirectInput" i "XInput". "Joystick" aquí correspon a "DirectInput".
En Joystick
aquest programa, estem tractant amb una classe, però només pot manejar controladors que suportin "DirectInput".
Per utilitzar un controlador que admeti "XInput", heu d'utilitzar una classe diferent Gamepad
.
"DirectInput" és un format de connexió antic i la definició de botons és relativament ambigua i pot gestionar controladors amb formes especials. No obstant això, recentment, "XInput" s'ha convertit en corrent principal, i el nombre de controladors que no suporten "DirectInput" està augmentant. Atès que "DirectInput" defineix els botons com "1", "2" i "3", els creadors de jocs han de crear un sistema que permeti configurar la correspondència del joc i del botó del controlador adequadament.
"XInput" es defineix com la propera generació de "DirectInput" i té predefinits botons A i B, disparadors, pals, etc. Per tant, només es pot utilitzar la forma del controlador, que és gairebé fixa. Com que la definició de botons està ben definida, els creadors de jocs poden crear jocs que coincideixin amb el controlador sense preocupar-se de la col·locació dels botons. Un nombre creixent de controladors de joc recents només són compatibles amb "XInput".
Sobre els joysticks
Com s'ha esmentat anteriorment, no hi ha cap definició del botó, de manera que per utilitzar-lo realment, cal afegir processos problemàtics, com ara assignar operacions de joc mentre s'examina la informació de cada botó. No crec que necessiteu utilitzar DirectInput en un joc nou perquè és antic, però tingueu en compte que si realment voleu donar-li suport, el vostre programa pot ser complicat.
Aquesta mostra es limita bàsicament a obtenir informació sobre els botons llistats.
name
De fet, cal comprovar i assignar operacions.
Joystick Adquisició d'informació
Col·loqueu un objecte de text per mostrar informació sobre cada botó del joystick.
Creeu un script. El nom és arbitrari, però en aquest cas JoystickInfo
, és .
El guió té aquest aspecte: La informació obtinguda varia en funció del tipus de responsable del tractament. És molt difícil programar per a cada controlador, així que només enumero tots els botons i obtinc el tipus de botó i premo informació.
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();
}
}
Podeu obtenir informació Joystick.current
sobre el joystick connectat a .
Joystick
Després d'això, obtindrem cada informació de la classe.
Joystick
Com podeu veure a la classe, hi ha definicions com i , stick
trigger
però no hi ha definicions com el botó A o el botó d'inici.
Per tant, hauríeu d'utilitzar les propietats per enumerar tots els botons, pals,allControls
esbrinar el tipus de botó i prémer la informació.
Un cop desat l'script, EventSystem
adjunteu-lo i configureu un objecte de text per mostrar informació.
Proveu d'executar el joc amb un controlador compatible amb DirectInput. Es pot recuperar cada informació.
Depenent del controlador, és possible que no obtingueu el valor previst quan premeu un pal, una tecla de fletxa, etc. Com que els botons no estan definits d'aquesta manera, és difícil obtenir informació de premsa precisa per a cada botó. A més, podeu veure que és bastant difícil suportar completament el joystick, com ara la disposició dels botons difereix en funció del controlador.
Si el joc és per suportar joysticks, seria desitjable tenir una pantalla de configuració com una configuració de tecles perquè cada usuari pugui personalitzar la disposició del botó del controlador que té.
Com obtenir informació per a diversos joysticks
La informació sobre Joystick.all
tots els joysticks connectats es pot obtenir a .
ReadOnlyArray
Es foreach
pot enumerar en i així successivament.
Com que cada valor és Joystick
una classe, podeu obtenir informació del joystick com en el programa anterior.