Inhoudsopgave:

Hoe maak je een multiplayer-game met Arduino-controllers - Ajarnpa
Hoe maak je een multiplayer-game met Arduino-controllers - Ajarnpa

Video: Hoe maak je een multiplayer-game met Arduino-controllers - Ajarnpa

Video: Hoe maak je een multiplayer-game met Arduino-controllers - Ajarnpa
Video: Сезар Харада: Новая идея об очистке разливов нефти 2024, Juli-
Anonim
Hoe maak je een multiplayer-spel met Arduino-controllers
Hoe maak je een multiplayer-spel met Arduino-controllers

Heb je je ooit afgevraagd hoe game-ontwikkelaars geweldige games maken die mensen over de hele wereld graag spelen? Welnu, vandaag ga ik je er een kleine hint over geven door een klein multiplayer-spel te maken dat wordt bestuurd door een Arduino-controller die je ook gaat maken. Dus laten we beginnen.

Benodigdheden

Je zal nodig hebben:

  • Een laptop
  • eenheidsmotor
  • Een C# IDE die werkt met Unity zoals visual studio of Atom. (Ik zal Visual Studio-code gebruiken)
  • 2X Arduino Nano
  • 2X Grote Broodplank
  • 2X kleine broodplank
  • 4X Tack-schakelaar (drukknop)
  • 4X 200Ω Weerstand
  • 12X mannelijke naar mannelijke verbindingsdraden
  • Arduino IDE

Het is handig als je een basiskennis hebt van het gebruik van Unity, maar het heeft geen invloed op je voortgang, omdat je er vertrouwd mee raakt terwijl je doorgaat met het maken van het spel.

Link voor het downloaden van Unity Engine:

store.unity.com/download-nuo

Link voor het downloaden van Visual Studio Code IDE:

code.visualstudio.com/download

Link voor het downloaden van Arduino IDE:

www.arduino.cc/en/Main/Software

Stap 1: Stel de grenzen van het spel in

Stel de grenzen van het spel in
Stel de grenzen van het spel in
Stel de grenzen van het spel in
Stel de grenzen van het spel in
Stel de grenzen van het spel in
Stel de grenzen van het spel in

Allereerst moet je unity downloaden

Zodra dat is gebeurd, kunt u beginnen met het instellen van de weergave van uw game.

Open een nieuw Unity-project, noem het en selecteer 2D-game.

Wanneer het project wordt geopend, ziet u dat er 3 hoofdsecties zijn genaamd

  • Hiërarchie (hier worden al je game-objecten en details toegevoegd).
  • Scène (waar je de weergave van de game instelt).
  • Spel (waar je kunt testen hoe het echte spel eruit zal zien).

Merk op dat er onder de hiërarchie jouw scène is en onder de scène de "Hoofdcamera". Wanneer u de camera uit de hiërarchie selecteert, wordt deze in de scène geselecteerd

(Alles binnen de grenzen van deze camera wordt in het echte spel weergegeven).

Kijk naar foto 1

Ons spel bestaat uit twee borden, een bal die beweegt en randen die de beweging van de borden en de bal beperken.

Laten we beginnen met het maken van de randen.

  1. Om een nieuw spelobject te maken, selecteer je Activa>Maken>Sprites>vierkant (noem het "rechter- en linkerrand"). Kijk naar afbeelding 2
  2. Sleep de rechter- en linkerrand naar de hiërarchie en zet ze neer en er verschijnt een vierkant in de scène.
  3. Pas de positie van de x-as aan naar (5) "rechter- en linkerranden"> infovenster> transformeren> positie> X. Kijk naar foto 3
  4. Pas vervolgens de schaal aan zodat deze groot genoeg is om de randen van de camera te bedekken (sleep de boven- en onderkant van het vierkant om het uit te rekken).
  5. Pas de kleur aan "van de rechter- en linkerranden">inspector>sprite render>kleur. Kijk naar foto 3
  6. Scroll naar beneden in de inspecteur en selecteer component toevoegen, typ vervolgens Rigidbody2D en druk op enter. Dit zal in feite fysica aan je game-object toevoegen omdat het massa, zwaartekracht en botsingsdetectie geeft. We hebben echter geen zwaartekracht nodig in ons spel, dus maak de zwaartekracht 0 in plaats van 1. Je moet ook de positie en rotatie bevriezen, zodat de grens niet beweegt wanneer deze wordt gebotst. Kijk naar foto 4
  7. selecteer component toevoegen en typ Box Collider 2D en druk op enter. Dit zal een gebied rond het spelobject toevoegen waar botsingen kunnen worden gedetecteerd. Kijk naar foto 4
  8. Selecteer nu de rechter- en linkerrand en druk op (ctrl+d) om het te dupliceren.
  9. Hernoem het "linkerrand" en hernoem de eerste ("rechterrand").
  10. Selecteer de linkerrand en pas de positie van de x-as aan naar (-5) op dezelfde manier in stap 3. Nu heb je rechter- en linkerranden.

Herhaal de vorige 10 stappen met de randen omhoog en omlaag en verander de y-positie van het vierkant in plaats van de x-positie. Het uiteindelijke voorbeeld moet iets zijn dat lijkt op dat op de afbeelding.

Kijk naar foto 5

Stap 2: Boards toevoegen en controllers maken

Boards toevoegen en controllers maken
Boards toevoegen en controllers maken
Boards toevoegen en controllers maken
Boards toevoegen en controllers maken
Boards toevoegen en controllers maken
Boards toevoegen en controllers maken

Borden toevoegen

Maak een nieuw spelobject en noem het speler 1.

Aanpassen:

  • Schaal: X(1.2), Y(0.15), Z(1)
  • Positie: X(0), Y(-3,6), z(0)
  • BoxCollider2D toevoegen
  • Voeg Rigidbody 2D toe en bevries de y- en z-assen.

Dupliceer (ctrl+d) en hernoem de kopieerspeler 2.

Aanpassen:

  • Schaal: X(1.2), Y(0.15), Z(1)
  • Positie: X(0), Y(3.6), z(0)
  • Een BoxCollider zal er al zijn.
  • Een Rigidbody 2D zal er al zijn en de y- en z-assen zullen al bevroren zijn.

Kijk naar foto 1

Controllers maken

Je zal nodig hebben:

  • 2X Arduino Nano
  • 2X Grote Broodplank
  • 2X kleine broodplank
  • 4X Tack-schakelaar (drukknop)
  • 4X Weerstand:
  • 12X mannelijke naar mannelijke verbindingsdraden

Kijk nu naar de breadboard-foto's en kaarten om de joysticks te monteren.

  1. Bevestig een Arduino Nano-chip met een klein broodplankje.
  2. bevestig 2 Tack-schakelaars op de grote broodplank zoals weergegeven in de afbeelding. Probeer de rechterkant van de broodplank symmetrisch te houden met de linker, want hierdoor ziet de joystick er beter uit (u kunt de 30e kolom als symmetrie gebruiken lijn)
  3. Verbind de pin linksboven van de linkerknop met de 5V-pin in de Arduino op het kleine breadboard (dingen die met dezelfde kolom in het breadboard zijn verbonden, zijn met elkaar verbonden).
  4. Verbind de pin rechtsboven van de rechterknop met de 5V-pin in de Arduino.
  5. Verbind de pin rechtsonder van de linkerknop met een punt op de 31e kolom met behulp van een weerstand.
  6. Verbind de pin linksonder van de rechterknop met een punt op de 29e kolom met behulp van een weerstand.
  7. Verbind de weerstanden met de GND-pin in de Arduino.
  8. Verbind de pin rechtsboven van de linkerknop met de D3-pin in de Arduino.
  9. Verbind de pin linksboven van de rechterknop met de D9-pin in de Arduino.
  10. Herhaal nu deze stappen en maak de tweede controller.

Stap 3: Arduino aansluiten op de seriële poort

Arduino aansluiten op de seriële poort
Arduino aansluiten op de seriële poort
Arduino aansluiten op de seriële poort
Arduino aansluiten op de seriële poort
Arduino aansluiten op de seriële poort
Arduino aansluiten op de seriële poort
Arduino aansluiten op de seriële poort
Arduino aansluiten op de seriële poort

Allereerst moet u de Arduino IDE installeren.

Zodra ze zijn geïnstalleerd, kunt u beginnen met het maken van een Arduino-programma dat invoer van de knoppen ontvangt en opslaat in een seriële poort (COM-poort). Wanneer een Arduino-bord is aangesloten op je laptop, herkent het besturingssysteem het bord automatisch als een seriële poort, waarnaar programma's kunnen worden geüpload. De waarden die zijn opgeslagen in de seriële poort kunnen in de volgende stap worden gebruikt wanneer we Unity Engine verbinden met de seriële poort.

Laten we nu de Arduino verbinden met de seriële poort.

Kijk naar de foto's

  1. Verbind een Arduino met je laptop
  2. Gereedschap>Board>Arduino Nano
  3. Als uw Arduino-chip recent is (2018-2020) Tools>Processor>ATmega328P(Old Bootloader).
  4. Als uw Arduino-chip niet recent is (vóór 2018) Tools>Processor>ATmega328P
  5. Extra> Poort> COM (het nummer dat ook verschijnt, in mijn geval is het 10). * Dit is de seriële poort waar waarden worden opgeslagen.
  6. Kopieer de code en plak deze in de Arduino IDE en druk op ctrl+u om het programma te uploaden.
  7. Herhaal met de tweede Arduino. (zorg er bij het uitvoeren van stap 5 voor dat u een andere COM-poort kiest, zodat beide controllers niet op dezelfde seriële poort worden aangesloten).

Code:

ongeldige setup() {

Serieel.begin(9600); pinMode (3, INGANG); // De Arduino vertellen om een invoer te ontvangen van pin D3 pinMode (9, INPUT); // De Arduino vertellen om een invoer van pin D9 te ontvangen } void loop () { if (digitalRead (3) = = 1) { /* Als de Arduino een invoer ontvangt van 1 Serial.write (1); van pin 3 Voer een waarde van 1 uit naar de seriële poort Serial.flush(); */ vertraging(2); } if(digitalRead(9)==1){ /* Als de Arduino een invoer ontvangt van 1 Serial.write (2); van pin 9 Voer een waarde van 2 uit naar de seriële poort Serial.flush(); */ vertraging(2); } }

De uitleg van het programma:

Deze code neemt gewoon een invoer van de D3-pin en de D9-pin in de Arduino, die zijn verbonden met de knoppen. De knoppen zijn ingedrukt of niet ingedrukt, wat betekent dat de meetwaarden die eruit worden gehaald ofwel 1 (ingedrukt) of 0 (niet ingedrukt) zijn. Als de invoer van de rechterknop (vanaf D9) 1 (ingedrukt) is, sla dan een waarde van 1 op in de seriële poort. Als de invoer van de linkerknop (vanaf D3) 1 (ingedrukt) is, sla dan de waarde 2 op in de seriële poort.

Stap 4: Unity verbinden met de seriële poort

Unity verbinden met de seriële poort
Unity verbinden met de seriële poort
Unity verbinden met de seriële poort
Unity verbinden met de seriële poort

Voor deze stap gaan we de seriële poort in Unity identificeren, zodat deze de invoer van Arduino kan ontvangen wanneer de knoppen worden ingedrukt. Installeer Visual Studio Code op uw laptop. Ga dan naar Unity, selecteer speler 1 uit de hiërarchie, scroll naar beneden en selecteer component toevoegen en typ player1_motion en druk op enter. Kijk naar foto 1

Er wordt een C#-script gemaakt in het infovenster, klik er met de rechtermuisknop op en selecteer script bewerken. Visual Studio-code zou moeten openen en een standaardcode tonen die eruitziet als afbeelding 2.

Kopieer de volgende code en wijzig "SerialPort sp = new SerialPort("COM10", 9600);" met SerialPort sp = nieuwe SerialPort ("COM-poort waarop uw Arduino is aangesloten", 9600); je kunt zijn vinden door terug te gaan naar je Arduino-code en naar Tools>Port>COM te gaan (ongeacht het nummer dat verschijnt).

Code:

met behulp van System. Collections;

met behulp van System. Collections. Generic; met behulp van UnityEngine; met behulp van System. IO. Ports; public class player1_motion: MonoBehaviour { float-snelheid = 8; privé vlotterbedrag om te verplaatsen; SerialPort sp = nieuwe SerialPort("COM10", 9600); // Start wordt aangeroepen vóór de eerste frame-update void Start() { sp. Open(); sp. ReadTimeout = 1; } // Update wordt één keer per frame aangeroepen void Update() {mounttomove = speed*0.01f; if(sp. IsOpen){ probeer { moveObject(sp. ReadByte()); print(sp. ReadByte()); } catch(System. Exception){ } } } void moveObject(int Direction) {if(Direction == 1){ transform. Translate(Vector3.left*amounttomove, Space. World); } if(Richting == 2){ transform. Translate(Vector3.right*amounttomove, Space. World); } } }

Verklaring van de code:

Deze code vertelt unity om input te ontvangen van de seriële poort (COM 10). Wanneer de linkerknop wordt ingedrukt, stuurt de Arduino een waarde van 1 naar de seriële poort, als eenheid 1 ontvangt van de seriële poort, wordt een snelheid toegevoegd aan het spelobject "speler 1" in de linkerrichting. Wanneer de rechterknop wordt ingedrukt, stuurt de Arduino een waarde van 2 naar de seriële poort, als eenheid 2 ontvangt van de seriële poort, wordt een snelheid toegevoegd aan het spelobject "speler 1" in de goede richting. als de seriële poort geen waarde ontvangt van de seriële poort, wordt er in geen van beide richtingen een snelheid toegevoegd, daarom blijft het bord stationair.

Nadat u de code hebt gekopieerd, drukt u op F5 om de code te bouwen en uit te voeren. Ga terug naar unity en druk op de afspeelknop, speler 1 moet naar rechts gaan als je naar rechts drukt en naar links als je naar links drukt.

Voer nu dezelfde stappen opnieuw uit, maar met speler 2 en zorg ervoor dat u in de 'Add component' player2_motion schrijft in plaats van player1_motion en om de tweede COM-poort te identificeren waarop de tweede controller is aangesloten, niet dezelfde seriële poort.

U moet ook "public class player1_motion: MonoBehaviour" wijzigen in "public class player2_motion: MonoBehaviour" in de code zelf.

Stap 5: De bal toevoegen

De bal toevoegen
De bal toevoegen
De bal toevoegen
De bal toevoegen
De bal toevoegen
De bal toevoegen
  1. Voeg een nieuw spelobject toe, maar kies deze keer een cirkel in plaats van een vierkant.
  2. Hernoem het "bal".
  3. Slepen en neerzetten in de hiërarchie.
  4. Pas de schaal aan (X:0,2 - Y:0,2 - Z: 0,2).
  5. Voeg een Rigidbody 2D toe en bevries alleen de Z-as.
  6. Verander de massa in 0,0001
  7. Verander de zwaartekrachtschaal in 0.
  8. Voeg een Box Collider 2D toe.
  9. Ga naar Activa>Maken>Natuurkunde materiaal 2D Kijk naar afbeelding 1
  10. verander de naam in "bounce"
  11. Verander de wrijving in nul vanuit de inspecteur
  12. Verander de veerkracht in 1 van de inspecteur
  13. Sleep "bounce" naar Rigidbody 2D>Materiaal Kijk naar afbeelding 2
  14. Selecteer opnieuw "bal" in de hiërarchie en ga naar component toevoegen en typ Ball_movement en druk op enter.
  15. Klik met de rechtermuisknop op het script en selecteer script bewerken.
  16. Kopieer de onderstaande code en druk op F5 om het te bouwen en uit te voeren.

Code:

met behulp van System. Collections;

met behulp van System. Collections. Generic; met behulp van UnityEngine; public class Ball_movement: MonoBehaviour { // Start wordt aangeroepen voor de eerste frame-update private float force = 2; void Start() { StartCoroutine(move()); } IEnumerator move() { yield return new WaitForSeconds (2); GetComponent(). AddForce(nieuwe Vector2(1f, 0.5f)*0.02f*force); } }

Code' uitleg

Deze code geeft de bal een snelheid in beide richtingen de X-richting en de Y-richting met dezelfde grootte, waardoor de bal in een hoek van 45° beweegt. In stap 8 hebben we natuurkundig materiaal aan de bal toegevoegd en de veerkracht veranderd, dit zorgt ervoor dat de bal tijdens het spel blijft bewegen.

Stap 6: Het spel afronden

Het spel afronden
Het spel afronden
Het spel afronden
Het spel afronden
Het spel afronden
Het spel afronden
Het spel afronden
Het spel afronden

Nu moeten we verliezen mogelijk maken, als je het spel speelt, zul je merken dat wanneer de bal speler 1 of speler 2 passeert, hij gewoon over de grens stuitert en dat is niet precies wat we nodig hebben in ons spel. In plaats daarvan willen we een scoreteller maken die de score telt elke keer dat de bal tegen de boven- of benedenrand botst en om de positie van de bal opnieuw in te stellen.

  1. Sleep de bal van de hiërarchie naar het project. Je hebt een prefab van de bal gemaakt zodat je hem later kunt gebruiken.
  2. Klik met de rechtermuisknop op de hiërarchie en selecteer Leeg maken. er verschijnt een leeg object, hernoem het naar bal respawn en verander zijn positie zodat het hetzelfde is als de positie van de bal.
  3. Klik met de rechtermuisknop op de hiërarchie en selecteer UI>>Tekst. Merk op dat de tekst bij een canvas hoort. De positie van de tekst in het spel hangt af van de positie van de tekst op het canvas, niet in de randen van ons spel. (Zie afbeelding 1).
  4. Verander de positie van de tekst in waar u maar wilt.
  5. Herhaal stap 3 en 4 nogmaals voor de score van de tweede speler.
  6. Typ de eerste tekst "Speler 1 Score: 0" en typ de tweede tekst "Speler 2 Score: 0". (Kijk naar foto 2).
  7. Maak een script in de bovenrand genaamd p1wins en kopieer de volgende code.

Code:

met behulp van System. Collections;

met behulp van System. Collections. Generic; met behulp van UnityEngine; met behulp van UnityEngine. SceneManagement; met behulp van UnityEngin. UI; public class p1wins: MonoBehaviour { public Text score; public Transform ball_respawn; openbare GameObject-bal; privé int p1 = 0; // Start wordt aangeroepen vóór de eerste frame-update void Start() { } // Update wordt eenmaal per frame void Update() aangeroepen { score.text = "Speler 1 Score:" + p1; } void OnCollisionEnter2D (Collision2D andere) {if(other.gameObject.tag == "Ball") { Destroy(other.gameObject); p1++; Instantiëren (bal, ball_respawn.position, ball_respawn.rotation); } } }

8. Sleep de prefab bal van het project in stap 1 naar de Ball-parameter. (Kijk naar foto 3)

9. Sleep de bal-respawn vanuit de hiërarchie naar de Ball-rerspawn-parameter. (Kijk naar foto 3)

10. sleep de score van speler 1 vanuit de hiërarchie naar de parameter Score. (Kijk naar foto 3)

Verklaring van de code:

Wanneer de bal tegen de bovenrand botst, vernietigt hij en komt weer terug op de ball_respawn-positie die we in stap 2 hebben toegewezen. vanuit de hiërarchie zal het respawnen, maar het zal niet bewegen. Ook wanneer de bal tegen de bovenrand botst, wordt een waarde die oorspronkelijk gelijk is aan 0, p1 genoemd, met 1 verhoogd. Deze waarde wordt als tekst weergegeven, dus als de bal tegen de bovenrand botst, neemt de score voor speler 1 met 1 toe.

Voer nu stappen 7, 8, 9 en 10 uit voor de onderste rand

maak voor stap 7 een script met de naam p2wins en kopieer in plaats daarvan de volgende code.

sleep voor stap 10 de score van speler 2 van de hiërarchie naar de parameter Score.

Code:

met behulp van System. Collections;

met behulp van System. Collections. Generic; met behulp van UnityEngine; met behulp van UnityEngine. SceneManagement; met behulp van UnityEngin. UI; public class p2wins: MonoBehaviour { public Text score; public Transform ball_respawn; openbare GameObject-bal; privé int p2 = 0; // Start wordt aangeroepen vóór de eerste frame-update void Start() { } // Update wordt eenmaal per frame void Update() aangeroepen { score.text = "Speler 2 Score:" + p2; } void OnCollisionEnter2D (Collision2D andere) { if(other.gameObject.tag == "Ball") { Destroy(other.gameObject); p2++; Instantiëren (bal, ball_respawn.position, ball_respawn.rotation); } } }

Aanbevolen: