So erstellen Sie einen benutzerdefinierten Gamecontroller mit Arduino und Unity

So erstellen Sie einen benutzerdefinierten Gamecontroller mit Arduino und Unity

Wollten Sie schon immer Ihren eigenen Gamecontroller entwerfen? Es ist einfacher als Sie denken!





In diesem kurzen Projekt werden wir einen einfachen benutzerdefinierten Gamecontroller erstellen, der mit der Unity-Spiel-Engine verwendet werden kann. Dieser Controller wird von einem Arduino Uno betrieben, obwohl Sie auch für dieses Projekt eine der vielen Alternativen verwenden können. Wir werden auch ein einfaches Spiel erstellen, 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
  • Anschlussdrähte
  • Ein Steckbrett
  • Unity-Spiel-Engine
  • Das Uniduino-Plugin aus dem Unity Asset Store ()
  • Vollständiger Projektcode, falls Sie ihn nicht ausschreiben möchten (enthält nicht das Uniduino-Plugin)

Die meisten dieser Dinge sind in einem Arduino-Starterkit verfügbar. Wenn Sie kein Starter-Kit haben, lesen Sie unseren Leitfaden, um das beste für Sie auszuwählen.





Sie können Ihren Controller beliebig kompliziert gestalten, aber für dieses Beispiel werden wir ein Potentiometer und einen Knopf einrichten - perfekt für die Steuerung eines einfachen Arcade-Spiels.

Zusammenbau Ihres Controllers

Richten Sie Ihr Steckbrett und Arduino wie im Bild unten gezeigt ein. Dies ist, was wir als unseren Gamecontroller verwenden werden, obwohl Sie fast das gleiche Setup wie ein verwenden können DIY-Midi-Controller auch!



Vorbereitung Ihres Arduino

Sobald Sie alles verkabelt haben, schließen Sie Ihr Arduino über USB an. Gehen Sie in der Arduino Software IDE zu Werkzeuge > Tafel und Extras > Port um auszuwählen, welchen Mikrocontroller und Port Sie verwenden. Die Arduino IDE wird mit der von uns benötigten Skizze geliefert und 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, schauen Sie sich unsere Ratgeber für Anfänger um Ihnen zu helfen, mit Ihrem Computer gut zu kommunizieren.





Einrichten Ihres Unity-Projekts

Öffnen Sie in Unity Fenster > Asset Store um über den Unity-Editor auf den Asset Store von Unity zuzugreifen. Suchen Sie im Asset Store nach dem Uniduino-Plugin. Mit diesem Plugin können Sie Daten zu und von Ihren Arduino-Pins in Unity empfangen und senden. Das Plugin kostet zum Zeitpunkt des Schreibens 30 US-Dollar. Es ist möglich dieses Projekt durchzuführen, ohne das Plugin zu kaufen, obwohl es etwas komplizierter ist und Sie das Plugin möglicherweise insgesamt bequemer finden.

Dieses Video von den Erstellern des Plugins führt Sie durch den Prozess des Testens, dass alles funktioniert, zusammen mit der erstmaligen Einrichtung. Beachten Sie, dass Sie möglicherweise auch den Unity-Editor unter Windows zurücksetzen müssen.





Wir können dasselbe Testpanel verwenden, um unseren Controller zu testen. Stellen Sie Pin D2 auf INPUT und Digital. Stellen Sie Pin A5 weiter unten auf ANALOG. Ihr Potentiometer und Ihre Taste sollten jetzt Werte auf dem Bildschirm neben ihren Pin-Nummern 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 für heute werden wir ein sehr einfaches Ausweichspiel erstellen, um unser neues Steuerungssystem zu testen. Wir werden das Spiel-Setup ziemlich schnell überarbeiten. Wenn Sie also völlig neu in der Unity-Engine sind, finden Sie möglicherweise unsere Anfängerleitfaden für die Unity-Spielprogrammierung nützlich, um sich zu orientieren.

Wir werden ein sehr einfaches Spiel bauen, in dem es Ihr Ziel ist, Ihrer Kugel nach links und rechts auszuweichen, um fallende Würfel zu vermeiden, die Ihren neu erstellten benutzerdefinierten Controller verwenden.

Erstellen Sie eine neue Szene und ziehen Sie das Uniduino Prefab von Anlagen > Uniduino > Fertighäuser in Ihre Hierarchie und ziehen Sie das Uniduino Prefab in die Hierarchie. Wir brauchen es dort, um die Kommunikation zwischen unserem Spiel und dem Controller zu übernehmen.

Klicken Sie in der Unity-Hierarchie auf Erstellen > Kugel und verwenden Sie die Registerkarte „Transformieren“ im Inspektor, um sie an den unteren Rand des Spielbildschirms zu verschieben.

Es ist Zeit für die Codierung

Fügen Sie nun etwas Code zu dieser Party hinzu. Klicken Sie mit der in der Hierarchie ausgewählten Kugel auf Komponente hinzufügen > Neues Skript unten im Inspektorfenster. Benennen Sie es sphereMover und wählen Sie C scharf 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:

using UnityEngine;
using System.Collections;
using Uniduino;
public class sphereMover : MonoBehaviour
{
//Headers aren't scrictly neccesary, but they make life easier back in the Inspector.
[Header('Arduino Variables')]
//we need to declare the Arduino as a variable
public Arduino arduino;
//we need to declare an integer for the pin number of our potentiometer,
//making these variables public means we can change them in the editor later
//if we change the layout of our arduino
public int potPinNumber;
//a float variable to hold the potentiometer value (0 - 1023)
public float potValue;
//we will later remap that potValue to the y position of our capsule and hold it in this variable
public float mappedPot;
//public int for our button pin
public int buttonPinNumber;
[Header('Sphere Variables')]
//variables to hold the values we noted earlier for the sides of our screen
public float leftEdge;
public float rightEdge;
// Use this for initialization
void Start ()
{//and initialize we shall, starting with the Arduino Variable.
//we are only using one arduino, so we can use Arduino.global to grab it.
arduino = Arduino.global;
arduino.Setup(ConfigurePins);
}
void ConfigurePins()
{
//configure the Arduino pin to be analog for our potentiometer
arduino.pinMode(potPinNumber, PinMode.ANALOG);
//Tell the Arduino to report any changes in the value of our potentiometer
arduino.reportAnalog(5, 1);
//configure our 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 Sphere deklariert. Wir haben auch die

Start- und ConfigurePins-Methoden, um unser Arduino zur Laufzeit zu initialisieren. Speichern wir unser Skript und gehen Sie zurück in den Unity-Editor und sehen Sie, was sich geändert hat.

Wir können jetzt unsere öffentlichen Variablen im Inspektorfenster sehen. Mal sehen, was wir in dieser Phase eingeben können, um uns später zu helfen. Wir wissen, welche Pins wir auf dem Arduino von unserem früheren Build verwenden, wir können sie eingeben. Wir wissen auch aus unserem früheren Experiment, wie weit unsere Kugel nach links und rechts wandern soll, damit sie nicht vom Bildschirm fällt. Geben wir diese Werte jetzt ein.

Erste Lebenszeichen

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

void Update ()
{
//We assign the value the arduino is reading from our potentionmeter to our potValue variable
potValue = arduino.analogRead(potPinNumber);
}

Da nun unsere potValue-Variable bei jedem Frame aktualisiert wird, können wir ihren 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 auf dem richtigen Port lauscht. Klicken Sie in der Hierarchie auf Uniduino und überprüfen Sie den Portnamen im Inspektor. Wenn es leer ist, geben Sie die richtige Portnummer für Ihr Arduino ein. In diesem Fall war es COM4, ​​obwohl es bei Ihnen anders sein kann. Überprüfen Sie mit der Arduino IDE, wenn 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 sehen, wie sich die Pot Value-Variable im Inspector ändert, wenn Sie das Potentiometer bewegen.

Jetzt reden wir! Nun, genau genommen reden Unity und der Arduino, aber wer zählt? Wenn Sie so weit gekommen sind und die Wertänderung im Inspektor nicht sehen, überprüfen Sie die Einrichtungsschritte und stellen Sie sicher, dass Sie den richtigen Port für Ihr Arduino ausgewählt haben.

Lasst uns diese Sphäre bewegen

Nachdem wir nun die PotValue-Variable aktualisiert haben, möchten wir diesen Wert verwenden, um unsere Kugel zu bewegen. Wenn das Potentiometer ganz nach links steht, soll sich die Kugel auf der linken Seite des Bildschirms befinden und umgekehrt. Objekte in Unity werden an einem Punkt im Vektorraum positioniert, der durch die Werte seiner Position umwandeln . Im unteren Bild, wo sich die Kugel am weitesten links befindet, können Sie sehen, dass ihr Positionsvektor 9,5, -4, 0 ist.

Wir wollen die X-Position der Kugel beeinflussen. Leider funktioniert die direkte Verwendung der Werte unseres Potentiometers nicht, da wenn das Potentiometer ganz links ist, es einen Wert von 0 ergibt - was unsere Kugel genau in die Mitte des Bildschirms bringen würde. Im anderen Extrem würde der Spitzenwert des Potentiometers, 1023, den Würfel weit rechts von unserem Bildschirm platzieren. Nicht nützlich. Was wir hier brauchen, ist etwas Mathematik.

Warum Mathe machen, wenn Unity es für Sie erledigt?

Für diejenigen unter euch da draußen, die sich davor fürchten, auf ein Blatt Papier zu starren, das mit unsinnigen Zahlen bedeckt ist (obwohl es einige gibt tolle Webseiten das kann dir helfen, Mathe zu lernen), fürchte dich nicht. Wir brauchen eine Möglichkeit, unsere Potentiometerwerte so einzustellen, dass sie der X-Position unserer Kugel entsprechen. Zum Glück können wir ein 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 er gibt sie einander zugeordnet zurück, damit sie in unserem verwendet werden können sphereMover Skript. Klicken Sie oben im Projektfenster auf Erstellen > C#-Skript und nennen Sie es ExtensionMethods. Geben Sie den folgenden Code in das Skript ein:

using UnityEngine;
using System.Collections;
public static class ExtensionMethods {

//our handy dandy Remapper function
public static float Remap (this float value, float from1, float to1, float from2, float to2)
{
return (value - from1) / (to1 - from1) * (to2 - from2) + from2;
}
}

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

Die Eingabeaufforderung zeigt uns, dass unsere Remap zwei Sätze von Von- und Bis-Werten nimmt und sie zusammen zuordnet. Darin können wir unsere Werte einbringen.

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

Speichern Sie Ihr Skript, gehen Sie zurück zum Unity-Editor und klicken Sie auf die Wiedergabetaste. Sie sollten jetzt sehen, dass sich die Variable Mapped Pot ändert, wenn Sie das Potentiometer bewegen, um den Werten zu entsprechen, die wir für unsere linken und rechten Kanten 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, also wenn Ihr Potentiometer ganz rechts steht, Sie einen negativen Wert für Ihre Mapped Pot-Variable erhalten, haben Sie Ihr Potentiometer möglicherweise falsch herum eingestellt. Glücklicherweise können Sie dies beheben, ohne eine Neuverkabelung vorzunehmen. Sie können die Werte einfach ändern, 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:

kostenlose Filme keine Anmeldung oder Download
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Speichern Sie Ihr Skript, gehen Sie zurück zum Unity-Editor und drücken Sie auf Play. Sie sollten Ihre Kugel jetzt mit Ihrem Potentiometer nach links und rechts bewegen können!

Den Knopf zum Laufen bringen

Jetzt, wo sich unsere Kugel bewegt, wäre es nicht schön, eine Möglichkeit zu haben, die Dinge ein wenig zu verlangsamen, wenn wir in eine Enge geraten? Wir werden unsere Taste verwenden, um die Zeit in unserem Spiel zu verlangsamen. Öffnen Sie Ihr sphereMover-Skript und fügen Sie diesen Code zu Ihrer Update-Funktion hinzu

//if Unity detects the button is being pressed, the time scale slows down
if (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 > Starrkörper . Setzen Sie den Drag-Wert des Rigidbody auf 5. Wählen Sie außerdem unter der Box Collider-Komponente im Inspektor die Option Is Trigger. Dadurch können wir Kollisionen mit unserer Sphäre erkennen.

Erstellen Sie ein Skript auf dem Würfel und rufen Sie es auf kollidieren mit der Kugel , öffnen Sie das Skript und löschen Sie die Funktionen Start und Update, da wir sie diesmal nicht benötigen. Geben Sie diesen Code ein:

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

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

Jetzt brauchen wir nur noch ein Skript, um die Würfel zu spawnen. In der Hierarchie klicken Erstellen > Leer erstellen , benennen Sie es im Inspektor in Game Manager um und fügen Sie ein Skript namens gameManager hinzu. Öffnen Sie das Skript und fügen Sie diesen Code hinzu:

using UnityEngine;
using System.Collections;
public class gameManager : MonoBehaviour {
//a variable to hold the prefab we want to spawn
public GameObject cube;
//we want some variables to decide how any cubes to spawn
//and how high above us we want them to spawn
public int numberToSpwan;
public float lowestSpawnheight;
public float highestSpawnheight;
// Use this for initialization
void Start ()
{
for (int i = 0; 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-Präfab aus dem Projektfenster in die Cube-Variable im Inspektor. Tragen Sie hier auch die Werte für Ihr Laichen ein. Sie können damit herumspielen, 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 spawnen, damit Uniduino initialisiert werden kann – das Spiel zu verlieren, bevor Sie sich bewegen können, kann frustrierend sein!

Das fertige Projekt

Wenn Sie jetzt auf Play drücken, erscheinen die Würfel über Ihnen 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 konfiguriert und ein einfaches Spiel zum Testen erstellt. Die Konzepte hier können auf fast jedes Projekt angewendet werden, und es gibt sogar Game Jams, die sich auf benutzerdefinierte Controller spezialisiert haben .

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

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

Teilen Teilen Tweet Email 6 Audible-Alternativen: Die besten kostenlosen oder günstigen Hörbuch-Apps

Wenn Sie keine Lust haben, für Hörbücher zu bezahlen, finden Sie hier einige großartige Apps, mit denen Sie sie kostenlos und legal anhören können.

Weiter lesen
Verwandte Themen
  • Heimwerken
  • Programmierung
  • Arduino
  • Spielcontroller
  • Spieleentwicklung
Über den Autor Ian Buckley(216 veröffentlichte Artikel)

Ian Buckley lebt als freiberuflicher Journalist, Musiker, Performer und Videoproduzent in Berlin. Wenn er nicht gerade schreibt oder auf der Bühne steht, bastelt er an DIY-Elektronik oder Code herum, in der Hoffnung, ein verrückter Wissenschaftler zu werden.

Mehr von Ian Buckley

Abonniere unseren Newsletter

Abonnieren Sie unseren Newsletter für technische Tipps, Rezensionen, kostenlose E-Books und exklusive Angebote!

Klicken Sie hier, um sich zu abonnieren