WiiMote mit Unity verbinden 5

7

Ich suche nach einer Anleitung zum Verbinden von WiiMote mit Unity 5 als Eingabegerät. Ich habe diese Bibliothek hier gefunden , verstehe aber nicht, wie sie installiert werden soll und welche Voraussetzungen dafür gelten.

John Demetriou
quelle
1
In der Vergangenheit (auf 4.x kostenlos) habe ich ein externes Programm, GlovePIE (oder OSCulator auf Mac), verwendet, um eine Schnittstelle zum Gerät herzustellen und Nachrichten über Open Sound Control-Nachrichten an Unity weiterzuleiten. Dafür gibt es eine Bibliothek namens OSCuMote. Es funktioniert für schnelles und schmutziges Prototyping, ist aber wahrscheinlich kein Ansatz in Release-Qualität. (UniWii klingt besser, aber ich habe keine persönlichen Erfahrungen damit, also würde ich raten.) Wenn der OSC-Ansatz für Ihre Anforderungen ausreicht, lassen Sie es mich in einer Antwort wissen und ich werde die Details als Antwort aufschreiben.
DMGregory
Nun, dies ist für ein Universitätsprojekt gedacht, um zu lernen, wie man mit externen Geräten (z. B. Kinect, Occulus Rift, Wiimote, Leapmotion usw.) kommuniziert. Die Sache ist, dass Nintendo dies alles selbst eingerichtet hat, so dass sich der Entwickler keine Sorgen machen muss, aber es gibt noch keine Unterstützung für Unity 5)
John Demetriou
@ DMGregory Ich versuche, die Dinge nicht zu komplizieren, nur eine einfache Kreisel- und Tasteneingabe von WiiMote
John Demetriou
@ Bradman175 Diese Frage wurde ein Jahr nach meiner gestellt :)
John Demetriou

Antworten:

1

Ich habe versucht, in die in der Frage verlinkte UniWii-Bibliothek zu schauen , aber die Windows-Download-Seite scheint im Moment ein defekter Link zu sein, und Forenthreads darüber sind meistens 4 Jahre alt. :(

Die Grundidee, eine native Plugin-DLL, auf die von C # mit [DllImport] -Zuordnungen verwiesen wird, ist gut. Ich habe dies erfolgreich für die Schnittstelle mit den Kinect- und Playstation Move-Controllern verwendet. Wenn Sie also einen funktionierenden Download einer aktuellen Version dieses Plugins finden, ist es wahrscheinlich eine bessere und robustere Option als das, was ich vorhabe unten vorhanden.


Die Methode, mit der ich Wii Remote-Informationen in Unity (oder Flash) übertragen habe, besteht darin, ein externes Programm wie GlovePIE unter Windows oder OSCulator unter Mac zu installieren . Diese Programme führen eine programmierbare Eingangsemulation durch, kommunizieren effektiv mit einer Vielzahl von Geräten und bieten Ihnen Tools, mit denen Sie steuern können, wie sie miteinander kommunizieren.

Beide bieten die Möglichkeit, Daten über Open Sound Control- Nachrichten zu senden und zu empfangen , auf die wir in Unity warten, um die von der Wii-Fernbedienung kommenden Daten zu lesen.

Ich werde die GlovePIE-Methode beschreiben, da ich mit der Arbeit unter Windows am besten vertraut bin.

  1. Stellen Sie sicher, dass der Bluetooth-Adapter Ihres Computers eingeschaltet ist.

  2. Führen Sie GlovePIE aus und füllen Sie ein neues Skript mit Folgendes:

(Sie können diese als neue ".PIE" -Datei speichern, um sie später zu laden.)

var.port = 54934

debug = "On: " + Wiimote1.Exists + " Wiimote battery level: " + Wiimote1.Battery + " Rotation: " + Wiimote1.YawSpeed

SendOsc("localhost", var.port, "/wii/1/start", true)
SendOsc("localhost", var.port, "/wii/1/acceleration", tostring(Wiimote1.gx), tostring(Wiimote1.gy), tostring(Wiimote1.gz))
SendOsc("localhost", var.port, "/wii/1/rotationSpeed", tostring(Wiimote1.PitchSpeed in radians), tostring(-Wiimote1.YawSpeed in radians), tostring(Wiimote1.RollSpeed in radians))
SendOsc("localhost", var.port, "/wii/1/analog", tostring(Wiimote1.Nunchuk.JoyX), tostring(Wiimote1.Nunchuk.JoyY))
SendOsc("localhost", var.port, "/wii/1/buttonA", int(Wiimote1.A))
SendOsc("localhost", var.port, "/wii/1/buttonB", int(Wiimote1.B))
SendOsc("localhost", var.port, "/wii/1/buttonC", int(Wiimote1.Nunchuk.C))
SendOsc("localhost", var.port, "/wii/1/buttonZ", int(Wiimote1.Nunchuk.Z))
SendOsc("localhost", var.port, "/wii/1/button1", int(Wiimote1.One))
SendOsc("localhost", var.port, "/wii/1/done", true)
  1. Klicken Sie in GlovePIE auf die Schaltfläche "Ausführen". Es wird jetzt nach Wii-Fernbedienungen gesucht.

  2. Stellen Sie die Wii-Fernbedienung auf eine ebene Fläche (damit die Erstkalibrierung stabil ist).

  3. Drücken Sie gleichzeitig die Tasten 1 und 2 auf der Wii-Fernbedienung.

Alle 4 Anzeigen auf der Fernbedienung sollten blinken - die Wii-Fernbedienung sucht nach Empfängern

  1. Warten Sie, bis Windows den Unsinn "Neue Hardware installieren" ausgeführt hat.

Sie können dies ignorieren, einschließlich aller Dialoge, die besagen, dass Sie neu starten müssen (sie lügen).

  1. Die Lichter 1 und 4 sollten dauerhaft leuchten, die Lichter 2 und 3 aus.

GlovePIE hat die Fernbedienung gefunden

  1. Die Lichter 2 und 3 sollten dauerhaft leuchten, die Lichter 1 und 4 aus.

GlovePIE kalibriert die Sensoren. Halten Sie die Fernbedienung ruhig, sonst wird sie für immer kalibriert (was manchmal sowieso der Fall ist).

  1. Licht 1 sollte fest leuchten, der Rest aus

Die Fernbedienung ist als Player 1 registriert und sendet Daten über Open Sound Control-Nachrichten.

Das Debug-Feld in GlovePIE sollte anzeigen, dass die Fernbedienung vorhanden ist, den Batteriestand melden und die aktuellen Gierrotationsdaten anzeigen. (Das ist die zweite Zeile des obigen Skripts). Wenn Sie beim Drehen des Controllers keine Gierdaten erhalten, sollten Sie ihn ausschalten und erneut koppeln.

  1. Sie können Ihr Unity-Spiel oder PIE-Skript so oft stoppen und starten, wie Sie möchten, und die Fernbedienung funktioniert "nur", bis sie ausgeschaltet wird.

Beachten Sie, dass beim Stoppen des Skripts die Lichter ausgeschaltet werden, die Fernbedienung jedoch weiterhin eingeschaltet ist und der Akku entladen wird. Wenn Sie die Fernbedienung längere Zeit nicht verwenden, halten Sie den Netzschalter gedrückt, um sie auszuschalten. Sie müssen erneut mit Schritt 3 beginnen, wenn Sie es erneut verwenden möchten.

Okay, so erhalten Sie die Daten in Ihren Computer. Jetzt können Sie eine Bibliothek wie OSCuMote ( Download-Link ) verwenden, um die an Port 54934 eingehenden OSC-Nachrichten zu lesen und auf die Daten in Ihren Unity C # -Skripten zuzugreifen.

Ich werde versuchen, das C # -Skript, das ich dafür geschrieben habe, in meinem letzten Projekt zu bereinigen und es als Teil dieser Antwort aufzunehmen.

DMGregory
quelle
Ich hatte den ganzen Tag das gleiche Problem (ich fand die DLL nicht) und ich denke, dies ist der gleiche Code.google.com/p/3div-project/source/browse/trunk/…
John Demetriou
Kleine Frage zu Windows 8.1 Wie haben Sie sich mit der Wiimote verbunden? Ich meine, haben Sie es in Bluetooth-Geräten oder ähnlichem hinzugefügt, bevor Sie über Unity mit ihm verbunden wurden?
John Demetriou
1
@ John Demetriou, ich fürchte, ich habe dies nur mit Windows Vista und 7 gemacht. Win 7 brauchte kein Setup unter Bluetooth-Geräten, aber ich weiß nicht genau, ob unter Windows 8 / zusätzliche Schritte erforderlich sind. 8.1. Ich weiß, dass das Anschließen des DualShock 4 von Windows 7 auf 8 nur einfacher wurde. Ich hoffe, dass dies auch für die Wii-Fernbedienung der Fall ist.
DMGregory
Was ist der Prozess für Dualshock?
John Demetriou
@ John Demetriou, unter Win 8 versetzen Sie es in den Pairing-Modus, indem Sie die Share & PS-Tasten gedrückt halten, bis ein blinkender Blinker in der Lichtleiste angezeigt wird, und fügen ihn dann über den Einstellungsbildschirm für Bluetooth-Geräte hinzu. In Win 7 ist es komplizierter: gamedev.stackexchange.com/questions/87106/… Wir verirren uns jedoch vom Thema - Sie können mich gerne direkt kontaktieren, wenn Sie weitere Informationen wünschen.
DMGregory
0

Obwohl die Antwort von DMGregory wirklich gründlich und gut ist, habe ich eine andere Lösung gefunden, die robuster ist und meinen Anforderungen entspricht. Ich habe eine DLL gefunden (die ich derzeit nicht finden kann, aber irgendwo hochladen und meine Antwort bearbeiten werde, um den Link einzuschließen) und DLLImport und diese Funktionen verwendet

[DllImport ("UniWii")]
private static extern void wiimote_start();
[DllImport ("UniWii")]
private static extern void wiimote_stop();
[DllImport ("UniWii")]
private static extern int wiimote_count();
[DllImport ("UniWii")]
private static extern byte wiimote_getAccX(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getAccY(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getAccZ(int which);
[DllImport ("UniWii")]
private static extern float wiimote_getIrX(int which);
[DllImport ("UniWii")]
private static extern float wiimote_getIrY(int which);
[DllImport ("UniWii")]
private static extern float wiimote_getRoll(int which);
[DllImport ("UniWii")]
private static extern float wiimote_getPitch(int which);
[DllImport ("UniWii")]
private static extern float wiimote_getYaw(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonA(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonB(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonUp(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonLeft(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonRight(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonDown(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButton1(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButton2(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonPlus(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonMinus(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonHome(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getNunchuckStickX(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getNunchuckStickY(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getNunchuckAccX(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getNunchuckAccZ(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonNunchuckC(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonNunchuckZ(int which);

Ich habe es geschafft, mit der WiiMote zu kommunizieren und die Funktionalität zu erhalten, die ich brauche.

Der ursprüngliche Herausgeber der DLL unterstützt sie nicht mehr oder kümmert sich nicht mehr darum. Ich habe ihnen eine E-Mail darüber geschickt und sie haben nach einigen Monaten immer noch nicht geantwortet. Ich fand es jedoch in einem Projekt, das in Google Code gehostet wurde ( hier ). Es ist ein vollständiges Projekt mit Beispielen und der DLL.

BEARBEITEN Denken Sie auch daran, wenn Sie diese DLL für eine kommerzielle Anwendung verwenden möchten, müssen Sie sich an den ursprünglichen Herausgeber wenden, um eine Lizenz zu erhalten (wenn Sie eine Antwort von diesen erhalten). Außerdem hatte ich einige Probleme bei der Verwendung dieser DLL beim Erstellen eines 64-Bit-Computers mit 64-Bit-Unity (wenn sie auf einem 32-Bit-Computer erstellt wurde, war alles in Ordnung und lief perfekt auf 64-Bit- und 32-Bit-Computern).

John Demetriou
quelle
1
Ich bin froh, dass du es sortiert hast! Ich lasse die andere Antwort offen, falls jemand diese Frage durchsucht und eine DLL-freie Option wünscht. Müssen Sie aus Neugier eine Sensorfusion durchführen, um die Beschleunigungsmesser- + Gyroskopmessungen in eine Orientierungsschätzung umzuwandeln? Ich habe einige Erfahrungen damit in Unity, also ruf mich an, wenn du eine Hand damit haben willst. :)
DMGregory
@DMGregory Was meinst du mit Sensorfusion?
John Demetriou
1
Sensorfusion ist, wenn Sie fehlerhafte / begrenzte Messungen von mehreren verschiedenen Sensoren (wie einem Beschleunigungsmesser und einem Geschwindigkeitsgyroskop) durchführen und diese zu einer Konsensschätzung des Gesamtbilds kombinieren - in diesem Fall der Ausrichtung des Geräts. Ein Geschwindigkeitskreisel allein sagt nur etwas über die Änderung der Rotation aus, und ein Beschleunigungsmesser gibt dem Schwerkraftfeld eine durcheinandergebrachte Mischung aus augenblicklicher Beschleunigung und absoluter Orientierung. Durch die Kombination der beiden kann jeder Sensor nach fehlenden Daten oder Rauschen / Drift im anderen suchen.
DMGregory
@ JohnDemetriou Ich bin in der gleichen Situation wie Sie. Können Sie bitte die DLL teilen, die Sie für Sie gefunden haben? Vielen Dank!
Andrei Erdoss
1
@ AndreiErdoss aktualisiert meine Antwort mit Link und zusätzlichen Informationen auf der DLL
John Demetriou