INHOUDSOPGAWE:

Hoe om 'n multiplayer -speletjie te maak met Arduino -beheerders: 6 stappe
Hoe om 'n multiplayer -speletjie te maak met Arduino -beheerders: 6 stappe

Video: Hoe om 'n multiplayer -speletjie te maak met Arduino -beheerders: 6 stappe

Video: Hoe om 'n multiplayer -speletjie te maak met Arduino -beheerders: 6 stappe
Video: Hoe vapen er écht uitziet… 😅 2024, November
Anonim
Hoe om 'n multiplayer -speletjie te maak met Arduino -beheerders
Hoe om 'n multiplayer -speletjie te maak met Arduino -beheerders

Het u al ooit gewonder hoe spelontwikkelaars ongelooflike speletjies skep wat mense wêreldwyd geniet om te speel? Wel, vandag gaan ek u net 'n klein wenk gee daaroor deur 'n klein multiplayer -speletjie te maak wat beheer word deur óf 'n Arduino -kontroleerder wat u ook sal maak. Dus, laat ons begin.

Voorrade

Jy sal nodig hê:

  • N skootrekenaar
  • Eenheidsmotor
  • 'N C# IDE wat saam met Unity werk, soos visual studio of Atom. (Ek sal Visual Studio Code gebruik)
  • 2X Arduino Nano
  • 2X Grootbroodbord
  • 2X klein broodbord
  • 4X -skakelaar (drukknop)
  • 4X 200Ω Weerstand
  • 12X manlike tot manlike draaddrade
  • Arduino IDE

Dit sal handig wees as u 'n basiese begrip van die gebruik van Unity het, maar dit beïnvloed nie u vordering nie, aangesien u daarmee vertroud sal raak terwyl u aan die gang is met die spel.

Skakel om Unity Engine af te laai:

store.unity.com/download-nuo

Skakel vir die aflaai van Visual Studio Code IDE:

code.visualstudio.com/download

Skakel om Arduino IDE af te laai:

www.arduino.cc/en/Main/Software

Stap 1: Stel die spelgrense op

Stel die spelgrense op
Stel die spelgrense op
Stel die spelgrense op
Stel die spelgrense op
Stel die spelgrense op
Stel die spelgrense op

Eerstens moet u eenheid aflaai

Sodra dit klaar is, kan u begin met die opstel van u spelbeskouing.

Maak 'n nuwe Unity -projek oop, noem dit en kies 2D -speletjie.

As die projek oopmaak, let op dat daar drie hoofafdelings genoem word

  • Hiërargie (dit is waar al u spelvoorwerpe en besonderhede bygevoeg sal word).
  • Toneel (waar u die spelbeskouing opstel).
  • Spel (waar u kan toets hoe die regte spel sal verloop).

Let op dat onder die hiërargie u toneel is en onder die toneel die 'Hoofkamera'. As u die kamera uit die hiërargie kies, word dit in die toneel gekies

(Enigiets binne die grense van hierdie kamera sal in die regte spel verskyn).

Kyk na prent 1

Ons spel bestaan uit twee planke, 'n bal wat rondbeweeg, en grense wat die beweging van die planke en die bal beperk.

Laat ons begin deur die grense te skep.

  1. Om 'n nuwe spelvoorwerp te skep, kies Bates> Skep> Sprites> vierkant (noem dit "regter- en linkergrense") Kyk na prent 2
  2. Sleep die grense na regs en links na die hiërargie, en 'n vierkant verskyn in die toneel.
  3. Pas die posisie van sy x -as na (5) "regter- en linkergrense"> inspekteur> transformeer> posisie> X. Kyk na prent 3
  4. Pas dan die skaal aan sodat dit groot genoeg is om die rande van die kamera te bedek (sleep die boonste en onderste kant van die vierkant om dit te rek).
  5. Pas die kleur aan "van regter- en linkerrand"> inspekteur> sprite -weergawe> kleur. Kyk na prent 3
  6. Blaai af in die inspekteur en kies add component, tik Rigidbody2D en druk enter, dit sal basies fisika by u spelvoorwerp voeg, aangesien dit massa, swaartekrag en botsingsopsporing gee. Ons het egter nie swaartekrag nodig in ons spel nie, dus maak die gravitasie in plaas daarvan 1. U moet ook die posisie en rotasie vries sodat die grens nie beweeg as dit bots nie. Kyk na prent 4
  7. kies voeg komponent toe, tik Box Collider 2D en druk enter om 'n gebied rondom die spelvoorwerp by te voeg waar botsings opgespoor kan word. Kyk na prent 4
  8. Kies nou die regter- en linkergrense en druk (ctrl+d) om dit te dupliseer.
  9. Hernoem dit "linkerrand" en hernoem die eerste een ("regterkant").
  10. Kies die linkerrand en pas die posisie van die x-as na (-5) op dieselfde manier in stap 3. Nou het u die regter- en linkerrand.

Herhaal die vorige 10 stappe met die op- en afgrense en verander die vierkant se y -posisie in plaas van die x -posisie. Die laaste voorskou moet iets soortgelyk aan die in die prentjie wees.

Kyk na prent 5

Stap 2: Voeg planke by en maak beheerders

Byvoeg van planke en maak beheerders
Byvoeg van planke en maak beheerders
Byvoeg van planke en maak beheerders
Byvoeg van planke en maak beheerders
Byvoeg van planke en maak beheerders
Byvoeg van planke en maak beheerders

Byvoeging van borde

Maak 'n nuwe spelvoorwerp en noem dit speler 1.

Pas aan:

  • Skaal: X (1.2), Y (0.15), Z (1)
  • Posisie: X (0), Y (-3.6), z (0)
  • Voeg BoxCollider2D by
  • Voeg Rigidbody 2D by en vries die y- en z -as.

Dupliseer (ctrl+d) en hernoem die kopiespeler 2.

Pas aan:

  • Skaal: X (1.2), Y (0.15), Z (1)
  • Posisie: X (0), Y (3.6), z (0)
  • 'N BoxCollider sal reeds daar wees.
  • 'N Rigidbody 2D sal reeds daar wees en die y- en z -asse sal reeds gevries word.

Kyk na prent 1

Maak beheerders

Jy sal nodig hê:

  • 2X Arduino Nano
  • 2X Grootbroodbord
  • 2X klein broodbord
  • 4X -skakelaar (drukknop)
  • 4X Weerstand
  • 12X manlike tot manlike draaddrade

Kyk nou na die broodbordfoto's en kartering om die joysticks te monteer.

  1. Bevestig een Arduino Nano -skyfie met 'n klein broodbord.
  2. Heg 2 klepskakelaars aan op die groot broodbord, soos in die prentjie getoon. reël)
  3. Verbind die pen links bo van die linkerknoppie met die 5V-pen in die Arduino op die klein broodbord (dinge wat met dieselfde kolom in die broodbord verbind word, is met mekaar verbind).
  4. Verbind die pen regs bo van die regterknoppie met die 5V-pen in die Arduino.
  5. Verbind die pen onder regs van die linkerknoppie met 'n punt op die 31ste kolom met 'n weerstand.
  6. Verbind die pen onder aan die regterknoppie met 'n punt op die 29ste kolom met 'n weerstand.
  7. Verbind die weerstande met die GND -pen in die Arduino.
  8. Verbind die pen regs bo van die linkerknoppie met die D3-pen in die Arduino.
  9. Verbind die pen links bo van die regterknoppie met die D9-pen in die Arduino.
  10. Herhaal nou hierdie stappe en maak die tweede kontroleerder.

Stap 3: Verbind Arduino met die seriële poort

Verbind Arduino met die seriële poort
Verbind Arduino met die seriële poort
Verbind Arduino met die seriële poort
Verbind Arduino met die seriële poort
Verbind Arduino met die seriële poort
Verbind Arduino met die seriële poort
Verbind Arduino met die seriële poort
Verbind Arduino met die seriële poort

Eerstens moet u die Arduino IDE installeer.

Sodra hulle geïnstalleer is, kan u begin met 'n Arduino -program wat insette van die knoppies ontvang en dit in 'n seriële poort (COM -poort) stoor. As 'n Arduino -bord aan u skootrekenaar gekoppel is, herken die bedryfstelsel die bord outomaties as 'n seriële poort, waarheen programme opgelaai kan word. Die waardes wat in die seriële poort gestoor is, kan in die volgende stap gebruik word wanneer ons Unity Engine met die seriële poort verbind.

Kom ons verbind nou die Arduino met die seriële poort.

Kyk na die prente

  1. Koppel 'n Arduino met u skootrekenaar
  2. Gereedskap> Bord> Arduino Nano
  3. As u Arduino-chip onlangs (2018-2020) gereedskap> verwerker> ATmega328P (Old Bootloader) is.
  4. As u Arduino -chip nie onlangs (voor 2018) gereedskap> verwerker> ATmega328P is nie
  5. Gereedskap> Poort> COM (watter nommer ook al verskyn, in my geval is dit 10). * Dit is die seriële poort waar waardes gestoor sal word.
  6. Kopieer die kode en plak dit in die Arduino IDE en druk ctrl+u om die program op te laai.
  7. Herhaal met die tweede Arduino. (as u stap 5 doen, moet u 'n ander COM -poort kies, sodat beide beheerders nie aan dieselfde seriële poort gekoppel kan word nie).

Kode:

ongeldige opstelling () {

Serial.begin (9600); pinMode (3, INVOER); // Vertel die Arduino om 'n insette van pin D3 pinMode (9, INPUT) te ontvang; // Sê vir die Arduino om 'n insette van pen D9} leemte -lus () {if (digitalRead (3) == 1) { /* te ontvang as die Arduino 'n inset van 1 Serial.write (1) ontvang; vanaf pen 3 Gee 'n waarde van 1 na die seriële poort Serial.flush (); */ vertraging (2); } if (digitalRead (9) == 1) { /* As die Arduino 'n inset van 1 Serial.write (2) ontvang; vanaf pen 9 Gee 'n waarde van 2 na die seriële poort Serial.flush (); */ vertraging (2); }}

Program verduideliking:

Hierdie kode neem eenvoudig 'n invoer van die D3 -pen en die D9 -pen in die Arduino, wat aan die knoppies gekoppel is. Die knoppies word óf ingedruk óf ongedruk, wat beteken dat die lesings wat daaruit geneem word óf 1 (ingedruk) óf 0 (ongedruk) is. As die invoer van die regterknoppie (vanaf D9) 1 (ingedruk) is, stoor 'n waarde van 1 in die seriële poort. As die invoer vanaf die linkerknoppie (vanaf D3) 1 is (ingedruk), stoor 'n waarde van 2 in die seriële poort.

Stap 4: Koppel eenheid met die seriële poort

Koppel eenheid met die seriële poort
Koppel eenheid met die seriële poort
Koppel eenheid met die seriële poort
Koppel eenheid met die seriële poort

Vir hierdie stap gaan ons die seriële poort in Unity identifiseer, sodat dit die insette van Arduino kan ontvang as die knoppies ingedruk word. Installeer Visual Studio Code op u skootrekenaar. Gaan dan na Unity, kies speler 1 uit die hiërargie, blaai af en kies komponent voeg en tik player1_motion en druk dan enter. Kyk na prent 1

'N C# -skrip sal in die inspekteur geskep word, met die rechtermuisknop daarop en kies' edit script ', die visuele ateljeekode moet oopmaak en 'n standaardkode wat op prent 2 lyk, vertoon.

Kopieer die volgende kode en verander dan "SerialPort sp = new SerialPort (" COM10 ", 9600);" met SerialPort sp = nuwe SerialPort ("COM -poort waarmee u Arduino gekoppel is", 9600); u kan dit vind deur terug te gaan na u Arduino -kode en na Tools> Port> COM te gaan (watter nommer ook al verskyn).

Kode:

met behulp van System. Collections;

met behulp van System. Collections. Generic; gebruik UnityEngine; met behulp van System. IO. Ports; openbare klas player1_motion: MonoBehaviour {float speed = 8; privaat dryf amounttomove; SerialPort sp = nuwe SerialPort ("COM10", 9600); // Start word genoem voor die eerste raamopdatering leemte Start () {sp. Open (); sp. ReadTimeout = 1; } // Update word een keer per raam leeggemaak Update () {amounttomove = spoed*0.01f; as (sp. IsOpen) {probeer {moveObject (sp. ReadByte ()); print (sp. ReadByte ()); } catch (System. Exception) {}}} void moveObject (int Direction) {if (Direction == 1) {transform. Translate (Vector3.links*amounttomove, Space. World); } as (Rigting == 2) {transform. Translate (Vector3.right*amounttomove, Space. World); }}}

Kode se verduideliking:

Hierdie kode vertel die eenheid om insette vanaf die seriële poort (COM 10) te ontvang. As die linkerknoppie ingedruk word, stuur die Arduino 'n waarde van 1 na die seriële poort, as eenheid 1 van die seriële poort ontvang, word 'n snelheid by die spelvoorwerp "speler 1" in die linker rigting gevoeg. As die regte knoppie ingedruk word, stuur die Arduino 'n waarde van 2 na die seriële poort, as eenheid 2 uit die seriële poort ontvang, word 'n snelheid in die regte rigting by die spelvoorwerp "speler 1" gevoeg. as die seriële poort geen waarde van die seriële poort ontvang nie, word geen snelheid in beide rigtings bygevoeg nie, daarom bly die bord stil.

Nadat u die kode gekopieer het, druk F5 om die kode te bou en uit te voer. Gaan terug na eenheid en druk die speelknoppie; speler 1 moet regs beweeg as u regs en links druk as u links druk.

Doen nou dieselfde stappe, maar met speler 2 en skryf in die 'Voeg komponent' speler2_motion in plaas van player1_motion en identifiseer die tweede COM -poort waarmee die tweede beheerder gekoppel is, nie dieselfde seriële poort nie.

U moet ook "public class player1_motion: MonoBehaviour" verander na "public class player2_motion: MonoBehaviour" in die kode self.

Stap 5: Voeg die bal by

Voeg die bal by
Voeg die bal by
Voeg die bal by
Voeg die bal by
Voeg die bal by
Voeg die bal by
  1. Voeg 'n nuwe spelvoorwerp by, maar kies hierdie keer 'n sirkel in plaas van 'n vierkant.
  2. Hernoem dit "bal".
  3. Sleep en laat val in die hiërargie.
  4. Pas die skaal aan (X: 0.2 - Y: 0.2 - Z: 0.2).
  5. Voeg 'n Rigidbody 2D by en vries slegs die Z -as.
  6. Verander die massa na 0,0001
  7. Verander die gravitasie skaal na 0.
  8. Voeg 'n Box Collider 2D by.
  9. Gaan na bates> skep> fisika materiaal 2D kyk na prent 1
  10. verander sy naam na "weiering"
  11. Verander die wrywing in nul van die inspekteur
  12. Verander die sprankel na 1 van die inspekteur
  13. Sleep "weiering" in Rigidbody 2D> Materiaal Kyk na prent 2
  14. Kies weer 'bal' uit die hiërargie en gaan na die komponent by en tik Ball_movement en druk op enter.
  15. Klik met die rechtermuisknop op die script en kies edit script.
  16. Kopieer die onderstaande kode en druk F5 om dit te bou en uit te voer.

Kode:

met behulp van System. Collections;

met behulp van System. Collections. Generic; gebruik UnityEngine; openbare klas Ball_movement: MonoBehaviour {// Start word gebel voor die eerste raamopdatering private float force = 2; leegloop Start () {StartCoroutine (move ()); } IEnumerator move () {opbrengs opbrengs nuwe WaitForSeconds (2); GetComponent (). AddForce (nuwe Vector2 (1f, 0.5f)*0.02f*krag); }}

Kode 'verduideliking

Hierdie kode gee die bal 'n snelheid in beide rigtings in die X -rigting en die Y -rigting met dieselfde grootte, wat die bal in 'n hoek van 45 ° laat beweeg. In stap 8 het ons 'n fisika -materiaal by die bal gevoeg en die stewigheid daarvan verander; dit behou die beweging van die bal deur die spel.

Stap 6: Finalisering van die spel

Die finalisering van die spel
Die finalisering van die spel
Die finalisering van die spel
Die finalisering van die spel
Die finalisering van die spel
Die finalisering van die spel
Die finalisering van die spel
Die finalisering van die spel

Nou moet ons verloor moontlik maak. As u die spel hardloop, sal u agterkom dat wanneer die bal speler 1 of speler 2 verbysteek, dit net van die grens af spring, en dit is nie presies wat ons in ons spel nodig het nie. In plaas daarvan wil ons 'n tellerteller maak wat die telling tel elke keer as die bal teen die op- of afgrense bots en die posisie van die bal herstel.

  1. Sleep die bal van die hiërargie na die projek, u het 'n voorafvervaardigde bal gemaak sodat u dit later kan gebruik.
  2. Klik met die rechtermuisknop op die hiërargie en kies Maak leeg. 'n leë voorwerp verskyn, hernoem dit na balherhaling en verander die posisie in dieselfde posisie as die bal se posisie.
  3. Klik met die rechtermuisknop op die hiërargie en kies UI >> Text. Let op dat die teks met 'n doek gepaard gaan, die posisie van die teks in die spel hang af van die posisie van die teks in die doek, nie in die grense van ons spel nie. (Kyk na prent 1).
  4. Verander die posisie van die teks na waar u dit ook al wil hê.
  5. Herhaal stap 3 en 4 weer vir die telling van die tweede speler.
  6. Tik die eerste teks "Speler 1 telling: 0" in en tik die tweede teks "Speler 2 telling: 0" in. (Kyk na prent 2).
  7. Skep 'n script in die boonste rand met die naam p1wins en kopieer die volgende kode.

Kode:

met behulp van System. Collections;

met behulp van System. Collections. Generic; gebruik UnityEngine; met behulp van UnityEngine. SceneManagement; gebruik UnityEngine. UI; openbare klas p1wins: MonoBehaviour {publieke teks telling; publiek Transformeer ball_respawn; openbare GameObject -bal; private int p1 = 0; // Begin word voor die eerste raamopdatering leemte genoem Start () {} // Update word een keer per raam leeggemaak Update () {score.text = "Speler 1 telling:" + p1; } maak OnCollisionEnter2D ongeldig (Collision2D anders) {if (other.gameObject.tag == "Ball") {Destroy (other.gameObject); p1 ++; Instantiate (bal, bal_respawn.posisie, bal_respawn.rotasie); }}}

8. Sleep die voorafvervaardigde bal van die projek in stap 1 na die balparameter. (Kyk na prent 3)

9. Sleep die bal van die hiërargie na die bal-rerspawn parameter. (Kyk na prent 3)

10. sleep speler 1 telling van hiërargie na die telling parameter. (Kyk na prent 3)

Kode se verduideliking:

As die bal met die boonste rand bots, word dit vernietig en weer teruggekeer by die bal_respawn -posisie wat ons in stap 2 toegeken het. uit die hiërargie sal dit weer opkom, maar dit sal nie beweeg nie. As die bal met die boonste grens bots, neem 'n waarde wat oorspronklik gelyk is aan 0 genaamd p1 toe met 1. Hierdie waarde word as teks vertoon, dus as die bal met die boonste grens bots, verhoog die telling vir speler 1 met 1.

Doen nou stappe 7, 8, 9 en 10 vir die afgrens

vir stap 7, skep 'n script genaamd p2wins en kopieer die volgende kode in plaas daarvan.

vir stap 10, sleep en speel speler 2 -telling van die hiërargie na die tellingparameter.

Kode:

met behulp van System. Collections;

met behulp van System. Collections. Generic; gebruik UnityEngine; gebruik UnityEngine. SceneManagement; gebruik UnityEngine. UI; openbare klas p2wins: MonoBehaviour {publieke teks telling; publiek Transformeer ball_respawn; openbare GameObject -bal; private int p2 = 0; // Begin word voor die eerste raamopdatering leemte begin () {} // Opdatering word een keer per raam leeggemaak Update () {score.text = "Speler 2 telling:" + p2; } maak OnCollisionEnter2D ongeldig (Collision2D anders) {if (other.gameObject.tag == "Ball") {Destroy (other.gameObject); p2 ++; Instantiate (bal, bal_respawn.posisie, bal_respawn.rotasie); }}}

Aanbeveel: