Cuprins:

Cum să faci un joc multiplayer cu controlere Arduino: 6 pași
Cum să faci un joc multiplayer cu controlere Arduino: 6 pași

Video: Cum să faci un joc multiplayer cu controlere Arduino: 6 pași

Video: Cum să faci un joc multiplayer cu controlere Arduino: 6 pași
Video: Roblox se închide în România!😭😭😭😭 2024, Iulie
Anonim
Cum să faci un joc multiplayer cu controlere Arduino
Cum să faci un joc multiplayer cu controlere Arduino

V-ați întrebat vreodată cum dezvoltatorii de jocuri creează jocuri uimitoare la care oamenii din întreaga lume se bucură să se joace? Ei bine, astăzi îți voi oferi doar un mic indiciu despre asta, făcând un mic joc multiplayer care va fi controlat fie de un controler Arduino, pe care îl vei face și tu. Deci, să începem.

Provizii

Vei avea nevoie:

  • Un laptop
  • Unity Engine
  • Un ID C # care funcționează cu Unity, cum ar fi Visual Studio sau Atom. (Voi folosi codul Visual Studio)
  • 2X Arduino Nano
  • 2X Pană mare pentru pâine
  • Placă de pâine mică 2X
  • Comutator 4X Tack (Buton)
  • Rezistor 4X 200Ω
  • 12X fire de la jumper la masculin
  • IDE Arduino

Va fi util dacă aveți o înțelegere de bază despre utilizarea Unity, cu toate acestea, nu vă va afecta progresul, deoarece vă veți familiariza cu el în timp ce continuați să faceți jocul.

Link pentru descărcarea Unity Engine:

store.unity.com/download-nuo

Link pentru descărcarea codului Visual Studio IDE:

code.visualstudio.com/download

Link pentru descărcarea Arduino IDE:

www.arduino.cc/en/Main/Software

Pasul 1: Configurați marginile jocului

Configurați marginile jocului
Configurați marginile jocului
Configurați marginile jocului
Configurați marginile jocului
Configurați marginile jocului
Configurați marginile jocului

În primul rând, trebuie să descărcați unitatea

Odată ce ați terminat, puteți începe să configurați vizualizarea jocului.

Deschideți un nou proiect Unity, denumiți-l și selectați joc 2D.

Când proiectul se deschide, observați că există 3 secțiuni principale numite

  • Ierarhie (aici vor fi adăugate toate obiectele și detaliile jocului).
  • Scenă (unde configurați vizualizarea jocului).
  • Joc (unde puteți testa cum va merge jocul real).

Observați că sub ierarhie există scena dvs. și sub scenă există „Camera principală”. Când selectați camera din ierarhie, aceasta va fi selectată în scenă

(Orice se află în interiorul acestei camere va apărea în jocul real).

Uită-te la imaginea 1

Jocul nostru este format din două scânduri, o minge care se mișcă și borduri care limitează mișcarea scândurilor și a mingii.

Să începem prin a crea granițele.

  1. Pentru a crea un nou obiect de joc, selectați Materiale> Creare> Sprite> pătrat (denumiți-l „margini dreapta și stânga”) Uitați-vă la imaginea 2
  2. Glisați și fixați marginile din dreapta și din stânga către ierarhie și un pătrat va apărea în scenă.
  3. Reglați poziția axei x la (5) „margini dreapta și stânga”> inspector> transformare> poziție> X. Uită-te la imaginea 3
  4. Apoi reglați scala astfel încât să fie suficient de mare pentru a acoperi marginile camerei (trageți laturile superioare și inferioare ale pătratului pentru ao întinde).
  5. Reglați culoarea „de la margini dreapta și stânga”> inspector> randare sprite> culoare. Uită-te la imaginea 3
  6. Derulați în jos în inspector și selectați adăugare componentă, apoi tastați Rigidbody2D și apăsați Enter, aceasta va adăuga practic fizica obiectului dvs. de joc, deoarece îi conferă masă, gravitație și detectarea coliziunilor. Cu toate acestea, nu avem nevoie de gravitație în jocul nostru, deci faceți greutatea 0 în loc 1. De asemenea, va trebui să înghețați poziția și rotația, astfel încât marginea să nu se miște atunci când este ciocnită. Uită-te la imaginea 4
  7. selectați adăugare componentă, apoi tastați Box Collider 2D și apăsați Enter pentru a adăuga o zonă în jurul obiectului de joc în care pot fi detectate coliziuni. Uită-te la imaginea 4
  8. Acum selectați marginile din dreapta și din stânga și apăsați (ctrl + d) pentru ao duplica.
  9. Redenumiți-l „chenar stâng” și redenumiți primul („chenar drept”).
  10. Selectați marginea stângă și reglați poziția axei x la (-5) în același mod la pasul 3. Acum aveți margini dreapta și stânga.

Repetați cei 10 pași anteriori cu marginile sus și jos și modificați poziția y a pătratului în loc de poziția x. Previzualizarea finală ar trebui să fie ceva similar cu cea din imagine.

Uită-te la imaginea 5

Pasul 2: Adăugarea plăcilor și realizarea controlerelor

Adăugarea plăcilor și realizarea controlerelor
Adăugarea plăcilor și realizarea controlerelor
Adăugarea plăcilor și realizarea controlerelor
Adăugarea plăcilor și realizarea controlerelor
Adăugarea plăcilor și realizarea controlerelor
Adăugarea plăcilor și realizarea controlerelor

Adăugarea de panouri

Creați un nou obiect de joc și denumiți-l jucător 1.

Regla:

  • Scala: X (1.2), Y (0.15), Z (1)
  • Poziție: X (0), Y (-3,6), z (0)
  • Adăugați BoxCollider2D
  • Adăugați Rigidbody 2D și înghețați axele y și z.

Duplicați (ctrl + d) și redenumiți playerul de copiere 2.

Regla:

  • Scala: X (1,2), Y (0,15), Z (1)
  • Poziție: X (0), Y (3.6), z (0)
  • Un BoxCollider va fi deja acolo.
  • Un Rigidbody 2D va fi deja acolo, iar axele y și z vor fi deja înghețate.

Uită-te la imaginea 1

Realizarea de controlere

Vei avea nevoie:

  • 2X Arduino Nano
  • 2X Pană mare pentru pâine
  • Placă de pâine mică 2X
  • Comutator 4X Tack (Buton)
  • Rezistor 4X
  • 12X fire de la jumper la masculin

Uită-te acum la fotografiile și cartografierea panoului de pâine pentru a asambla joystick-urile.

  1. Atașați un cip Arduino Nano cu o placă mică.
  2. atașați 2 comutatoare Tack pe placa mare pentru pâine, așa cum se arată în imagine. Încercați să păstrați partea dreaptă a plăcii pentru pâine simetrică cu cea din stânga, deoarece acest lucru va face joystick-ul să arate mai bine (Puteți utiliza coloana 30 ca simetrie linia)
  3. Conectați pinul din stânga sus al butonului stâng cu pinul de 5V din Arduino de pe placa de pâine mică (lucrurile care sunt conectate cu aceeași coloană din placa de panou sunt conectate între ele).
  4. Conectați pinul din dreapta sus al butonului din dreapta cu pinul de 5V din Arduino.
  5. Conectați pinul din dreapta jos al butonului stâng cu un punct de pe coloana 31 folosind un rezistor.
  6. Conectați pinul din stânga jos al butonului din dreapta cu un punct de pe coloana 29 folosind un rezistor.
  7. Conectați rezistențele cu pinul GND din Arduino.
  8. Conectați pinul din dreapta sus al butonului stâng cu pinul D3 din Arduino.
  9. Conectați pinul din stânga sus al butonului din dreapta cu pinul D9 din Arduino.
  10. Acum repetați acești pași și faceți al doilea controler.

Pasul 3: Conectarea Arduino la portul serial

Conectarea Arduino la portul serial
Conectarea Arduino la portul serial
Conectarea Arduino la portul serial
Conectarea Arduino la portul serial
Conectarea Arduino la portul serial
Conectarea Arduino la portul serial
Conectarea Arduino la portul serial
Conectarea Arduino la portul serial

În primul rând, va trebui să instalați Arduino IDE.

Odată ce acestea sunt instalate, puteți începe prin a crea un program Arduino care primește intrări de la butoane și le stochează într-un port serial (port COM). Când o placă Arduino este conectată la laptop, sistemul de operare recunoaște automat placa ca un port serial, în care programe pot fi încărcate. Valorile stocate în portul serial pot fi utilizate în pasul următor atunci când conectăm Unity Engine la portul serial.

Acum să conectăm Arduino la portul Serial.

Uită-te la poze

  1. Conectați un Arduino la laptop
  2. Instrumente> Placă> Arduino Nano
  3. Dacă cipul dvs. Arduino este recent (2018-2020) Instrumente> Procesor> ATmega328P (Old Bootloader).
  4. Dacă cipul dvs. Arduino nu este recent (înainte de 2018) Instrumente> Procesor> ATmega328P
  5. Instrumente> Port> COM (orice număr apare, în cazul meu este 10). * Acesta este portul serial în care vor fi stocate valorile.
  6. Copiați codul și lipiți-l în IDE-ul Arduino și apăsați ctrl + u pentru a încărca programul.
  7. Repetați cu al doilea Arduino. (când faceți pasul 5 asigurați-vă că alegeți un alt port COM, astfel încât ambele controlere să nu fie conectate la același port serial).

Cod:

configurare nulă () {

Serial.begin (9600); pinMode (3, INPUT); // Spunând Arduino să primească o intrare de la pinul D3 pinMode (9, INPUT); // Spunându-i lui Arduino să primească o intrare de la pinul D9} void loop () {if (digitalRead (3) == 1) {/ * Dacă Arduino primește o intrare de 1 Serial.write (1); de la pinul 3 Ieșire o valoare de 1 la portul serial Serial.flush (); * / întârziere (2); } if (digitalRead (9) == 1) {/ * Dacă Arduino primește o intrare de 1 Serial.write (2); de la pinul 9 Ieșire o valoare de 2 la portul serial Serial.flush (); * / întârziere (2); }}

Explicația programului:

Acest cod preia pur și simplu o intrare de la pinul D3 și pinul D9 din Arduino, care sunt conectate la butoane. Butoanele sunt fie apăsate, fie neaprinse, ceea ce înseamnă că citirile preluate de la acestea sunt fie 1 (apăsat), fie 0 (neaprimat). Dacă intrarea de la butonul din dreapta (din D9) este 1 (apăsat) stocați o valoare 1 în portul serial. Dacă intrarea din butonul din stânga (din D3) este 1 (apăsat) stocați o valoare de 2 în portul Serial.

Pasul 4: Conectarea Unity cu portul serial

Conectarea Unity cu portul serial
Conectarea Unity cu portul serial
Conectarea Unity cu portul serial
Conectarea Unity cu portul serial

Pentru acest pas, vom identifica portul serial în Unity, astfel încât să poată primi intrările de la Arduino atunci când butoanele sunt apăsate. Instalați Visual Studio Code pe laptop. Apoi accesați Unity, selectați playerul 1 din ierarhie, derulați în jos și selectați adăugare componentă și tastați player1_motion, apoi apăsați Enter. Uită-te la imaginea 1

Un script C # va fi creat în inspector, faceți clic dreapta pe acesta și selectați editarea scriptului, codul vizual de studio ar trebui să se deschidă și va afișa un cod implicit care arată ca imaginea 2.

Copiați următorul cod, apoi schimbați "SerialPort sp = new SerialPort (" COM10 ", 9600);" cu SerialPort sp = SerialPort nou ("port COM la care este conectat Arduino", 9600); îl puteți găsi revenind la codul Arduino și accesând Instrumente> Port> COM (orice număr apare).

Cod:

folosind System. Collections;

folosind System. Collections. Generic; folosind UnityEngine; folosind System. IO. Ports; public class player1_motion: MonoBehaviour {float speed = 8; suma floatului privat SerialPort sp = SerialPort nou ("COM10", 9600); // Start este apelat înainte de prima actualizare cadru void Start () {sp. Open (); sp. ReadTimeout = 1; } // Actualizarea este apelată o dată pe cadru nul Update () {amounttomove = 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); }}}

Explicația codului:

Acest cod spune unității să primească intrări de la portul serial (COM 10). Când butonul stânga este apăsat, Arduino trimite o valoare 1 la portul serial, dacă unitatea primește 1 de la portul serial, se adaugă o viteză obiectului de joc „jucător 1” în direcția stângă. Când este apăsat butonul din dreapta, Arduino trimite o valoare 2 la portul serial, dacă unitatea primește 2 de la portul serial, se adaugă o viteză obiectului de joc „jucător 1” în direcția corectă. dacă portul serial nu primește o valoare de la portul serial, nu se adaugă nicio viteză în niciun sens, deci placa rămâne staționară.

După ce copiați codul, apăsați F5 pentru a construi și rula codul. Reveniți la unitate și apăsați butonul de redare, jucătorul 1 ar trebui să se deplaseze la dreapta atunci când apăsați dreapta și stânga când apăsați stânga.

Acum, faceți aceiași pași din nou, dar cu playerul 2 și asigurați-vă că scrieți în „Adăugare componentă” player2_motion în loc de player1_motion și pentru a identifica al doilea port COM la care este conectat al doilea controler, nu același port serial.

De asemenea, va trebui să schimbați „public class player1_motion: MonoBehaviour” în „public class player2_motion: MonoBehaviour” în codul însuși.

Pasul 5: Adăugarea mingii

Adăugarea mingii
Adăugarea mingii
Adăugarea mingii
Adăugarea mingii
Adăugarea mingii
Adăugarea mingii
  1. Adăugați un nou obiect de joc, dar de data aceasta alegeți un cerc în loc de pătrat.
  2. Redenumiți-o „minge”.
  3. Glisați și fixați în ierarhie.
  4. Reglați scala (X: 0,2 - Y: 0,2 - Z: 0,2).
  5. Adăugați un Rigidbody 2D și înghețați numai axa Z.
  6. Schimbați masa la 0.0001
  7. Schimbați Gravity Scale la 0.
  8. Adăugați un Box Collider 2D.
  9. Accesați Materiale> Creare> Material de fizică 2D Uitați-vă la imaginea 1
  10. schimbați-l în „sări”
  11. Schimbați frecarea la zero de la inspector
  12. Schimbați bounciness la 1 de la inspector
  13. Glisați și fixați „bounce” în Rigidbody 2D> Material Uitați-vă la imaginea 2
  14. Selectați din nou „minge” din ierarhie și mergeți la adăugarea componentei și tastați Ball_movement, apoi apăsați Enter.
  15. Faceți clic dreapta pe script și selectați editarea scriptului.
  16. Copiați codul de mai jos și apăsați F5 pentru al construi și a-l rula.

Cod:

folosind System. Collections;

folosind System. Collections. Generic; folosind UnityEngine; public class Ball_movement: MonoBehaviour {// Start este apelat înainte de prima actualizare cadru private float force = 2; void Start () {StartCoroutine (move ()); } IEnumerator move () {yield return new WaitForSeconds (2); GetComponent (). AddForce (nou Vector2 (1f, 0.5f) * 0.02f * forță); }}

Explicatia codului

Acest cod conferă mingii o viteză în ambele direcții direcția X și direcția Y cu aceeași magnitudine, ceea ce face ca mingea să se miște la un unghi de 45 °. În pasul 8 am adăugat un material de fizică la minge și i-am schimbat bounciness-ul, aceasta menținând mișcarea mingii în joc.

Pasul 6: Finalizarea jocului

Finalizarea jocului
Finalizarea jocului
Finalizarea jocului
Finalizarea jocului
Finalizarea jocului
Finalizarea jocului
Finalizarea jocului
Finalizarea jocului

Acum trebuie să facem posibilă pierderea, dacă rulați jocul, veți observa că, atunci când mingea trece de jucătorul 1 sau de jucătorul 2, acesta ricoșează de pe graniță și nu exact asta avem nevoie în jocul nostru. În schimb, vrem să facem un contor de scor care să numere scorul de fiecare dată când mingea se ciocnește cu marginile sus sau jos și să resetăm poziția mingii.

  1. Glisați și fixați mingea de la Ierarhie la Proiect, ați făcut o prefabricare a mingii, astfel încât să o puteți folosi mai târziu.
  2. Faceți clic dreapta pe Ierarhie și selectați Creare gol. un obiect gol va apărea, îl va redenumi în minge respawn și își va schimba poziția pentru a fi aceeași cu poziția mingii.
  3. Faceți clic dreapta pe ierarhie și selectați UI >> Text. Observați că textul însoțește o pânză, poziția textului în joc depinde de poziția textului în pânză, nu de marginile jocului nostru. (Uită-te la imaginea 1).
  4. Schimbați poziția textului în locul în care doriți să fie.
  5. Repetați din nou pașii 3 și 4 pentru scorul celui de-al doilea jucător.
  6. Introduceți primul text „Scorul jucătorului 1: 0” și introduceți al doilea text „Scorul jucătorului 2: 0”. (Uită-te la imaginea 2).
  7. Creați un script în marginea sus numit p1wins și copiați următorul cod.

Cod:

folosind System. Collections;

folosind System. Collections. Generic; folosind UnityEngine; folosind UnityEngine. SceneManagement; folosind UnityEngine. UI; public class p1wins: MonoBehaviour {scor public text; public Transform ball_respawn; mingea publică GameObject; private int p1 = 0; // Start este apelat înainte de primul cadru de actualizare nul Start () {} // Actualizarea este apelată o dată pe cadru gol Actualizare () {score.text = "Player 1 Score:" + p1; } void OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Destroy (other.gameObject); p1 ++; Instantiate (mingea, minge_respawn.poziție, minge_respawn.rotare); }}}

8. Trageți și fixați prefabricarea bilă din proiect la pasul 1 în parametrul Ball. (Uită-te la imaginea 3)

9. Glisați și fixați mingea respawn din ierarhie în parametrul Ball-rerspawn. (Uită-te la imaginea 3)

10. glisați și fixați scorul jucătorului 1 din ierarhie în parametrul Scor. (Uită-te la imaginea 3)

Explicația codului:

Când mingea se ciocnește cu marginea superioară, aceasta o distruge și reapare din nou în poziția ball_respawn pe care am atribuit-o la pasul 2. scopul de a face mingea prefabricată este să o putem reapărea cu toate caracteristicile sale, altfel, dacă am folosit mingea din ierarhie va reapărea, dar nu se va mișca. De asemenea, atunci când mingea se ciocnește cu marginea superioară, o valoare care este inițial egală cu 0 numită p1 crește cu 1. această valoare este afișată ca text, astfel încât atunci când mingea se ciocnește cu marginea superioară, scorul pentru jucătorul 1 crește cu 1.

Acum faceți pașii 7, 8, 9 și 10 pentru marginea de jos

pentru pasul 7, creați un script numit p2wins și copiați în schimb următorul cod.

pentru pasul 10, glisați și fixați scorul jucătorului 2 din ierarhie în parametrul Scor.

Cod:

folosind System. Collections;

folosind System. Collections. Generic; folosind UnityEngine; folosind UnityEngine. SceneManagement; folosind UnityEngine. UI; public class p2wins: MonoBehaviour {public Text score; public Transform ball_respawn; mingea publică GameObject; private int p2 = 0; // Start este apelat înainte de primul cadru de actualizare nul Start () {} // Actualizarea este apelată o dată pe cadru gol Actualizare () {score.text = "Player 2 Score:" + p2; } void OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Destroy (other.gameObject); p2 ++; Instantiate (mingea, minge_respawn.poziție, minge_respawn.rotare); }}}

Recomandat: