Unity «объединяет» входные данные джойстика, но только когда оба контроллера имеют одинаковое имя

#c# #unity3d

#c# #unity-игровой движок

Вопрос:

Проблему, с которой я столкнулся, немного сложно объяснить, поэтому я прошу прощения, если я буду вдаваться в подробности здесь.

Я создал систему в своей игре, которая использует диспетчер ввода Unity для назначения элементов управления каждому игроку в зависимости от того, сколько контроллеров подключено. Эта система отлично работает уже несколько месяцев, тестируемая одновременно с 4 контроллерами без каких-либо проблем.

Сегодня я подключил 2 контроллера Xbox One и попытался воспроизвести последнюю сборку своей игры. Что, чтобы было понятно, работало в прошлом с точно такой же настройкой.

При попытке переместить джойстик 1 диспетчер ввода не обнаруживает никаких входных данных. Но, если вы слегка переместите какую-либо ось на джойстике 2, он начинает «объединять» входные данные обоих элементов управления, поэтому вам приходится использовать оба джойстика, чтобы диспетчер ввода видел входные данные, и даже тогда это работает не совсем корректно, результат довольно значительно отстает от входных данных.

Я также обнаружил, что это происходит ИСКЛЮЧИТЕЛЬНО при запуске игры. Если я подожду, пока загрузится игра, а затем подключу контроллеры, unity отлично их считывает.

Аналогично это работает до сборки игры в редакторе Unity. Если при загрузке редактора у меня подключены оба контроллера, у меня возникает точно такая же проблема. Но если я подключу их после запуска редактора, но до того, как нажму «Play», они будут функционировать совершенно нормально.

Наконец, это происходит только в том случае, если контроллеры имеют одинаковое имя, насколько я могу судить. Я подключил контроллер PS3 и один из контроллеров Xbox one до того, как игра была запущена, и оба контроллера PS3 и Xbox one функционировали точно так, как они должны были.

Я создал новую сцену, единственным кодом которой является приведенный здесь, который я использовал для проверки этой проблемы:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AxisTestScript : MonoBehaviour
{
    public Renderer joystick1axis1P;
    public Renderer joystick1axis1N;
    public Renderer joystick1axis2P;
    public Renderer joystick1axis2N;
    public Renderer joystick2axis1P;
    public Renderer joystick2axis1N;
    public Renderer joystick2axis2P;
    public Renderer joystick2axis2N;

    public Material onMaterial;
    public Material offMaterial;
// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{

    if (Input.GetAxis("Joystick1Axis1") > 0)
        joystick1axis1P.material = onMaterial;
    else
        joystick1axis1P.material = offMaterial;
    if (Input.GetAxis("Joystick1Axis1") < 0)
        joystick1axis1N.material = onMaterial;
    else
        joystick1axis1N.material = offMaterial;
    if (Input.GetAxis("Joystick1Axis2") > 0)
        joystick1axis2P.material = onMaterial;
    else
        joystick1axis2P.material = offMaterial;
    if (Input.GetAxis("Joystick1Axis2") < 0)
        joystick1axis2N.material = onMaterial;
    else
        joystick1axis2N.material = offMaterial;

    if (Input.GetAxis("Joystick2Axis1") > 0)
        joystick2axis1P.material = onMaterial;
    else
        joystick2axis1P.material = offMaterial;
    if (Input.GetAxis("Joystick2Axis1") < 0)
        joystick2axis1N.material = onMaterial;
    else
        joystick2axis1N.material = offMaterial;
    if (Input.GetAxis("Joystick2Axis2") > 0)
        joystick2axis2P.material = onMaterial;
    else
        joystick2axis2P.material = offMaterial;
    if (Input.GetAxis("Joystick2Axis2") < 0)
        joystick2axis2N.material = onMaterial;
    else
        joystick2axis2N.material = offMaterial;
}
}
  

Мой менеджер ввода, который я не менял,выглядит следующим образом, и
остальные входы настраиваются по тому же шаблону.

И Unity, и Windows обновлены полностью, хотя у меня не было возможности протестировать это на другом компьютере.

Я считаю, что это покрывает все. Итак, есть ли какая-то настройка в unity или Windows, которую я, возможно, случайно включил? Связано ли это с тем, когда unity обнаруживает контроллеры в процессе запуска?

Пожалуйста, помогите!

Комментарии:

1. Вы когда-нибудь решали эту проблему? Кажется, у меня что-то похожее с Unity 2018.4.14f1. У меня есть два Logitech F310. Если я запускаю unity с подключенными к ним устройствами, входы axis (я не пробовал использовать кнопки) кажутся ненулевыми, только если я перемещаю джойстики на контроллерах одновременно. Если я подожду, чтобы подключить их после запуска unity, они, похоже, будут работать нормально.

2. На самом деле мне не удалось «Исправить» эту проблему, она просто перестала возникать после обновления. Но это определенно не исправлялось до тех пор, пока через несколько месяцев после того, как я задал этот вопрос. Я думаю, это было просто что-то странное с unity.

3. В какой версии это было исправлено?

4. Я понятия не имею, извините. Все, что я знаю, это то, что между тем, как я опубликовал это, и сейчас, одно из обновлений устранило проблему.