So erstellen Sie ein Multiplayer-Spiel mit Arduino-Controllern – wikiHow
So erstellen Sie ein Multiplayer-Spiel mit Arduino-Controllern – wikiHow
Anonim
So erstellen Sie ein Multiplayer-Spiel mit Arduino-Controllern
So erstellen Sie ein Multiplayer-Spiel mit Arduino-Controllern

Haben Sie sich jemals gefragt, wie Spieleentwickler erstaunliche Spiele entwickeln, die Menschen weltweit gerne spielen? Nun, heute werde ich Ihnen nur einen kleinen Hinweis darauf geben, indem ich ein kleines Multiplayer-Spiel erstelle, das entweder von einem Arduino-Controller gesteuert wird, den Sie auch erstellen werden. Lassen Sie uns also beginnen.

Lieferungen

Du wirst brauchen:

  • Ein Laptop
  • Unity-Engine
  • Eine C#-IDE, die mit Unity wie Visual Studio oder Atom funktioniert. (Ich werde Visual Studio Code verwenden)
  • 2X Arduino Nano
  • 2X Großes Brotbrett
  • 2X Kleines Brotbrett
  • 4X Wendeschalter (Druckknopf)
  • 4X 200Ω Widerstand
  • 12X Stecker-zu-Stecker-Überbrückungsdrähte
  • Arduino-IDE

Es ist hilfreich, wenn Sie ein grundlegendes Verständnis der Verwendung von Unity haben, es hat jedoch keinen Einfluss auf Ihren Fortschritt, da Sie sich damit vertraut machen, während Sie das Spiel entwickeln.

Link zum Herunterladen der Unity Engine:

store.unity.com/download-nuo

Link zum Herunterladen der Visual Studio Code-IDE:

code.visualstudio.com/download

Link zum Herunterladen der Arduino-IDE:

www.arduino.cc/en/Main/Software

Schritt 1: Richten Sie die Grenzen des Spiels ein

Richte die Grenzen des Spiels ein
Richte die Grenzen des Spiels ein
Richte die Grenzen des Spiels ein
Richte die Grenzen des Spiels ein
Richte die Grenzen des Spiels ein
Richte die Grenzen des Spiels ein

Zuerst müssen Sie Unity herunterladen

Sobald dies erledigt ist, können Sie mit der Einrichtung Ihrer Spielansicht beginnen.

Öffnen Sie ein neues Unity-Projekt, benennen Sie es und wählen Sie 2D-Spiel.

Beachten Sie beim Öffnen des Projekts, dass es 3 Hauptabschnitte gibt, die aufgerufen werden

  • Hierarchie (hier werden alle Ihre Spielobjekte und Details hinzugefügt).
  • Szene (in der Sie die Spielansicht einrichten).
  • Spiel (wo Sie testen können, wie das echte Spiel abläuft).

Beachten Sie, dass sich unter der Hierarchie Ihre Szene und unter der Szene die „Hauptkamera“befindet. Wenn Sie die Kamera aus der Hierarchie auswählen, wird sie in der Szene ausgewählt

(Alles innerhalb der Grenzen dieser Kamera wird im echten Spiel angezeigt).

Siehe Bild 1

Unser Spiel besteht aus zwei Brettern, einem Ball, der sich bewegt, und Grenzen, die die Bewegung der Bretter und des Balls begrenzen.

Beginnen wir mit dem Erstellen der Grenzen.

  1. Um ein neues Spielobjekt zu erstellen, wählen Sie Assets>Create>Sprites>Square (benennen Sie es "rechter und linker Rand"). Sehen Sie sich Bild 2 an
  2. Ziehen Sie die rechten und linken Ränder per Drag & Drop in die Hierarchie und ein Quadrat wird in der Szene erscheinen.
  3. Passen Sie die Position der x-Achse auf (5) "rechter und linker Rand">Inspektor>Transformieren>Position>X an. Siehe Bild 3
  4. Passen Sie dann die Skalierung so an, dass sie groß genug ist, um die Ränder der Kamera abzudecken (ziehen Sie die Ober- und Unterseite des Quadrats, um es zu dehnen).
  5. Passen Sie die Farbe "vom rechten und linken Rand">Inspektor>Sprite-Rendering>Farbe an. Siehe Bild 3
  6. Scrollen Sie im Inspektor nach unten und wählen Sie Komponente hinzufügen, geben Sie Rigidbody2D ein und drücken Sie die Eingabetaste. Dies wird Ihrem Spielobjekt im Grunde Physik hinzufügen, da es Masse, Schwerkraft und Kollisionserkennung ermöglicht. Allerdings brauchen wir in unserem Spiel keine Gravitation, also machen Sie die Gravitation 0 statt 1. Sie müssen auch die Position und Rotation einfrieren, damit sich die Grenze nicht bewegt, wenn sie kollidiert. Siehe Bild 4
  7. Wählen Sie Komponente hinzufügen, geben Sie Box Collider 2D ein und drücken Sie die Eingabetaste. Dadurch wird ein Bereich um das Spielobjekt hinzugefügt, in dem Kollisionen erkannt werden können. Siehe Bild 4
  8. Wählen Sie nun den rechten und linken Rand aus und drücken Sie (Strg + d), um ihn zu duplizieren.
  9. Benennen Sie es in „linker Rand“um und benennen Sie den ersten um („rechter Rand“).
  10. Wählen Sie den linken Rand aus und stellen Sie seine x-Achsenposition auf (-5) auf die gleiche Weise wie in Schritt 3 ein. Jetzt haben Sie einen rechten und einen linken Rand.

Wiederholen Sie die vorherigen 10 Schritte mit den oberen und unteren Rändern und ändern Sie die y-Position des Quadrats anstelle der x-Position. Die endgültige Vorschau sollte der auf dem Bild ähnlich sein.

Siehe Bild 5

Schritt 2: Hinzufügen von Boards und Erstellen von Controllern

Hinzufügen von Boards und Erstellen von Controllern
Hinzufügen von Boards und Erstellen von Controllern
Hinzufügen von Boards und Erstellen von Controllern
Hinzufügen von Boards und Erstellen von Controllern
Hinzufügen von Boards und Erstellen von Controllern
Hinzufügen von Boards und Erstellen von Controllern

Hinzufügen von Boards

Erstelle ein neues Spielobjekt und nenne es Spieler 1.

Anpassen:

  • Maßstab: X(1.2), Y(0.15), Z(1)
  • Position: X(0), Y(-3,6), z(0)
  • BoxCollider2D hinzufügen
  • Fügen Sie Rigidbody 2D hinzu und frieren Sie die y- und z-Achsen ein.

Duplizieren (Strg+D) und benennen Sie den Kopierplayer um 2.

Anpassen:

  • Maßstab: X(1.2), Y(0.15), Z(1)
  • Position: X(0), Y(3.6), z(0)
  • Ein BoxCollider wird schon da sein.
  • Ein Rigidbody 2D ist bereits vorhanden und die y- und z-Achse sind bereits eingefroren.

Siehe Bild 1

Controller herstellen

Du wirst brauchen:

  • 2X Arduino Nano
  • 2X Großes Brotbrett
  • 2X Kleines Brotbrett
  • 4X Wendeschalter (Druckknopf)
  • 4X Widerstand
  • 12X Stecker-zu-Stecker-Überbrückungsdrähte

Schauen Sie sich nun die Fotos und das Mapping der Brotplatine an, um die Joysticks zusammenzubauen.

  1. Befestigen Sie einen Arduino Nano-Chip mit einem kleinen Brotbrett.
  2. Bringen Sie 2 Wendeschalter auf dem großen Steckbrett an, wie in der Abbildung gezeigt. Versuchen Sie, die rechte Seite des Steckbretts symmetrisch zur linken zu halten, da dies den Joystick besser aussehen lässt (Sie können die 30. Spalte als Symmetrie verwenden.) Leitung)
  3. Verbinden Sie den oberen linken Pin der linken Taste mit dem 5V-Pin im Arduino auf dem kleinen Steckbrett (Dinge, die mit derselben Spalte im Steckbrett verbunden sind, werden miteinander verbunden).
  4. Verbinden Sie den oberen rechten Pin der rechten Taste mit dem 5V-Pin im Arduino.
  5. Verbinden Sie den unteren rechten Pin der linken Taste mit einem Punkt in der 31. Spalte mit einem Widerstand.
  6. Verbinden Sie den unteren linken Pin der rechten Taste mit einem Punkt auf der 29. Spalte mit einem Widerstand.
  7. Verbinden Sie die Widerstände mit dem GND-Pin im Arduino.
  8. Verbinden Sie den oberen rechten Pin der linken Taste mit dem D3-Pin im Arduino.
  9. Verbinden Sie den oberen linken Pin der rechten Taste mit dem D9-Pin im Arduino.
  10. Wiederholen Sie nun diese Schritte und machen Sie den zweiten Controller.

Schritt 3: Anschließen von Arduino an den seriellen Port

Anschließen von Arduino an den seriellen Port
Anschließen von Arduino an den seriellen Port
Anschließen von Arduino an den seriellen Port
Anschließen von Arduino an den seriellen Port
Anschließen von Arduino an den seriellen Port
Anschließen von Arduino an den seriellen Port
Anschließen von Arduino an den seriellen Port
Anschließen von Arduino an den seriellen Port

Zuerst müssen Sie die Arduino IDE installieren.

Sobald sie installiert sind, können Sie damit beginnen, ein Arduino-Programm zu erstellen, das Eingaben von den Schaltflächen empfängt und in einem seriellen Port (COM-Port) speichert. Wenn ein Arduino-Board an Ihren Laptop angeschlossen ist, erkennt das Betriebssystem das Board automatisch als serielle Schnittstelle, auf die Programme hochgeladen werden können. Die im seriellen Port gespeicherten Werte können im nächsten Schritt verwendet werden, wenn wir Unity Engine mit dem seriellen Port verbinden.

Verbinden wir nun den Arduino mit dem seriellen Port.

Schau dir die Bilder an

  1. Verbinden Sie einen Arduino mit Ihrem Laptop
  2. Werkzeuge>Board>Arduino Nano
  3. Wenn Ihr Arduino-Chip neu ist (2018-2020) Tools> Processor> ATmega328P (Old Bootloader).
  4. Wenn Ihr Arduino-Chip nicht aktuell ist (vor 2018) Tools>Prozessor>ATmega328P
  5. Tools>Port>COM (welche Nummer auch immer erscheint, in meinem Fall ist es 10). * Dies ist der serielle Port, an dem die Werte gespeichert werden.
  6. Kopieren Sie den Code und fügen Sie ihn in die Arduino IDE ein und drücken Sie Strg + u, um das Programm hochzuladen.
  7. Wiederholen Sie mit dem zweiten Arduino. (Wenn Sie Schritt 5 ausführen, stellen Sie sicher, dass Sie einen anderen COM-Port wählen, damit nicht beide Controller mit demselben seriellen Port verbunden sind).

Code:

Leere Einrichtung () {

Serial.begin (9600); pinMode(3, EINGANG); // Dem Arduino sagen, dass er eine Eingabe von Pin D3 erhalten soll pinMode (9, INPUT); // Dem Arduino sagen, dass er eine Eingabe von Pin D9 erhalten soll} void loop () { if (digitalRead (3) = = 1) { / * Wenn der Arduino eine Eingabe von 1 Serial.write (1) empfängt; von Pin 3 Geben Sie einen Wert von 1 an den seriellen Port Serial.flush() aus; */ Verzögerung(2); } if(digitalRead(9)==1){/* Wenn das Arduino eine Eingabe von 1 Serial.write(2) erhält; von Pin 9 Geben Sie einen Wert von 2 an den seriellen Port Serial.flush() aus; */ Verzögerung(2); } }

Erklärung zum Programm:

Dieser Code nimmt einfach eine Eingabe vom D3-Pin und dem D9-Pin im Arduino, die mit den Tasten verbunden sind. Die Tasten sind entweder gedrückt oder nicht gedrückt, was bedeutet, dass die Messwerte von ihnen entweder 1 (gedrückt) oder 0 (nicht gedrückt) sind. Wenn die Eingabe von der rechten Taste (von D9) 1 ist (gedrückt), speichern Sie einen Wert von 1 in der seriellen Schnittstelle. Wenn die Eingabe von der linken Taste (von D3) 1 ist (gedrückt), speichern Sie einen Wert von 2 in der seriellen Schnittstelle.

Schritt 4: Unity mit dem seriellen Port verbinden

Verbinden von Unity mit dem seriellen Port
Verbinden von Unity mit dem seriellen Port
Verbinden von Unity mit dem seriellen Port
Verbinden von Unity mit dem seriellen Port

Für diesen Schritt werden wir den seriellen Port in Unity identifizieren, damit er die Eingaben von Arduino empfangen kann, wenn die Tasten gedrückt werden. Installieren Sie Visual Studio Code auf Ihrem Laptop. Gehen Sie dann zu Unity, wählen Sie Spieler 1 aus der Hierarchie aus, scrollen Sie nach unten und wählen Sie Komponente hinzufügen und geben Sie player1_motion ein und drücken Sie dann die Eingabetaste. Siehe Bild 1

Ein C#-Skript wird im Inspektor erstellt, klicken Sie mit der rechten Maustaste darauf und wählen Sie Skript bearbeiten, Visual Studio-Code sollte sich öffnen und zeigt einen Standardcode an, der wie in Bild 2 aussieht.

Kopieren Sie den folgenden Code und ändern Sie dann "SerialPort sp = new SerialPort("COM10", 9600);" with SerialPort sp = new SerialPort ("COM-Port, mit dem Ihr Arduino verbunden ist", 9600); Sie können ihn finden, indem Sie zu Ihrem Arduino-Code zurückkehren und Tools> Port> COM (welche Nummer auch immer angezeigt wird) wählen.

Code:

Verwenden von System. Collections;

mit System. Collections. Generic; mit UnityEngine; Verwenden von System. IO. Ports; public class player1_motion: MonoBehaviour { float speed = 8; privater Umzugsbetrag; SerialPort sp = neuer SerialPort ("COM10", 9600); // Start wird vor dem ersten Frame-Update aufgerufen void Start() { sp. Open(); sp. ReadTimeout = 1; } // Update wird einmal pro Frame aufgerufen void Update() { Betragtomove = speed*0.01f; if(sp. IsOpen){try { moveObject(sp. ReadByte()); print(sp. ReadByte()); } catch(System. Exception){}}} void moveObject(int Direction) { if(Direction == 1){ transform. Translate(Vector3.left*amounttomove, Space. World); } if(Direction == 2){ transform. Translate(Vector3.right*amounttomove, Space. World); } } }

Erklärung des Codes:

Dieser Code weist Unity an, Eingaben von der seriellen Schnittstelle (COM 10) zu empfangen. Wenn die linke Taste gedrückt wird, sendet der Arduino einen Wert von 1 an den seriellen Port, wenn Unity 1 vom seriellen Port empfängt, wird dem Spielobjekt "Player 1" eine Geschwindigkeit in die linke Richtung hinzugefügt. Wenn die rechte Taste gedrückt wird, sendet der Arduino einen Wert von 2 an die serielle Schnittstelle, wenn Unity 2 von der seriellen Schnittstelle empfängt, wird dem Spielobjekt "Player 1" eine Geschwindigkeit in die richtige Richtung hinzugefügt. Wenn der serielle Port keinen Wert vom seriellen Port empfängt, wird in keiner Richtung eine Geschwindigkeit hinzugefügt, daher bleibt die Platine stationär.

Nachdem Sie den Code kopiert haben, drücken Sie F5, um den Code zu erstellen und auszuführen. Gehen Sie zurück zu Einheit und drücken Sie die Wiedergabetaste. Spieler 1 sollte sich nach rechts bewegen, wenn Sie nach rechts drücken, und nach links, wenn Sie nach links drücken.

Führen Sie nun die gleichen Schritte noch einmal mit Player 2 durch und stellen Sie sicher, dass Sie in die 'Komponente hinzufügen' player2_motion anstelle von player1_motion schreiben und den zweiten COM-Port identifizieren, an dem der zweite Controller angeschlossen ist, nicht denselben seriellen Port.

Sie müssen auch im Code selbst "public class player1_motion: MonoBehaviour" in "public class player2_motion: MonoBehaviour" ändern.

Schritt 5: Hinzufügen des Balls

Hinzufügen des Balls
Hinzufügen des Balls
Hinzufügen des Balls
Hinzufügen des Balls
Hinzufügen des Balls
Hinzufügen des Balls
  1. Füge ein neues Spielobjekt hinzu, aber wähle diesmal einen Kreis anstelle eines Quadrats.
  2. Benennen Sie es in "Kugel" um.
  3. Drag-and-Drop in der Hierarchie.
  4. Passen Sie den Maßstab an (X:0,2 - Y:0,2 - Z: 0,2).
  5. Fügen Sie einen Rigidbody 2D hinzu und frieren Sie nur die Z-Achse ein.
  6. Ändern Sie die Masse auf 0,0001
  7. Ändern Sie die Schwerkraftskala auf 0.
  8. Fügen Sie einen Box Collider 2D hinzu.
  9. Gehen Sie zu Assets>Create>Physics material 2D Sehen Sie sich Bild 1 an
  10. ändere seinen Namen in "bounce"
  11. Ändern Sie die Reibung vom Inspektor auf Null
  12. Ändere die Sprungkraft im Inspektor auf 1
  13. Ziehen Sie "Bounce" per Drag & Drop in Rigidbody 2D>Material Sehen Sie sich Bild 2 an
  14. Wählen Sie erneut "ball" aus der Hierarchie und gehen Sie zu Komponente hinzufügen und geben Sie Ball_movement ein und drücken Sie dann die Eingabetaste.
  15. Klicken Sie mit der rechten Maustaste auf das Skript und wählen Sie Skript bearbeiten.
  16. Kopieren Sie den folgenden Code und drücken Sie F5, um ihn zu erstellen und auszuführen.

Code:

Verwenden von System. Collections;

mit System. Collections. Generic; mit UnityEngine; public class Ball_movement: MonoBehaviour { // Start wird vor dem ersten Frame-Update aufgerufen private float force = 2; Void Start() { StartCoroutine (move()); } IEnumerator move() { Yield return new WaitForSeconds(2); GetComponent(). AddForce(new Vector2(1f, 0.5f)*0.02f*force); } }

Erklärung des Codes

Dieser Code gibt dem Ball eine Geschwindigkeit in beide Richtungen, die X-Richtung und die Y-Richtung mit der gleichen Größe, wodurch sich der Ball in einem Winkel von 45° bewegt. In Schritt 8 haben wir dem Ball ein Physikmaterial hinzugefügt und seine Sprungkraft geändert, dies hält die Bewegung des Balls während des gesamten Spiels aufrecht.

Schritt 6: Finalisieren des Spiels

Finalisieren des Spiels
Finalisieren des Spiels
Finalisieren des Spiels
Finalisieren des Spiels
Finalisieren des Spiels
Finalisieren des Spiels
Finalisieren des Spiels
Finalisieren des Spiels

Jetzt müssen wir das Verlieren ermöglichen. Wenn Sie das Spiel laufen lassen, werden Sie feststellen, dass der Ball, wenn er Spieler 1 oder Spieler 2 passiert, einfach von der Grenze abprallt und das ist nicht genau das, was wir in unserem Spiel brauchen. Stattdessen möchten wir einen Punktezähler erstellen, der jedes Mal den Punktestand zählt, wenn der Ball mit der oberen oder unteren Grenze kollidiert und die Position des Balls zurücksetzt.

  1. Ziehen Sie den Ball per Drag-and-Drop aus der Hierarchie in das Projekt. Sie haben ein Prefab des Balls erstellt, damit Sie ihn später verwenden können.
  2. Klicken Sie mit der rechten Maustaste auf die Hierarchie und wählen Sie Leer erstellen. ein leeres Objekt wird angezeigt, benennen Sie es in Ball-Respawn um und ändern Sie seine Position so, dass sie der Position des Balls entspricht.
  3. Klicken Sie mit der rechten Maustaste auf die Hierarchie und wählen Sie UI>>Text. Beachten Sie, dass der Text eine Leinwand begleitet. Die Position des Textes im Spiel hängt von der Position des Textes auf der Leinwand ab, nicht von den Rändern unseres Spiels. (Siehe Bild 1).
  4. Ändern Sie die Position des Textes an eine beliebige Stelle.
  5. Wiederholen Sie die Schritte 3 und 4 erneut für die Punktzahl des zweiten Spielers.
  6. Geben Sie den ersten Text "Spieler 1 Punktzahl: 0" und den zweiten Text "Spieler 2 Punktzahl: 0" ein. (Siehe Bild 2).
  7. Erstellen Sie im oberen Rand ein Skript namens p1wins und kopieren Sie den folgenden Code.

Code:

Verwenden von System. Collections;

mit System. Collections. Generic; mit UnityEngine; Verwenden von UnityEngine. SceneManagement; Verwenden von UnityEngine. UI; public class p1wins: MonoBehaviour { public Text score; public Transformiere ball_respawn; öffentlicher GameObject-Ball; private int p1 = 0; // Start wird vor dem ersten Frame aufgerufen update void Start() { } // Update wird einmal pro Frame aufgerufen void Update() { score.text = "Player 1 Score:" + p1; aufrechtzuerhalten. Void OnCollisionEnter2D (Collision2D andere) { if (other.gameObject.tag == "Ball") { Destroy (other.gameObject); p1++; Instanziieren(ball, ball_respawn.position, ball_respawn.rotation); } } }

8. Ziehen Sie das Ball Prefab aus dem Projekt in Schritt 1 per Drag & Drop in den Ball-Parameter. (Siehe Bild 3)

9. Ziehen Sie den Ball-Respawn aus der Hierarchie und legen Sie ihn auf den Parameter Ball-rerspawn. (Siehe Bild 3)

10. Ziehen Sie die Punktzahl von Spieler 1 per Drag & Drop aus der Hierarchie auf den Punktzahl-Parameter. (Siehe Bild 3)

Erklärung des Codes:

Wenn der Ball mit dem oberen Rand kollidiert, wird er zerstört und wieder an der ball_respawn-Position, die wir in Schritt 2 zugewiesen haben, respawnt aus der Hierarchie wird es respawnen, aber es bewegt sich nicht. Auch wenn der Ball mit dem oberen Rand kollidiert, erhöht sich ein Wert, der ursprünglich gleich 0 ist, genannt p1 um 1. Dieser Wert wird als Text angezeigt, so dass, wenn der Ball mit dem oberen Rand kollidiert, die Punktzahl für Spieler 1 um 1 erhöht wird.

Führen Sie nun die Schritte 7, 8, 9 und 10 für den unteren Rand aus

Erstellen Sie für Schritt 7 ein Skript namens p2wins und kopieren Sie stattdessen den folgenden Code.

Ziehen Sie für Schritt 10 die Punktzahl von Spieler 2 aus der Hierarchie auf den Punktzahl-Parameter und legen Sie sie dort ab.

Code:

Verwenden von System. Collections;

mit System. Collections. Generic; mit UnityEngine; Verwenden von UnityEngine. SceneManagement; Verwenden von UnityEngine. UI; public class p2wins: MonoBehaviour { public Text score; public Transformiere ball_respawn; öffentlicher GameObject-Ball; private int p2 = 0; // Start wird vor dem ersten Frame aufgerufen update void Start() { } // Update wird einmal pro Frame aufgerufen void Update() { score.text = "Player 2 Score:" + p2; aufrechtzuerhalten. Void OnCollisionEnter2D (Collision2D andere) { if (other.gameObject.tag == "Ball") { Destroy (other.gameObject); p2++; Instanziieren(ball, ball_respawn.position, ball_respawn.rotation); } } }