Jump to content
Unity Insider Forum

XBOX Controller wird auf manchen Systemen nicht erkannt


malzbie

Recommended Posts

Hi da!
Ich habe von einigen Spielern die Rückmeldung bekommen, dass der XBox Controller bei nem Unitybuild Probleme machen kann.

Und zwar ist es so, dass die Signale einfach nicht verarbeitet werden. Welche Windowsversionen davon betroffen sind habe ich noch nicht raus.
Scheinbar hilft es, wenn man den Controller mal aus- und wieder ein stöpselt, sodass Windows den Controller neu registriert.
Nur warum? Was ist da im Busch?
Ich gehe stark davon aus, dass der Controller bei anderen Spielen funktioniert und sowieso immer im System eingesteckt ist. Warum also braucht das Build dann nochmal dieses Anschubser von Windows?

Alleine werde ich da wohl nicht drauf kommen, denn bei den Systemen von mir und meinen Kumpels gibt es keine Probleme.

Deswegen brauche ich Feedback von euch. Jeder der diesen Controller (Xbox360 oder XBox One) hat und auch meine Pinball Collection runter geladen hat,
soll mir bitte mal schreiben ober er auch solche Probleme hat (hatte).
Hat irgendwer schon mal selber was für den Controller veröffentlicht und hat selber Feedback dazu bekommen?


Jeder Hinweis wäre echt wichtig für mich. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Unity-Default ist DirectInput. Willste für XInput meine Klasse haben? Die tut ganz gut.

Edit: Also, hab's mal getestet. Bisher mit Steam Controller als XBox-Controller. Gibt damit an sich keine Probleme, und Lag hab ich auch keinen feststellen können. Habe den Controller auch im Spiel an und wieder ausgeschaltet, keine Probleme.

Was nicht ging, war den Controller erst nach dem Spiel zu starten. Aber das kann gerade auch am Steam Controller-Treiber liegen.

Das einzige Problem, das ich sonst hatte, waren die angeschlossenen HOTAS-Teile (T16000 + Throttle), die permanent im Menü durch die Buttons gewechselt sind. Aber keine Sorge, das Problem habe ich auch bei allen Borderlands- und Unreal Tournament-Teilen, deshalb kleben die Dinger an einem USB-Hub mit Schaltern.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielleicht hilft dir das hier weiter. Ich vermute mal ohne System-API-Prüfungen kann man dieses Problem nicht lösen. Ich denke Unity bekommt ggf. nicht mit, daß ein Gerät bereits angeschlossen ist und man müsste über einen harten API-Call ein Art "Device-Refresh" fordern (ich nenne es mal so), die Unity auffordert die angeschlossenen Windowsgeräte neu auszuwerten. Ich vermute bei einem manuellen Plugin des Pads geschieht dies automatisch durch Unity, da Unity dann die angeschlossenen Geräte neu einliest (Windows löst quasi einen internen Trigger innerhalb Unity aus, wenn ein Gerät neu registriert wird).

http://answers.unity3d.com/questions/1100642/joystick-runtime-plugunplug-detection.html
http://docs.nvidia.com/gameworks/content/technologies/mobile/game_controller_unity_api_specifics.htm

Link zu diesem Kommentar
Auf anderen Seiten teilen

@SaschaDu hast ne XInput Klasse die gut tut? gerne her damit :)

Aber schade (für mich) dass bei dir keine Probleme aufgetreten sind. Es kann dann ja eigentlich nur am DirectInput liegen.

@Zer0Cool Das was da besprochen wird geht um das Einstecken des Controllers während das Spiel schon läuft.
Bei den Meldungen von mir, scheinen die Controller aber vorher schon drin zu sein...

Ich denke ich werde erstmal auf XInput schwenken und dann mal beobachten, was passiert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es kann auch sein, daß man leider an die internen Strukturen von Unity nicht rankommt. Ich denke es wird in der Klasse "Input" von Unity "verbockt". Vermutlich bräuchte man hier eine "RefreshDevices()"-method oder sowas in der Art.

Wenn du noch Rückmeldungen von Usern bekommst, achte evtl. auch drauf, ob es ein "Wireless" Gerät ist.
Das Ganze kann aber auch ein Windowsproblem sein, d.h. ein Windows-API-Call liefert zurück, daß kein Gerät angeschlossen ist, dann hat man hier mit Unity keine Chance und müsste Windows zu einem Refresh zwingen. Du würdest dann über einen Windowsapicall aus Unity heraus ein erneutes Einlesen aller Plug-Play-Geräte erzwingen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier ist ein Tool, welches ein "Plug and Play Rescan" unter Windows auslösen kann. Leider etwas ungeeignet für die Verwendung unter Unity. man müsste die API calls von diesem Tool isolieren und eine Unity dll oder C# draus machen. Aber man braucht wohl auch Admin-Rechte, daher ist diese Lösung ggf. für ein Unitygame dann wohl doch ungeeignet.
https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/devcon

Quellcode:
https://github.com/Microsoft/Windows-driver-samples/tree/master/setup/devcon

Man würde dann nach dem Start von Unity ein "DevCon Rescan" absetzen und damit ein "Refresh" aller Devices erzwingen welches auch in Unity ankommt. Ich denke aber der ganze Aufwand lohnt dann nur bei größeren Spielen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 25 Minuten schrieb malzbie:

Es kann dann ja eigentlich nur am DirectInput liegen.

Ne, ich hab ja einfach nur dein Spiel getestet, so wie es auf Steam ist. Es kann an allem möglichen liegen, XInput ist nur aus verschiedenen Gründen grundsätzlich besser als DirectInput. Ich schau mal, dass ich eine aktuelle Version meiner Klasse finde. Die XInput.dll musst du dann noch selber besorgen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

wenn man bei mir den Controller nachdem das Spiel gestartet ist oder unity gestartet ist anschaltet (XBox Wireless) dann geht es nicht ..dann geht es erst wenn ich windows 10 neu starte ..ist bei mir in unity bei meinem Projekt genauso ..ich bräuchte da also auch eine Lösung ..jedenfalls wenn er einmal nicht erkannt wird ..hilft auch kein Neustart von Unity .. erst windows neustart hilft.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Echt? Das ist ja noch beschissener! Ich frage mich da echt, warum man einen Neustart von Windows braucht, wo doch alles Plug & Play sein sollte.
Ich kenne das Problem so ähnlich von meinem Wacom Tablet. Wenn man da das Tablet nach dem Windowsstart anschließt, dann geht zwar die Monitorfunktion und auch die Stifteingabe, aber die speziellen Wacomfunktionen gehen nicht. Da ist es aber so, dass das Tablet über HDMI angeschlossen ist und es scheinbar kein Aufwecken gibt, wenn man das Dingen anschließt.
Ich konnte aber den Treiber für das Tablet identifizieren und hab mir ne Batchdatei geschrieben die einfach den Dienst beendet und neustartet.
Vielleicht ginge das bei deinem Wireless Controller auch, wenn man weiß, welcher Dienst/Treiber es ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wäre mal interessant ein "devcon rescan" auf deinem PC aufzurufen und zu schauen, ob es das Problem generell beheben kann. Du kannst es ja mal auf deinem PC installieren (es ist wohl bei dem Windows WDK mit dabei).  Ich wollte schon mal eine EXE erstellen, aber ohne Installation des WDK ist auch das nicht möglich (zudem müsstest du dann eine EXE downloaden). Wenn dies hilft, wäre das vielleicht eine generelle Lösung, um solche Probleme auch in Unity "final" zu lösen (vermutlich müsste man dann allerdings vom User verlangen das Game als Admin zu starten und die devcon api calls als DLL nach Unity portieren).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe das bereits in den Status nachricht geschrieben

Also ich habe nun das Problem auch gehabt. Mein xbox controller wurde beim zweiten Mal nicht erkannt.  Das allerdings habe ich dann versucht bei Unity Editor auch versucht. Ja auch da wurde es nicht mal beim ersten Versuch erkannt. Da wurde mir klar, dass es nicht nur an Unity lag. 

Ich habe auch die Lösung gefunden allerdings ist das bis jetzt nur eine Theorie, denn ich denke eher dass es nun ein Zufall ist, dass es funktioniert, denn ich schaffe es nicht mehr, dass es NICHT erkannt wird.. sondern funktioniert nun wunderbar.

Ich habe windows 7 64 bit nebenbei.

Ich hatte den falschen Treiber drin. Dies hier ist der Richtige:

0FJ6QDz.png

Davor hatte ich den drinne:

n7hpsFh.png

 

Wenn mein Controller ausgeschaltet ist verschwindet dieses Symbol (in Systemsteuerung\Hardware und Sound\Geräte und Drucker): KDIdZN3.png

So nachdem ich eingeschaltet habe kam es nicht mehr weg. Ich habe das gleiche Problem bei Elite Dangerous auch gehabt. Nach dem Spielen und XBOx Controller ausschalten hat das nicht mehr funktioniert. Ich müsste quasi die USB Kabel rausstecken und wieder anstecken.

Aber jetzt ist es immer da nach dem ich einschalte. Und es funktioniert auch die ganze Zeit.

Daher würde ich euch mal bitten, ob ihr auch mal ausprobieren könnt. Ich habe den obersten Treiber gewählt.

Außerdem Steam bestätigt mir, dass es richtig sein sollte, denn plötzlich meldet sich Steam beim Spielen, dass auch ein Controller angeschlossen ist. Das hatte ich NIE davor. Oder ich hab es nie bemerkt ^^.

1vCX4Kt.png

Edit: Anscheinend ist das letzte Build nicht so wirklich bei anderen Spielen aufgetaucht. Hab es gerade mit Rocket League versucht. Da kommt das nicht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Diesen Thread hatte ich schon mal gesehen, aber so richtig hilft das nicht.
Was ich soweit erfahren habe, haben manche eben das Problem, dass der Controller zu Beginn schon nicht erkannt wird. Die Leute können ihn dann aber z.B. im Main Menü aus und wieder einstecken und schon geht das Dingen. Ich weiß leider garnichts über den XBox Typ. Ob es der 360, der Wireless oder der One ist.

Ist aber auch erstmal egal. Ich habe mein Game jetzt auf XInput umgestellt und habe dadurch sogar den Vorteil, dass ich Ingame die Tastenzuordnung ändern kann. Hab mir da jetzt einen Mapper geschrieben, der die Tasten Buttons und Achsen ändern lässt und abspeichert.
Also mein Joystick wird fürs Spiel jetzt über XInput abgefragt. Leider gibt es keine Möglichkeit die Interne UI über XInput zu steuern. Das UI Eventsystem greift ausschließlich auf den Inputmanager von Unity zu und dann ist dann doch wieder DirectInput an board. Ich will jetzt aber nicht auch noch die UI ändern....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sowas ist nie schlecht. Aber ich selber habe jetzt garnicht deine Klasse genommen sondern, sondern XInput.Net eingebunden:

https://github.com/speps/XInputDotNet

Da sind alle Buttons und Achsen schon definiert. Man muss aber eben die States noch selber generieren.

Aber das ist recht schnell gemacht. Hier ist mal ein Auszug von meinem Code. Das Ganze Script hat rund 900 Zeilen. Ist aber fast nur Fleißarbeit, weil sich die Zeilen für die States ja nahezu gleich für jeden einzelnen Button wiederholen.
Ich selber frage aber nicht A, wie hier im Code zu sehen, ab sondern frage nach "ShootBall". Es wird dann in einem Dictionary nach der Verknüpfung zur Taste geschaut. Das mache ich auch mit Tasten von der Tastatur und Maus.
 

using XInputDotNetPure; // Required in C#

public class InputManager : MonoBehaviour {
    bool playerIndexSet = false;
    PlayerIndex playerIndex;
    GamePadState state;
    GamePadState prevState;
    GamePadButtons button;
  
	bool buttonA_Down;
    bool buttonA_Up;
    bool buttonA_Hold;

  void Update() {
          #region xbox finden
          // Find a PlayerIndex, for a single player game
          // Will find the first controller that is connected ans use it
          if (!playerIndexSet || !prevState.IsConnected) {
              for (int i = 0; i < 4; ++i) {
                  PlayerIndex testPlayerIndex = (PlayerIndex)i;
                  GamePadState testState = GamePad.GetState(testPlayerIndex);
                  if (testState.IsConnected) {
                     // Debug.Log(string.Format("GamePad found {0}", testPlayerIndex));
                      playerIndex = testPlayerIndex;
                      playerIndexSet = true;
                  }
              }
          }
          prevState = state;
          state = GamePad.GetState(playerIndex);
          #endregion
          AnyButton = false;
          #region A
          buttonA_Up = false;
          if (prevState.Buttons.A == ButtonState.Released && state.Buttons.A == ButtonState.Pressed) {
              buttonA_Down = true;
              buttonA_Hold = false;
              buttonA_Up = false;
              AnyButton = true;
              AnyButtonName = "A";
          }
          if (prevState.Buttons.A == ButtonState.Pressed && state.Buttons.A == ButtonState.Pressed) {
              buttonA_Down = false;
              buttonA_Hold = true;
              buttonA_Up = false;
          }
          if (prevState.Buttons.A == ButtonState.Pressed && state.Buttons.A == ButtonState.Released) {
              buttonA_Down = false;
              buttonA_Hold = false;
              buttonA_Up = true;
          }
          #endregion

  }

  public bool GetJoyButtonDown(string buttonName) {

          switch (buttonName) {
          case "A":
          return buttonA_Down;

  }

}

}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 months later...

Leute!
Ich glaube ich habe das Problem gefunden und beseitigt. ^^
Aber erstmal will ich euch erzählen wie ich darauf gekommen bin.

Vor einigen Tagen hat mein Sohnemann auf seiner Kiste die Flipper gespielt und er kam dann an und sagte mir, dass auch er das Problem mit dem Controller im Menü habe.
Jetzt endlich konnte ich mir das mal anschauen und habe festgestellt, dass das Gamepad an sich geht, aber irgendwie die Signale nicht verarbeitet werden konnten.
Wenn man nämlich den linke Joystick bewegt, sieht man im Menü, dass der oberste Button aktiv wird, er also auch Signale bekommt ( Ich frage da lediglich die 2 Achsen ab).
Man konnte aber nicht navigieren.
Treiber war so wie er sein sollte. Und als wir den Controller mal getrennt und wieder angeschlossen hatten, ging er. Genau wie bei den Meisten die so ein Problem hatten.
Mich hat aber gewundert, dass mein Sohn von Steam das BigPicture als Meldung sieht, wenn das Spiel gestartet wird. Also diese Meldung wo steht, dass man mit Shift - Tab das Steamoverlay öffnen kann. Wir sind davon ausgegangen, dass das davon kommt, weil er mal versucht hat mit nem XBox Controller das BigScreen System zu steuern.

Nach nem Neustart war das Problem dann wieder da.

Ich selber habe bei Steam 2 Profile. Eines, mit dem ich Spiele und ein Developerprofil. Bei mir war ja alles gut, wenn ich mit dem Spiele Profil den Flipper gestartet habe.
Mit dem Developer hatte ich das scheinbar nie getestet. Bis gestern!
Dort war das Problem plötzlich auch da! Selber Rechner, selbe Dateien, nur andere Anmeldung bei Steam. Somit war schon fast klar, dass es am Steam liegen muss.

Nur was?

Ich habe allen Scheiß verglichen, konnte aber nichts finden. Lediglich, wenn man das Spiel startet, dann gleich wieder beendet und dann wieder neu startet, ging's plötzlich.
Aber immer wenn der Controller im Spiel komplett funktioniert hatte, machte BigScreen blöd, denn dann konnte man nicht mehr mit der Maus steuen.

Da habe ich erst mal ne Runde gegoogled. Aber nichts gefunden.

Ja und dann bin ich aufs Frontend von Steam gegangen und habe geschaut ob es am Build liegen könnte. Ob es irgendeine Einstellung gibt, die Probleme mit dem Controller machen könnte.

Und da war es!

Auf einer Seite, wo man sachen für den STEAM Controller einstellen kann, gab es folgende Rubrik:
 

Zitat


Steam-Konfigurator für Drittanbieter-Controller

Users can opt in or out of using the Steam Configurator for third-party controllers. If you’re using the Steam Configuration support for all of your input, you will want third-party controllers to work regardless of that setting. If you have existing support for another API such as X-Input, leaving this unchecked will default the user to use the existing API unless they have opted into using the Steam Configurator for that controller type. Check all boxes that you either lack existing support for outside of the Steam API or prefer the use of the Steam API.

 

Unter diesem Text waren 3 Felder zum anhaken. Einmal für PS4, einmal für XBox und einmal für irgendwas anderes.
XBox war angehakt.

Ich habe den Haken entfernt, das alles gespeichert, Steam neu gestartet und BÄM! Fehler ist weg!!!  Bei meinem DeveloperProfil wie bei meinem Sohn.

Jungs!
Wenn ihr Controller Probleme hattet, dann testet es bitte mal aus. Es wäre echt genial, wenn's bei allen funktioniert.

Übrigens. Das BigPictureLogo ging damitauch  weg. Alles ist wieder so wie es sein soll! :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...