Erstellen eines benutzerdefinierten Gamecontrollers mit Arduino und Unity

Erstellen eines benutzerdefinierten Gamecontrollers mit Arduino und Unity / DIY

Wollten Sie schon immer einen eigenen Gamecontroller entwerfen? Es ist einfacher als du denkst!

In diesem kurzen Projekt werden wir einen einfachen benutzerdefinierten Gamecontroller erstellen, der mit der Unity-Game-Engine verwendet werden kann. Dieser Controller wird von einem Arduino Uno angetrieben, obwohl Sie eine der vielen Alternativen des Arduino Buying Guide verwenden könnten: Welches Board sollten Sie erhalten? Arduino Buying Guide: Welches Board sollten Sie bekommen? Es gibt so viele verschiedene Arten von Arduino-Boards, dass Sie sich verwechseln könnten. Was solltest du für dein Projekt kaufen? Lassen Sie uns mit diesem Arduino Einkaufsführer helfen! Lesen Sie dort auch mehr für dieses Projekt. Wir erstellen auch ein Basisspiel, in dem Sie Ihren Controller verwenden, um herabfallende Gegenstände zu vermeiden und die Zeit zu verlangsamen.

Für dieses Projekt benötigen Sie

  • Arduino oder ähnlicher Mikrocontroller
  • 1 x 10k Ohm Widerstand
  • 1 x Momentschalter
  • 1 x Potentiometer
  • Drähte anschließen
  • Ein Steckbrett
  • Unity-Spielengine
  • Das Uniduino-Plugin aus dem Unity Asset Store (30 US-Dollar)
  • Vollständiger Projektcode, falls Sie ihn nicht ausschreiben möchten (das Uniduino-Plugin nicht enthalten)

Die meisten dieser Dinge sind in einem Arduino-Starter-Kit erhältlich. Wenn Sie noch kein Starter-Kit haben, lesen Sie unseren Leitfaden zur Auswahl der besten 4 besten Starter-Kits für Arduino-Anfänger. 4 Besten Starter-Kits für Arduino-Anfänger. Es gibt viele großartige Arduino-Anfängerprojekte, mit denen Sie anfangen können, aber Sie werden Ich brauche zuerst ein Arduino und einige Komponenten. Hier ist unsere Auswahl aus 4 der besten Starter-Kits für… Lesen Sie mehr für Sie.

Sie können Ihren Controller so kompliziert gestalten, wie Sie möchten, aber für dieses Beispiel werden wir ein Potentiometer und eine Taste einrichten - perfekt für die Steuerung eines einfachen Arcade-Spiels.

Controller zusammenbauen

Richten Sie Ihr Steckbrett und Arduino wie in der Abbildung unten gezeigt ein. Dies ist, was wir als unseren Game-Controller verwenden werden, obwohl Sie fast das gleiche Setup wie ein DIY-Midi-Controller verwenden können. So erstellen Sie einen MIDI-Controller mit einem Arduino. So erstellen Sie einen MIDI-Controller mit einem Arduino. Als Musiker, der sich angehäuft hat Das bescheidene Arduino ist eine Sammlung von Musikinstrumenten und Noise-Boxen. Es ist das perfekte Werkzeug, um einen benutzerdefinierten MIDI-Controller zu erstellen. Lesen Sie auch mehr!

Arduino vorbereiten

Wenn Sie alles angeschlossen haben, schließen Sie Ihr Arduino über USB an. In Arduino Software IDE gehen Sie zu Extras> Platine und Extras> Port Wählen Sie, welchen Mikrocontroller und Port Sie verwenden. Die Arduino IDE wird mit der von uns benötigten Skizze ausgeliefert. Sie finden sie unter Datei> Beispiele> Firmata> StandardFirmata. Klicken Sie auf Hochladen und Sie können loslegen.

Wenn Sie neu bei Arduino sind und Ihr Kopf leicht schmilzt, lesen Sie unseren Anfängerleitfaden Erste Schritte mit Arduino: Ein Anfängerleitfaden Erste Schritte mit Arduino: Ein Anfängerleitfaden Arduino ist eine Open-Source-Plattform für Prototyping-Elektronik, die auf flexiblen, einfach zu bedienenden Plattformen basiert Verwenden Sie Hardware und Software. Es ist für Künstler, Designer, Hobbyisten und alle gedacht, die interaktive Objekte oder Umgebungen erstellen möchten. Lesen Sie weiter, damit Sie mit Ihrem Computer gut sprechen können.

Einrichten Ihres Unity-Projekts

In der Einheit öffnen Fenster> Asset Store Zugriff auf den Asset Store von Unity aus dem Unity Editor. Suchen Sie im Asset Store nach dem Uniduino-Plugin. Mit diesem Plugin können Sie Daten von und zu Ihren Arduino-Pins in Unity empfangen und senden. Das Plugin kostet zum Zeitpunkt des Schreibens 30 US-Dollar. Es ist möglich, dieses Projekt ohne Kauf des Plugins durchzuführen, obwohl es etwas komplizierter ist und Sie das Plugin möglicherweise für alle geeignet finden.

Dieses Video von den Erstellern des Plugins führt Sie durch den Prozess des Testens, dass alles funktioniert, sowie das erstmalige Setup. Beachten Sie, dass Sie möglicherweise auch den Unity-Editor unter Windows zurücksetzen müssen.

Mit diesem Testpanel können wir unseren Controller testen. Stellen Sie Pin D2 auf INPUT und Digital. Setzen Sie Pin A5 weiter unten auf ANALOG. Ihr Potentiometer und Ihre Taste sollten jetzt neben ihrer Pin-Nummer Werte auf dem Bildschirm anzeigen. Fortschritt!

Jetzt etwas machen, das wir kontrollieren können

Wir haben also einen Controller, aber was sollen wir kontrollieren? Nun, die Möglichkeiten sind endlos, aber heute werden wir ein sehr einfaches Ausweichspiel erstellen, um unser neues Steuersystem zu testen. Wir werden das Spiel-Setup ziemlich schnell durchgehen. Wenn Sie also völlig neu in der Unity-Engine sind, finden Sie vielleicht unser Unity-Programmierhandbuch für Anfänger. Programmieren eines Spiels mit Unity: eines Anfängerhandbuchs Programmieren eines Spiels mit Unity: eines Anfängerhandbuchs in der Entwicklung Unity hat sich als Entwicklungsstandort für Indie-Spiele entwickelt. Aufgrund seiner niedrigen Kosten, seiner einfachen Bedienbarkeit und seines umfangreichen Funktionsumfangs ist es ideal für die schnelle Entwicklung von Spielen geeignet. Lesen Sie weitere nützliche Informationen, um sich zu orientieren.

Wir werden ein sehr einfaches Spiel erstellen, in dem Sie Ihre Kugel nach links und rechts ausweichen müssen, um zu vermeiden, dass Würfel fallen, die Ihren neuen benutzerdefinierten Controller verwenden.

Erstellen Sie eine neue Szene und ziehen Sie das Uniduino-Fertighaus aus Assets> Uniduino> Prefabs in Ihre Hierarchie und ziehen Sie das Uniduino-Fertighaus in die Hierarchie. Wir brauchen es dort, um zwischen unserem Spiel und dem Controller zu sprechen.

Klicken Sie in der Unity-Hierarchie auf Erstellen> Kugel Klicken Sie im Inspector auf die Registerkarte "Transformieren", um sie an den unteren Rand des Spielbildschirms zu verschieben.

Es ist Zeit für die Codierung

Nun, um dieser Partei etwas Code hinzuzufügen. Klicken Sie mit der in der Hierarchie ausgewählten Kugel auf Komponente hinzufügen> Neues Skript am unteren Rand des Inspector-Fensters. Nennen Sie es sphereMover und wählen Sie C Sharp aus dem Dropdown-Menü. Klicken Erstellen und hinzufügen und das Skript wird dem GameObject hinzugefügt. Doppelklicken Sie darauf, um das Skript zu öffnen, und geben Sie diesen Code ein:

mit UnityEngine; using System.Collections; mit Uniduino; public class sphereMover: MonoBehaviour // Header sind nicht unbedingt notwendig, aber sie erleichtern das Leben im Inspector. [Header ("Arduino-Variablen")] // Wir müssen den Arduino als Variable public deklarieren. Arduino Arduino; // Wir müssen eine ganze Zahl für die Pin-Nummer unseres Potentiometers deklarieren. // Wenn diese Variablen öffentlich gemacht werden, können wir sie später im Editor ändern. // Wenn wir das Layout unseres Arduino ändern, public int potPinNumber; // eine Float-Variable, die den Potentiometerwert (0 - 1023) hält public float potValue; // Wir werden diesen PotValue später der y-Position unserer Kapsel zuordnen und in dieser Variablen halten. public float mappedPot; // public int für unseren Button pin public int buttonPinNumber; [Header ("Sphere Variables")] // Variablen für die Werte, die wir zuvor für die Seiten unseres Bildschirms notiert haben public float leftEdge; public float rightEdge; // Verwenden Sie dies für die Initialisierung void Start () // und initialisieren Sie uns, beginnend mit der Arduino-Variablen. // Wir verwenden nur ein Arduino, also können wir Arduino.global verwenden, um es zu packen. Arduino = Arduino.global; arduino.Setup (ConfigurePins);  void ConfigurePins () // konfiguriert den Arduino-Pin so, dass er für unser Potentiometer analog ist arduino.pinMode (potPinNumber, PinMode.ANALOG); // Teilen Sie dem Arduino mit, dass er Änderungen des Potentiometers melden muss. Arduino.reportAnalog (5, 1); // konfiguriere unseren Button-Pin arduino.pinMode (buttonPinNumber, PinMode.INPUT); arduino.reportDigital ((Byte) (buttonPinNumber / 8), 1); 

Nehmen Sie sich einen Moment Zeit, um die Codekommentare durchzulesen. Bisher haben wir einige Variablen für unser Arduino, seine Pins und unsere Kugel definiert. Wir haben auch die verwendet
Starten Sie und ConfigurePins-Methoden, um Arduino zur Laufzeit zu initialisieren. Speichern Sie unser Skript und gehen Sie zurück in den Unity-Editor, um zu sehen, was sich geändert hat.

Wir können jetzt unsere öffentlichen Variablen im Inspektorfenster sehen. Mal sehen, was wir zu diesem Zeitpunkt tun können, um uns später zu helfen. Wir wissen, welche Pins wir auf dem Arduino von unserem Build verwendet haben, wir können sie eingeben. Wir wissen auch aus unserem Experiment früher, wie weit wir wollen, dass unsere Kugel sich nach links und rechts bewegen kann, damit sie nicht vom Bildschirm fällt. Geben Sie diese Werte jetzt ein.

Erste Lebenszeichen

Es ist an der Zeit, Werte aus unserem Arduino im Unity Editor zu sehen. Im Moment können wir der Update-Funktion unseres SphereMover-Skripts eine Zeile Code hinzufügen und das Skript erneut speichern.

void Update () // Wir weisen der PotValue-Variablen den Wert zu, den der Arduino von unserem Potentionmeter liest. potValue = arduino.analogRead (potPinNumber);  

Jetzt, da unsere potValue-Variable für jeden Frame aktualisiert wird, können wir den Wert in Echtzeit im Unity-Inspektor sehen. Bevor wir es testen, wäre jetzt ein guter Zeitpunkt, um zu überprüfen, ob das Uniduino-Plug-In den richtigen Port hört. Klicken Sie in der Hierarchie auf Uniduino und überprüfen Sie den Portnamen im Inspector. Wenn es leer ist, geben Sie die korrekte Portnummer für Ihr Arduino ein. In diesem Fall war es COM4, ​​obwohl es für Sie anders sein kann. Überprüfen Sie mithilfe der Arduino IDE, ob Sie sich nicht sicher sind.

Wählen Sie Ihre Kugel in der Hierarchie aus und klicken Sie oben auf dem Bildschirm auf die Schaltfläche Abspielen. Das System benötigt einige Sekunden zur Initialisierung. Danach sollten Sie die Änderung der Pot-Wert-Variable im Inspektor sehen, wenn Sie das Potentiometer bewegen.

Jetzt reden wir! Nun, genau genommen sprechen Unity und der Arduino, aber wer zählt? Wenn Sie bis hierher gekommen sind und die Wertänderung im Inspector nicht angezeigt wird, überprüfen Sie die Setup-Schritte und vergewissern Sie sich, dass der richtige Port für Ihr Arduino ausgewählt ist.

Lass uns diese Sphäre verschieben

Jetzt, da wir die PotValue-Variable gerade aktualisiert haben, möchten wir diesen Wert verwenden, um unsere Sphäre zu verschieben. Wenn das Potentiometer ganz nach links ist, möchten wir, dass sich die Kugel auf der linken Seite des Bildschirms befindet und umgekehrt. Objekte in Unity werden an einem Punkt im Vektorraum positioniert, der durch die Werte der Transform.position bestimmt wird. In der Abbildung unten, wo sich die Kugel am weitesten links befindet, möchten wir sie haben. Sie können sehen, dass der Positionsvektor 9,5, -4, 0 ist.

Wir möchten die X-Position der Kugel beeinflussen. Leider funktioniert die direkte Verwendung der Werte unseres Potentiometers nicht, da das Potentiometer ganz links steht und einen Wert von 0 ergibt, wodurch sich unsere Kugel in der Mitte des Bildschirms befindet. Im anderen Extremfall würde der Potentiometer-Höchstwert 1023 den Würfel rechts neben unserem Bildschirm platzieren. Nicht nützlich. Was wir hier brauchen, ist etwas Mathematik.

Warum Mathe, wenn die Einheit es für Sie tun wird??

Für diejenigen von euch, die Angst davor haben, auf ein Stück Papier zu starren, das mit unsinnigen Zahlen bedeckt ist (obwohl es einige großartige Websites gibt. Die 20 Websites, die Sie brauchen, um Mathe zu lernen Die besten Websites für jedes Niveau, damit Sie systematisch lernen können, Mathematik jeweils nur für eine Stufe besser verstehen und Spaß haben! Lesen Sie mehr, damit Sie Mathe lernen können. Wir brauchen eine Möglichkeit, unsere Potentiometerwerte an die X-Position unserer Kugel anzupassen. Glücklicherweise können wir eine verwenden Erweiterungsmethode.

Eine Erweiterungsmethode ist ein Skript, das eine bestimmte Aufgabe für uns erledigt. In diesem Fall geben wir ihm die Werte, die wir haben, und gibt sie einander zugeordnet wieder, bereit, in unserem verwendet zu werden sphereMover Skript. Klicken Sie oben im Projektfenster auf Erstellen Sie> C # -Skript und nennen Sie es ExtensionMethods. Geben Sie den Code unten in das Skript ein:

mit UnityEngine; using System.Collections; Öffentliche statische Klasse ExtensionMethods // Unsere praktische Dandy-Remapper-Funktion. von2) + von2; 

Speichern Sie das Skript und kehren Sie zu Ihrem SphereMover-Skript zurück. Wir können diese Remap-Funktion in unserem ExtensionMethods-Skript in unserer Update-Funktion verwenden, um unsere Potentiometerwerte in nützliche Werte in unserem Spiel umzuwandeln. Geben Sie unter dem Punkt, an dem wir gerade die potValue-Variable zugewiesen haben, Folgendes ein:

Die Eingabeaufforderung zeigt uns, dass unsere Remap zwei Gruppen von Von- und Bis-Werten verwendet und diese zusammenordnet. Darin können wir unsere Werte eintragen.

mappedPot = potValue.Remap (0, 1023, leftEdge, rightEdge);

Speichern Sie Ihr Skript, kehren Sie zum Unity-Editor zurück und drücken Sie die Wiedergabetaste. Sie sollten nun sehen, dass sich die Variable "Mapped Pot" ändert, wenn Sie das Potentiometer bewegen, um den Werten zu entsprechen, die wir für unsere linke und rechte Kante ermittelt haben. Nehmen Sie sich einen Moment Zeit, um sich zurückzulehnen und Ihrem ExtensionMethods-Skript zu danken. Kein Taschenrechner in Sicht.

Hinweis: Wenn Sie feststellen, dass Ihre Werte umgekehrt sind, und wenn Ihr Potentiometer ganz rechts ist, erhalten Sie einen negativen Wert für Ihre Mapped Pot-Variable. Möglicherweise haben Sie Ihr Potentiometer falsch herum eingerichtet. Glücklicherweise können Sie dies beheben, ohne eine Neuverkabelung vorzunehmen. Sie können die Werte einfach wechseln, wenn Sie sie neu zuordnen:

Jetzt haben wir endlich brauchbare Werte. Jetzt müssen Sie nur noch diese Werte der X-Position unserer Kugel zuweisen:

// Weisen Sie den zugeordneten Pot-Wert der x-Position der Kugel zu. Transform.position = new Vector3 (mappedPot, transform.position.y, transform.position.z);

Speichern Sie Ihr Skript, kehren Sie zum Unity-Editor zurück und drücken Sie die Play-Taste. Sie sollten jetzt in der Lage sein, Ihre Kugel mit Ihrem Potentiometer nach links und rechts zu bewegen!

Den Button zum Laufen bringen

Nun, da sich unsere Sphäre bewegt, wäre es nicht schön, wenn wir die Dinge ein wenig verlangsamen könnten, wenn wir an einem engen Ort sind? Wir werden unseren Button verwenden, um die Zeit in unserem Spiel zu verlangsamen. Öffnen Sie Ihr SphereMover-Skript und fügen Sie diesen Code zu Ihrer Aktualisierungsfunktion hinzu

// Wenn Unity erkennt, dass die Taste gedrückt wird, verlangsamt sich die Zeitskala, wenn (arduino.digitalRead (buttonPinNumber) == 1) Time.timeScale = 0.4f;  else Time.timeScale = 1.0f;

Jetzt haben wir die Mechanik unseres Spiels, fügen wir einige Hindernisse hinzu! Wir werden den natürlichen Feind der Kugel verwenden, den Würfel. Klicken Sie in der Hierarchie auf Erstellen> 3D-Objekt> Würfel. Im Inspektor des Würfels, Komponente hinzufügen> Physik> Rigidbody. Setzen Sie den Drag-Wert des steifen Körpers auf 5. Wählen Sie außerdem im Inspektor unter der Box-Collider-Komponente Is Trigger. Auf diese Weise können wir Kollisionen mit unserer Kugel erkennen.

Erstellen Sie ein Skript im Cube und rufen Sie es auf collideWithSphere, Öffnen Sie das Skript und löschen Sie die Start- und Aktualisierungsfunktionen, da wir sie diesmal nicht benötigen. Geben Sie diesen Code ein:

mit UnityEngine; using System.Collections; public class collideWithSphere: MonoBehaviour void OnTriggerEnter (Collider andere) Destroy (other.gameObject); 

OnTriggerEnter sendet eine Nachricht, wenn der Trigger-Collider einen anderen Collider trifft. In diesem Fall fordern wir es auf, alles zu zerstören, was es berührt. Speichern Sie das Skript und kehren Sie zum Unity-Editor zurück. Ziehen Sie den Würfel aus der Hierarchie in das Projektfenster. Sie werden feststellen, dass der Text des Würfels in der Hierarchie blau ist. Dies liegt daran, dass wir ein Fertigteil erstellt und in unserem Projekt gespeichert haben. Löschen Sie jetzt Ihren Würfel aus der Hierarchie.

Jetzt brauchen wir nur noch ein Skript, um die Würfel zu erzeugen. Klicken Sie in der Hierarchie auf Erstellen> Leer erstellen, und benennen Sie ihn im Inspector in Game Manager um und fügen Sie ihm ein Skript namens gameManager hinzu. Öffnen Sie das Skript und fügen Sie diesen Code hinzu:

mit UnityEngine; using System.Collections; public class gameManager: MonoBehaviour // eine Variable, die das Prefab enthält, in dem der öffentliche GameObject-Cube angezeigt werden soll; // Wir möchten, dass einige Variablen entscheiden, wie Würfel erzeugt werden sollen // und wie hoch wir über uns wollen, dass sie public int numberToSpwan erzeugen. public float LowestSpawnheight; öffentlicher Float höchster Spawnheight; // Verwenden Sie dies für die Initialisierung void Start () für (int i = 0; i < numberToSpwan; i++)  Instantiate(cube, new Vector3(Random.Range(-9, 9), Random.Range(lowestSpawnheight, highestSpawnheight), 0), Quaternion.identity);   // Update is called once per frame void Update ()   

Speichern Sie das Skript. Wählen Sie im Editor den Game Manager in der Hierarchie aus, und ziehen Sie Ihr Cube-Prefab aus dem Projektfenster in die Cube-Variable im Inspektor. Tragen Sie auch hier die Werte für Ihr Laichen ein. Sie können damit umgehen, um es so schwer oder einfach zu machen, wie Sie möchten. Beachten Sie, dass es sich lohnt, Ihre niedrigsten Würfel hoch genug zu haben, damit Uniduino initialisiert werden kann. Wenn Sie das Spiel verlieren, bevor Sie sich bewegen können, kann dies frustrierend sein!

Das fertige Projekt

Wenn Sie jetzt auf play drücken, werden die Würfel über Ihnen erscheinen und fallen. Sie können Ihr Potentiometer verwenden, um sie zu vermeiden, und Ihre Taste, um die Zeit zu verlangsamen.

In diesem Projekt haben wir einen benutzerdefinierten Controller mit einem Arduino erstellt, Unity und Uniduino für die Kommunikation mit diesem konfiguriert und ein einfaches Spiel zum Testen erstellt. Die Konzepte hier können auf nahezu jedes Projekt angewendet werden, und es gibt sogar Spielstaus, die auf benutzerdefinierte Controller spezialisiert sind.

Mit Arduino und Unity können Sie aus fast allem einen benutzerdefinierten Controller erstellen. Haben Sie eine HiFi-Anlage erstellt, die ein Raumfahrzeug steuert? Ein Toaster, der ein Plattformspiel steuert?

Wenn Sie ein Projekt wie dieses gemacht haben, würde ich es gerne sehen! Poste es in den Kommentaren unten!

Erfahren Sie mehr über: Arduino, Game Controller, Spieleentwicklung, Programmierung.