So erstellen Sie einen benutzerdefinierten Gamecontroller mit Arduino und Unity

| Von

arduino-uno-game-controller

Hatten Sie schon einmal vor, Ihren eigenen Videospiel-Controller zu entwickeln? Es ist einfacher als Sie denken!

In diesem kurzen Job werden wir einen unkomplizierten personalisierten Game-Controller 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 außerdem ein einfaches Videospiel erstellen, in dem Sie Ihren Controller verwenden, um sich von herabfallenden Dingen fernzuhalten und auch die Zeit zu verkürzen.

Für dieses Projekt benötigen Sie

  • Arduino oder vergleichbarer Mikrocontroller
  • 1 x 10k Ohm Widerstand
  • 1 x Momentschalter
  • 1 x Potentiometer
  • Anschlussschnüre
  • Ein Steckbrett
  • Unity-Videospiel-Engine
  • Das Uniduino-Plugin aus dem Unity Asset Store ($30)
  • Gesamter Jobcode, falls Sie ihn nicht ausschreiben möchten (enthält nicht das Uniduino-Plugin)

Viele dieser Punkte sind in einem Arduino-Starterkit leicht verfügbar. Wenn Sie kein Starterpaket haben, sehen Sie sich unsere Übersicht an, um das beste für Sie auszuwählen.

Sie können Ihren Controller so kompliziert gestalten, wie Sie möchten, aber für diesen Fall werden wir ein Potentiometer und einen Schalter einrichten – ideal für die Verwaltung eines einfachen Galerie-Videospiels.

Benutzerdefiniertes Controller-Breadboard 670

Zusammenbau Ihres Controllers

Stellen Sie Ihr Steckbrett und Arduino her, wie Sie das unten aufgeführte Bild erhalten haben. Dies werden wir als unseren Videospiel-Controller verwenden, obwohl Sie auch fast das gleiche Setup wie einen DIY-Midi-Controller verwenden können!

Fritzing-Diagramm kommentiert

Vorbereitung Ihres Arduino Your

Wenn Sie alles verkabelt haben, verbinden Sie Ihr Arduino mit USB. Gehen Sie in der Arduino Software IDE zu Geräte > > Platine ebenso gut wie 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 Senden > > Beispiele > > Firmata > > StandardFirmata Klicken Sie auf Hochladen und Sie sind sicherlich bereit zu gehen.

Wenn Sie neu bei Arduino sind und auch Ihr Kopf leicht auftaut, werfen Sie einen Blick auf unseren Anfängerleitfaden, damit Sie ihn perfekt mit Ihrem Computer sprechen können.

Einrichten Ihres Unity-Projekts

Öffnen Sie in Unity Startfenster > > Asset Store um über den Unity-Editor auf den Asset Store von Unity zuzugreifen. Suchen Sie im Asset Store nach dem Uniduino-Plugin. Dieses Plugin wird es Ihnen sicherlich ermöglichen, Daten an und auch von Ihren Arduino-Pins in Unity zu empfangen und zu senden. Das Plugin zum Zeitpunkt der Erstellung kostet $30. Es ist machbar dieses Projekt durchzuführen, ohne das Plugin zu erwerben, obwohl es ziemlich viel schwieriger ist und Sie das Plugin insgesamt leichter finden können.

Unity Asset Store Uniduino

Dieser Videoclip von den Designern des Plugins führt Sie durch den Prozess des Überprüfens aller kleinen Funktionen, zusammen mit der Erstkonfiguration. Beachten Sie, dass Sie möglicherweise auch den Unity-Editor unter Windows zurücksetzen müssen.

Wir können dieses Testpanel verwenden, um unseren Controller zu testen. Stellen Sie Pin D2 auf INPUT und auch auf Digital. Noch weiter unten etabliert Pin A5 auf ANALOG. Ihr Potentiometer und Schalter sollten jetzt neben ihren Pin-Nummern Werte anzeigen. Fortschreiten!

Uniduino-Test

Derzeit etwas zu machen, das wir kontrollieren können

Wir haben also einen Controller, aber was sollen wir schaffen? Nun, die Möglichkeiten sind jedoch grenzenlos, denn heute werden wir ein extrem einfaches Ausweichvideospiel produzieren, um unser brandneues Kontrollsystem zu testen. Wir werden das Videospiel-Setup ziemlich schnell anpassen. Wenn Sie also völlig neu in der Unity-Engine sind, können Sie unser Unity-Spielprogrammier-Anfängerhandbuch entdecken, das hilfreich ist, um sich zu orientieren.

Wir werden ein sehr grundlegendes Spiel bauen, in dem es Ihr Ziel ist, Ihrer Kugel nach links und rechts auszuweichen, um sich von fallenden Würfeln fernzuhalten, die Ihren neu erstellten, angepassten Controller verwenden.

Produziere eine neue Szene und ziehe das Uniduino Prefab aus Anlagen > > Uniduino > > Fertigbau in Ihre Hierarchie und ziehen Sie auch das Uniduino Prefab direkt in die Hierarchie. Wir benötigen es dort, um zwischen unserem Videospiel und dem Controller zu sprechen.

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

Inspektor-Kugel X-Position

Es ist Zeit für die Codierung

Derzeit einige Codes für diese Party enthalten. Klicken Sie mit der in der Hierarchie ausgewählten Runde auf Komponente hinzufügen > > Neues Skript am Ende des Inspektorfensters. Benennen Sie es sphereMover sowie auswählen C scharf aus der herbstlichen Speisenauswahl. Klicken Produzieren und hinzufügen und das Manuskript wird sicherlich in das GameObject aufgenommen. 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.

//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;

//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 eine Minute Zeit, um die Code-Anmerkungen durchzugehen. Bisher haben wir einige Variablen für unser Arduino, seine Pins, sowie unsere Sphere deklariert. Wir haben zusätzlich die

Beginnend sowie ConfigurePins-Methoden zum Initialisieren unseres Arduino zur Laufzeit. Lassen Sie uns unser Manuskript speichern und direkt in den Unity-Editor zurückkehren und auch sehen, was geändert wurde.

Sphere Mover-Skript mit leeren Variablen

Derzeit können wir unsere öffentlichen Variablen im Inspektorfenster sehen. Mal sehen, was wir in dieser Phase eingeben können, um uns später zu helfen. Wir verstehen, welche Pins wir auf dem Arduino von unserem Konstrukt früher verwenden, wir können sie eingeben. Wir wissen auch aus unserem früheren Experiment genau, wie weit wir unsere Kugel sowohl nach links als auch nach rechts bewegen sollen, damit sie den Bildschirm nicht verkleinert. Erlaubt, in diese Werte derzeit einzusteigen.

Sphere Mover-Skript mit Variablen

Erste Lebenszeichen

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

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

Da unsere potValue-Variable in jeder Struktur aktualisiert wird, können wir ihren Wert in der aktuellen Zeit im Unity-Inspektor sehen. Bevor wir es testen, wäre derzeit ein guter Zeitpunkt, um zu überprüfen, ob das Uniduino-Plug-In auf dem entsprechenden Port lauscht. Klicken Sie in der Hierarchie auf Uniduino und überprüfen Sie seinen 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 ganz sicher sind.

Uniduino Check Port ist korrekt

Wählen Sie Ihre Kugel in der Hierarchie aus und klicken Sie oben in der Anzeige auf die Schaltfläche Abspielen. Das System benötigt einige Sekunden zur Initialisierung, danach müssen Sie die Einstellung der Pot-Wert-Variablen im Assessor sehen, wenn Sie das Potentiometer versetzen.

Lebenszeichen 2

Aktuell sprechen wir! Nun, streng genommen chatten Unity und Arduino, aber wer überprüft das? Wenn Sie so viel erhalten haben und die Wertanpassung im Prüfer auch nicht sehen, überprüfen Sie die Anordnungsaktionen und stellen Sie sicher, dass Sie den richtigen Port für Ihr Arduino ausgewählt haben.

Erlaube uns diese Sphäre zu bewegen

Nachdem wir nun die PotValue-Variable aktualisiert haben, möchten wir diesen Wert verwenden, um unsere Kugel zu verschieben. Wenn das Potentiometer ganz nach links steht, möchten wir, dass sich die Runde auf der linken Seite des Displays befindet, sowie umgekehrt. Objekte in Unity werden an einem Faktor im Vektorbereich platziert, der durch den Wert seines Werts ermittelt wird Position umwandeln In dem unten aufgeführten Bild, wo die Runde zum äußersten Punkt nach links geht, würden wir dies sicherlich wünschen, können Sie sehen, dass ihr Positionsvektor 9,5, -4, 0 ist.

Transformationsbeispiel 670

Wir möchten die X-Einstellung des Balls beeinflussen. Leider funktioniert die direkte Verwendung der Werte unseres Potentiometers nicht, da das Potentiometer, wenn es ganz links ist, einen Wert von 0 liefert – was unsere Kugel genau in die Mitte des Displays bringen würde. Im anderen Extrem würde der Leitwert des Potentiometers, 1023, den Würfel weit rechts von unserem Display platzieren. Nicht hilfreich. Was wir unten benötigen, ist etwas Mathematik.

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

Für diejenigen unter Ihnen da draußen, die Angst haben, auf ein Blatt Papier zu starren, das mit unsinnigen Zahlen bedeckt ist (obwohl es einige großartige Websites gibt, die Ihnen beim Lernen von Mathematik helfen können), fürchten Sie sich nicht. Wir brauchen ein Mittel, um unsere Potentiometerwerte der X-Einstellung unserer Kugel anzupassen. Zum Glück können wir ein Erweiterungsmethode

Eine Extension Method ist ein Skript, das eine bestimmte Arbeit für uns erledigt. In dieser Situation geben wir ihm die Werte, die wir haben, und gibt sie auch auf verschiedene andere zurück, die alle in unserem verwendet werden können sphereMover Skript. Klicken Sie oben im Projektfenster auf Produzieren > > C#-Skript und nennen es ExtensionMethods. Gehen Sie in den folgenden Code in das Skript:

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 derzeit in unserem ExtensionMethods-Manuskript in unserer Update-Funktion verwenden, um unsere Potentiometerwerte direkt in verwendbare Werte in unserem Videospiel umzuwandeln. Geben Sie unter „wo wir einfach die Variable potValue zugewiesen haben“ Folgendes ein:

Remap-Funktion

Das Pünktchen zeigt uns, dass unsere Remap 2 Sätze von From- sowie To-Werten nimmt, sowie diese miteinander abbildet. Darin können wir unsere Werte einbringen.

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

Bewahren Sie Ihr Skript auf, gehen Sie zurück zum Unity-Editor und drücken Sie die Wiedergabetaste. Sie müssen jetzt sehen, dass die Variablen des Mapped Pot beim Verschieben des Potentiometers den Werten entsprechen, die wir für unsere linken und rechten Kanten identifiziert haben. Nehmen Sie sich eine Minute Zeit zum Entspannen und danken Sie auch Ihrem ExtensionMethods-Manuskript. Kein Taschenrechner sichtbar.

Mapped Pot

Denken Sie daran: Wenn Sie feststellen, dass Ihre Werte verdreht sind, also wenn Ihr Potentiometer ganz rechts ist, Sie einen negativen Wert für Ihre Mapped Pot-Variable erhalten, haben Sie Ihr Potentiometer möglicherweise falsch herum eingestellt. Die gute Nachricht ist, dass Sie dies ohne Neuverkabelung beheben können. Sie können die Werte lediglich ändern, wenn Sie sie neu zuordnen:

Neuzuordnung wechseln

Aktuell haben wir endlich brauchbare Werte. Derzeit wird lediglich delegiert, diese Werte der X-Position unserer Kugel zuzuordnen:

//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 Manuskript, gehen Sie zurück zum Unity-Editor und drücken Sie auf Play. Sie müssen jetzt die Möglichkeit haben, Ihre Sphäre mit Ihrem Potentiometer nach links und rechts zu verschieben!

Den Knopf zum Laufen bringen

Nun, da wir unsere Sphäre verlagern, wäre es nicht schön, eine Methode zu haben, um die Dinge ein wenig zu verlangsamen, wenn wir in eine schwierige Situation geraten? Wir werden unseren Schalter nutzen, um die Zeit in unserem Spiel zu reduzieren. Öffnen Sie Ihren sphereMover Manuskript, und fügen Sie diesen Code auch 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 Automechanik unseres Spiels, lass uns einige Barrieren einbeziehen! Am ehesten verwenden wir den ganz natürlichen Feind der Sphäre, die Würfel. Klicken Sie in der Hackreihenfolge auf Produzieren > > 3D-Objekt > > Würfel Im Inspektor des Würfels, Komponente einschließen > > Physik > > Starrkörper Legen Sie den Drag-Wert des Starrkörpers auf 5 fest. Wählen Sie im Inspektor unter dem Element Box Collider die Option Is Trigger aus. Dies wird es uns sicherlich ermöglichen, Unfälle mit unserer Sphere zu erkennen.

Entwickeln Sie ein Manuskript auf dem Würfel und nennen Sie es auch kollidieren mit der Kugel , öffnen Sie das Manuskript und löschen Sie auch die Funktionen Start und Update, da wir sie in diesem Moment 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. Unter diesen Umständen informieren wir es, alles zu beschädigen, was es berührt. Speichern Sie das Manuskript und kehren Sie auch 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 Hackreihenfolge blau geworden ist. Denn wir haben ein Prefab entwickelt und in unserer Aufgabe gespeichert. Lösche jetzt deine Würfel aus der Machtstruktur.

Alles, was wir jetzt brauchen, ist ein Skript, um die Würfel zu spawnen. In der Hackordnung klicken Entwickeln > > Leer erstellen , benennen Sie es im Inspektor in Game Manager um und fügen Sie ein Manuskript namens gameManager hinzu. Öffnen Sie das Manuskript und geben Sie diesen Code ein:

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 < 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. Zurück im Editor, wählen Sie den Game Manager in der Machtstruktur und ziehen Sie Ihr Würfel-Prefab aus dem Job-Panel auf die Cube-Variable im Inspector. Senden Sie auch die Werte für Ihr Laichen unten. Sie können damit herumspielen, um es so schwer oder einfach zu machen, wie Sie möchten. Beachten Sie, dass es es verdient, dass Ihre niedrigsten Würfel hoch genug spawnen, damit Uniduino initialisieren kann – das Spiel zu verlieren, bevor Sie die Möglichkeit haben, sich zu verlagern, kann irritierend sein!

Spielmanager

Das fertige Projekt

Wenn Sie derzeit auf Play drücken, werden die Würfel sicherlich über Ihnen erscheinen und fallen. Sie können Ihr Potentiometer verwenden, um sie zu verhindern, und auch Ihre Taste, um die Zeit zu verkürzen.

In diesem Projekt haben wir tatsächlich einen benutzerdefinierten Controller mit einem Arduino erstellt, Unity und auch Uniduino konfiguriert, um sich damit zu verbinden, und auch ein einfaches Videospiel zum Testen produziert. Die Prinzipien hier können auf praktisch jede Art von Aufgabe bezogen werden, und es gibt auch noch Videospiel-Jams, die sich auf maßgeschneiderte Controller konzentrieren

Sowohl mit Arduino als auch mit Unity können Sie aus fast allem einen maßgeschneiderten Controller erstellen. Haben Sie eine Stereoanlage erstellt, die ein Raumfahrzeug reguliert? Ein Toaster, der ein Plattform-Videospiel steuert?

Wenn Sie eine Aufgabe wie diese gemacht haben, würde ich mich sicherlich freuen, sie zu sehen! Poste es in den unten aufgeführten Kommentaren!

Es ist an der Zeit, die Werte unseres Arduino im Unity-Editor zu sehen. Die direkte Verwendung der Werte unseres Potentiometers funktioniert nicht, denn wenn das Potentiometer ganz links ist, liefert es einen Wert von 0 – was unsere Runde direkt in die Mitte des Bildschirms bringen würde. Wir können diese Remap-Funktion derzeit in unserem ExtensionMethods-Manuskript in unserer Update-Funktion verwenden, um unsere Potentiometerwerte direkt in verwendbare Werte in unserem Videospiel umzuwandeln. Hinweis: Wenn Sie feststellen, dass Ihre Werte umgekehrt sind, also wenn Ihr Potentiometer ganz rechts ist, Sie einen ungünstigen Wert für Ihre Mapped Pot-Variable erhalten, haben Sie Ihr Potentiometer möglicherweise auf die falsche Mittelrunde eingestellt.[

Klicken Sie, um diesen Beitrag zu bewerten!
[Gesamt: 0 Durchschnitt: 0]

Andere verwandte Artikel

Schreibe einen Kommentar