Wolltest du schon immer deinen eigenen Gamecontroller entwerfen? Es ist einfacher als du denkst!
In diesem kurzen Projekt werden wir einen einfachen benutzerdefinierten Game-Controller erstellen, der mit der Unity-Game-Engine verwendet werden kann. Dieser Controller wird von einem Arduino Uno angetrieben, obwohl Sie eine der vielen Alternativen Arduino Buying Guide: Welchen Rat sollten Sie bekommen? Arduino Einkaufsführer: Welches Board sollten Sie bekommen? Es gibt so viele verschiedene Arten von Arduino Boards da draußen, es wäre dir vergeben, wenn du verwirrt bist. Was sollten Sie für Ihr Projekt kaufen? Lassen Sie uns helfen, mit diesem Arduino Einkaufsführer! Lesen Sie auch dort mehr für dieses Projekt. Wir werden auch ein Basisspiel erstellen, in dem Sie Ihren Controller verwenden, um fallende Objekte 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-Spielengine
- Das Uniduino-Plugin von Unity Asset Store ($ 30)
- Kompletter Projektcode, falls Sie ihn nicht schreiben möchten (nicht das Uniduino-Plugin)
Die meisten dieser Dinge sind in einem Arduino Starter Kit verfügbar. Wenn Sie kein Starter-Kit haben, lesen Sie unsere Anleitung zur Auswahl der besten 4 besten Starter-Kits für Arduino-Anfänger. 4 Beste Starter-Kits für Arduino-Anfänger Es gibt viele großartige Anfänger-Arduino-Projekte, mit denen Sie beginnen können, aber Sie werden brauche zuerst ein Arduino und einige Komponenten. Hier ist unsere Auswahl von 4 der besten Starter-Kits für ... Lesen Sie mehr für Sie.
Sie können Ihren Controller so kompliziert machen, wie Sie es wünschen, aber für dieses Beispiel werden wir ein Potentiometer und einen Knopf einrichten - perfekt für die Steuerung eines einfachen Arcade-Spiels.
Montage Ihres Controllers
Richten Sie Ihr Steckbrett und Arduino wie in der Abbildung unten gezeigt ein. Dies ist, was wir als unser Spielsteuerpult verwenden werden, obwohl Sie fast das selbe Setup wie ein DIY Midi-Controller verwenden konnten. Wie man einen MIDI-Controller mit einem Arduino macht Wie man einen MIDI-Controller mit einem Arduino macht Als Musiker, der angesammelt hat eine Sammlung von Musikinstrumenten und Noise-Boxen, das bescheidene Arduino ist das perfekte Werkzeug, um einen benutzerdefinierten MIDI-Controller zu erstellen. Lesen Sie auch mehr!
Bereiten Sie Ihr Arduino vor
Sobald Sie alles verdrahtet haben, schließen Sie Ihren Arduino über USB an. In der Arduino Software IDE gehen Sie zu Tools> Board und Tools> Port, um auszuwählen, welchen Mikrocontroller und welchen Port Sie verwenden. Die Arduino IDE wird zusammen mit der benötigten Skizze geliefert . Sie finden sie unter Datei> Beispiele> Firmata> StandardFirmata . Klicken Sie auf Hochladen und schon können Sie loslegen.
Wenn Sie neu bei Arduino sind und Ihr Kopf etwas schmilzt, lesen Sie unseren Anfängerleitfaden. Erste Schritte mit Arduino: Ein Anfängerhandbuch Erste Schritte mit Arduino: Ein Anfängerhandbuch Arduino ist eine Open-Source-Prototyping-Plattform für Elektronik, die auf flexiblen, einfach zu bedienenden Plattformen basiert Verwenden Sie Hardware und Software. Es richtet sich an Künstler, Designer, Bastler und alle, die interaktive Objekte oder Umgebungen erstellen möchten. Lesen Sie mehr, damit Sie mit Ihrem Computer gut kommunizieren können.
Einrichten Ihres Unity-Projekts
Öffnen Sie in Unity " Fenster"> "Asset Store", um im Unity-Editor auf den Asset Store von Unity zuzugreifen. Durchsuchen Sie den Asset Store nach dem Uniduino-Plugin. Mit diesem Plugin können Sie Daten von und zu Ihren Arduino-Pins innerhalb von Unity empfangen und senden. Das Plugin kostet zum Zeitpunkt des Schreibens $ 30. Es ist möglich, dieses Projekt zu machen, ohne das Plugin zu kaufen, obwohl es etwas komplizierter ist und Sie das Plugin möglicherweise bequemer finden.
Dieses Video von den Machern des Plugins führt Sie durch den Testprozess, alles funktioniert, zusammen mit der ersten Einrichtung. Beachten Sie, dass Sie möglicherweise auch den Unity-Editor unter Windows zurücksetzen müssen.
Wir können das gleiche Testpanel verwenden, um unseren Controller zu testen. Setzen Sie Pin D2 auf INPUT und Digital. Weiter unten setzen Sie Pin A5 auf ANALOG. Ihr Potentiometer und Ihre Taste sollten nun Werte auf dem Bildschirm neben ihren PIN-Nummern anzeigen. Fortschritt!
Jetzt machen wir etwas, 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 Ausweichenspiel erstellen, um unser neues Kontrollsystem zu testen. Wir werden das Setup des Spiels ziemlich schnell durchführen. Wenn Sie also völlig neu in der Unity-Engine sind, können Sie unser Unity Game Programming Anfängerhandbuch finden. Ein Spiel mit Unity programmieren: Ein Anfängerhandbuch Ein Spiel mit Unity programmieren: Ein Anfängerhandbuch In der Entwicklung Englisch: www.db-artmag.de/2005/1/e/1/ Im Bereich der Indie - Spieleentwicklung hat sich Unity als De - facto - Standard herauskristallisiert: Seine geringen Kosten, seine einfache Handhabung und sein breites Funktionsspektrum machen es ideal für die schnelle Entwicklung von Spielen. Lesen Sie Nützlicher, um sich zu orientieren.
Wir werden ein sehr einfaches Spiel erstellen, in dem es dein Ziel ist, deine Sphäre nach links und rechts auszuweichen, um fallende Würfel zu vermeiden, die deinen neu erstellten Custom-Controller nutzen.
Erstellen Sie eine neue Szene und ziehen Sie das Uniduino-Prefab aus Assets> Uniduino> Prefabs in Ihre Hierarchie und ziehen Sie das Uniduino-Prefab in die Hierarchie. Wir brauchen es, um zwischen unserem Spiel und dem Controller zu sprechen.
Klicken Sie in der Unity-Hierarchie auf " Erstellen"> "Kugel" und verwenden Sie die Registerkarte "Transformation" im Bereich "Informationen", um sie an den unteren Rand des Spielbildschirms zu verschieben.
Es ist Zeit, Codierung zu bekommen
Jetzt füge dieser Party etwas Code hinzu. Klicken Sie mit der in der Hierarchie ausgewählten Sphäre am unteren Rand des Inspektorfensters auf Komponente hinzufügen> Neues Skript . Nennen Sie es sphereMover und wählen Sie C Sharp aus dem Dropdown-Menü. Klicken Sie auf 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 Kommentare zu lesen. Bis jetzt haben wir einige Variablen für unseren Arduino, seine Pins und unsere Sphere deklariert. Wir haben auch die
Start und ConfigurePins Methoden, um unser Arduino zur Laufzeit zu initialisieren. Lassen Sie uns unser Skript speichern und gehen Sie zurück in den Unity-Editor und sehen Sie, was sich geändert hat.
Wir können nun unsere öffentlichen Variablen im Inspektorfenster sehen. Lassen Sie uns sehen, was wir in diesem Stadium erreichen können, um uns später zu helfen. Wir wissen, welche Pin's wir auf dem Arduino von unserem Build früher verwenden, wir können sie eingeben. Wir wissen auch von unserem Experiment früher, wie weit wir wollen, dass unsere Kugel nach links und rechts fahren kann, damit sie nicht vom Bildschirm fällt. Lassen Sie uns diese Werte jetzt eingeben.
Erste Anzeichen des Lebens
Es ist Zeit, im Unity-Editor Werte von unserem Arduino zu sehen. Vorläufig 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); }
Jetzt, da wir unsere potValue-Variable in jedem Frame aktualisiert haben, können wir ihren Wert in Echtzeit im Unity Inspector sehen. Bevor wir es testen, sollten Sie jetzt prüfen, ob das Uniduino-Plug-in den richtigen Port abgehört hat. Klicke in der Hierarchie auf Uniduino und überprüfe 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 für Sie anders sein könnte. Überprüfen Sie die Verwendung der Arduino IDE, wenn Sie sich nicht sicher sind.
Wählen Sie Ihre Sphäre in der Hierarchie und klicken Sie auf die Schaltfläche "Spielen" am oberen Bildschirmrand. Das System benötigt einige Sekunden zum Initialisieren. Danach sollten Sie die Änderung der Pot Value-Variablen im Inspector sehen, wenn Sie das Potentiometer bewegen.
Jetzt reden wir! Nun, genaugenommen reden Unity und Arduino, aber wer zählt? Wenn Sie so weit gekommen sind und die Wertänderung im Inspector nicht sehen, überprüfen Sie die Einrichtungsschritte und stellen Sie sicher, dass Sie den richtigen Port für Ihr Arduino ausgewählt haben.
Lass uns diese Sphäre bewegen
Jetzt, da wir die Variable potValue aktualisiert haben, wollen wir diesen Wert benutzen, um unsere Sphäre zu bewegen. Wenn das Potentiometer ganz nach links ist, wollen wir, dass die Kugel auf der linken Seite des Bildschirms ist und umgekehrt. Objekte in Unity werden an einem Punkt im Vektorraum positioniert, der durch die Werte von Transform.position bestimmt wird. Im unteren Bild, wo sich die Kugel am weitesten links befindet, möchten wir, dass der Positionsvektor 9, 5, -4, 0 ist.
Wir wollen die X-Position der Kugel beeinflussen. Leider funktionieren die Werte von unserem Potentiometer nicht direkt, denn wenn das Potentiometer ganz nach links ist, gibt es einen Wert von 0 - was unsere Kugel in die Mitte des Bildschirms bringen würde. Im anderen Extremfall würde der obere Wert des Potentiometers, 1023, den Würfel rechts von unserem Bildschirm absetzen. Nicht nützlich. Was wir hier brauchen, ist Mathe.
Warum Mathematik tun, wenn die Einheit es für Sie tun wird?
Für diejenigen von euch da draußen, die sich davor fürchten, ein mit unsinnigen Zahlen bedecktes Stück Papier zu starren (obwohl es einige großartige Websites gibt) Die 20 Websites, die Sie Mathe lernen müssen Schritt für Schritt Die 20 Websites, die Sie Mathe lernen müssen Schritt für Schritt Wir haben die beste Websites für jedes Niveau, so dass Sie systematisch lernen können, ein besseres Verständnis von Mathematik eine Ebene zu einer Zeit, und viel Spaß! Lesen Sie mehr, die Ihnen helfen können, Mathematik zu lernen), fürchte dich nicht. Wir brauchen eine Möglichkeit, unsere Potentiometerwerte mit der X-Position unserer Kugel zu vergleichen. Glücklicherweise können wir eine Erweiterungsmethode verwenden .
Eine Erweiterungsmethode ist ein Skript, das eine bestimmte Aufgabe für uns erledigt. In diesem Fall geben wir ihr die Werte, die wir haben, und sie geben sie einander zugeordnet zurück, damit sie in unserem sphereMover- Skript verwendet werden können. Klicken Sie oben im Projektfenster auf Erstellen> C # -Skript und nennen Sie es ExtensionMethods. Gib 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 nun in unserem ExtensionMethods-Skript in unserer Update-Funktion verwenden, um unsere Potentiometerwerte in unserem Spiel in brauchbare Werte umzuwandeln. Geben Sie unter der Stelle, an der wir gerade die Variable potValue zugewiesen haben, Folgendes ein:
Die Eingabe zeigt, dass unser Remap zwei Sätze von From- und To-Werten verwendet und diese zusammenstellt. Wir können hier unsere Werte eingeben.
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 linken und rechten Kanten festgelegt haben. Nimm dir einen Moment Zeit, um dich zurückzulehnen und deinem ExtensionMethods-Skript zu danken. Kein Taschenrechner in Sicht.
Hinweis: Wenn Sie bemerken, dass Ihre Werte umgekehrt sind, also wenn Ihr Potentiometer ganz nach rechts steht, erhalten Sie einen negativen Wert für die Variable "Mapped Pot". Möglicherweise haben Sie Ihr Potentiometer falsch herum angeordnet. Glücklicherweise können Sie das beheben, ohne eine Neuverdrahtung durchzuführen. Sie können die Werte einfach umschalten, wenn Sie sie neu zuordnen:
Jetzt haben wir endlich brauchbare Werte. Jetzt müssen wir nur noch diese Werte der X-Position unserer Kugel zuweisen:
//Assign the mapped pot value to the sphere's x position transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);
Speichere dein Skript, gehe zurück zum Unity-Editor und drücke auf "Play". Sie sollten jetzt in der Lage sein, Ihre Kugel mit Ihrem Potentiometer nach links und rechts zu bewegen!
Den Knopf zur Arbeit setzen
Nun, da wir unsere Sphäre in Bewegung halten, wäre es nicht schön, einen Weg zu haben, die Dinge ein wenig zu verlangsamen, wenn wir in einer engen Situation sind? Wir werden unseren Knopf 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 Sphäre, den Würfel, benutzen. Klicken Sie in der Hierarchie auf Erstellen> 3D-Objekt> Cube . Im Inspektor des Würfels, Komponente hinzufügen> Physik> Starrkörper . Setzen Sie den Drag-Wert des Starrkörpers auf 5. Wählen Sie außerdem unter der Komponente Box Collider im Inspector die Option Is Trigger. Dies ermöglicht uns Kollisionen mit unserer Sphäre zu erkennen.
Erstellen Sie ein Skript auf dem Cube und nennen Sie es " collideWithSphere", öffnen Sie das Skript und löschen Sie die Funktionen "Start" und "Update", da wir sie diesmal nicht benötigen. Gib diesen Code ein:
using UnityEngine; using System.Collections; public class collideWithSphere : MonoBehaviour { void OnTriggerEnter(Collider other) { Destroy(other.gameObject); } }
OnTriggerEnter sendet eine Nachricht immer dann, wenn der Triggercollider einen anderen Collider trifft. In diesem Fall sagen wir ihm, 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 geworden ist. Dies liegt daran, dass wir ein Prefab erstellt und in unserem Projekt gespeichert haben. Löschen Sie jetzt Ihren Würfel aus der Hierarchie.
Alles, was wir jetzt brauchen, ist ein Skript, um die Würfel zu spawnen. Klicken Sie in der Hierarchie auf Erstellen> Leere erstellen, benennen Sie sie im Inspektor in Game Manager um und fügen Sie ihr 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< 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 () { } }
Speichere 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. Füllen Sie auch hier die Werte für Ihr Laich aus. Sie können damit herumspielen, um es so schwer oder einfach zu machen, wie Sie möchten. Beachten Sie, dass es sich lohnt, die niedrigsten Würfel zu haben, die hoch genug sind, um Uniduino initialisieren zu können - das Spiel zu verlieren, bevor Sie in der Lage sind, sich zu bewegen, 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 erstellt, um es zu testen. Die Konzepte können auf fast jedes Projekt angewendet werden, und es gibt sogar Spielstaus, die auf benutzerdefinierte Controller spezialisiert sind.
Mit Arduino und Unity konnten Sie aus fast allem einen eigenen 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!