Operação com joystick (versão empacotada do Input System)
Ambiente de verificação
- Windows
-
- Janelas 11
- Unity Editor
-
- 25.3.2020F1
- Pacotes do sistema de entrada
-
- 1.2.0
Pré-requisitos para esta dica
As configurações a seguir são pré-configuradas como um pré-requisito para a explicação dessas dicas.
Sobre XInput e DirectInput
Embora seja limitado ao Windows, existem dois formatos de conexão para controladores de jogos: "DirectInput" e "XInput". "Joystick" aqui corresponde a "DirectInput".
Neste Joystick
programa, estamos lidando com uma classe, mas ela só pode lidar com controladores que suportam "DirectInput".
Para usar um controlador que suporta "XInput", você precisa usar uma classe diferente Gamepad
.
"DirectInput" é um formato de conexão antigo, e a definição de botões é relativamente ambígua, e pode lidar com controladores com formas especiais. No entanto, recentemente, "XInput" tornou-se mainstream, e o número de controladores que não suportam "DirectInput" está aumentando. Como "DirectInput" define botões como "1", "2" e "3", os criadores de jogos devem criar um sistema que permita que a correspondência do jogo e do botão do controlador seja definida adequadamente.
"XInput" é definido como a próxima geração de "DirectInput" e tem botões A e B predefinidos, gatilhos, sticks, etc. Portanto, a forma do controlador só pode ser usada, que é quase fixa. Como a definição de botões é bem definida, os criadores de jogos podem criar jogos que correspondam ao controle sem se preocupar com o posicionamento dos botões. Um número crescente de controladores de jogos recentes são compatíveis apenas com "XInput".
Sobre os joysticks
Como mencionado acima, não há definição do botão, portanto, para realmente usá-lo, é necessário adicionar processos problemáticos, como atribuir operações de jogo enquanto examina as informações de cada botão. Eu não acho que você precisa usar DirectInput em um novo jogo porque é antigo, mas tenha em mente que se você realmente quiser suportá-lo, seu programa pode ser complicado.
Esta amostra limita-se basicamente a obter informações sobre os botões listados.
name
Na verdade, você precisa verificar e atribuir operações.
Aquisição de informações por joystick
Coloque um objeto de texto para exibir informações sobre cada botão no joystick.
Crie um script. O nome é arbitrário, mas neste caso JoystickInfo
, é.
O script tem a seguinte aparência: As informações obtidas variam de acordo com o tipo de controlador. É muito difícil programar para cada controlador, então eu apenas enumero todos os botões e obtenho o tipo de botão e pressiono informações.
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();
}
}
Você pode obter informações Joystick.current
sobre o joystick conectado no .
Joystick
Depois disso, obteremos cada informação da turma.
Joystick
Como você pode ver na classe, há definições como e , stick
trigger
mas não há definições como o botão A ou o botão Iniciar.
Portanto, você deve usar as Propriedades para enumerar todos os botões, varasallControls
e descobrir o tipo de botão e pressionar informações.
Depois que o script for salvo, EventSystem
anexe-o e defina um objeto de texto para exibir informações.
Tente executar o jogo com um controlador que suporte DirectInput. Cada informação pode ser recuperada.
Dependendo do controle, você pode não obter o valor como pretendido quando você pressiona um stick, tecla de seta, etc. Como os botões não são definidos dessa forma, é difícil obter informações precisas de pressão para cada botão. Além disso, é possível ver que é bastante difícil suportar totalmente o joystick, como a disposição dos botões difere dependendo do controle.
Se o jogo é para suportar joysticks, seria desejável ter uma tela de configuração como uma configuração de chave para que cada usuário possa personalizar o layout de botão do controle que eles têm.
Como obter informações para vários joysticks
Informações sobre Joystick.all
todos os joysticks conectados podem ser obtidas em .
ReadOnlyArray
Ele foreach
pode ser enumerado em e assim por diante.
Como cada valor é Joystick
uma classe, você pode obter informações de joystick como no programa anterior.