Cum sa faci un controler de joc personalizat cu arduino si unitate

Cum sa faci un controler de joc personalizat cu arduino si unitate / DIY

Ați vrut vreodată să vă proiectați propriul controler de joc? E mai ușor decât crezi!

În acest proiect scurt vom construi un simplu controler de joc personalizat pentru a fi folosit cu motorul de joc Unity. Acest controler va fi alimentat de un Arduino Uno, deși ați putea folosi una dintre cele mai multe alternative Arduino Ghid de cumpărare: Care ar trebui să obțineți? Arduino Ghidul de cumpărare: care ar trebui să obțineți? Există atât de multe feluri de plăci de arduino, acolo vei fi iertat că ești confuz. Care ar trebui să cumpărați pentru proiectul dvs.? Să ne ajute, cu acest ghid de cumpărare Arduino! Citiți mai multe despre acest proiect. Vom crea, de asemenea, un joc de bază în care veți folosi controlerul dvs. pentru a evita căderea obiectelor și încetinirea timpului.

Pentru acest proiect veți avea nevoie

  • Arduino sau un microcontroler similar
  • Rezistor 1 x 10k Ohm
  • 1 x comutator moment
  • 1 x Potențiometru
  • Fire de legătură
  • Un pâine
  • Unitate motor de joc
  • Pluginul Uniduino de la Unity Asset Store ($ 30)
  • Completați codul de proiect, în cazul în care nu doriți să îl scrieți (nu include pluginul Uniduino)

Cele mai multe dintre aceste lucruri sunt disponibile într-un kit de pornire Arduino. Dacă nu ați primit un kit de pornire, consultați ghidul nostru pentru alegerea celor mai bune 4 seturi Best Starter pentru începători Arduino 4 cele mai bune truse de pornire pentru începători Arduino Există o mulțime de proiecte arduino pentru începători excelente pe care le puteți utiliza pentru a începe, au nevoie de un Arduino și de unele componente în primul rând. Iată selecția noastră de 4 dintre cele mai bune kituri de pornire pentru ... Citește mai multe pentru tine.

Puteți face controlerul dvs. cât de complicat doriți, deși pentru acest exemplu vom configura un potențiometru și un buton - perfect pentru controlul unui joc arcade simplu.

Asamblarea controlerului

Configurați panza și Arduino așa cum se arată în imaginea de mai jos. Aceasta este ceea ce vom folosi ca controler de joc, deși ați putea folosi aproape aceeași setare ca un controler midi DIY Cum sa faci un controler MIDI cu un arduino Cum sa faci un controler MIDI cu un arduino Ca muzician care sa acumulat o colecție de instrumente muzicale și cutii de zgomot, umilul Arduino este instrumentul perfect pentru a crea un controler MIDI personalizat. Citește mai mult!

Pregătirea dvs. Arduino

Odată ce aveți totul conectat, conectați dispozitivul dvs. Arduino prin USB. În Ardeino Software IDE cap la Instrumente> Consiliul și Instrumente> Port pentru a selecta microcontrolerul și portul pe care îl utilizați. ID-ul Arduino vine însoțit de schița de care avem nevoie și o puteți găsi sub Fișier> Exemple> Firmata> StandardFirmata. Faceți clic pe Încărcați și veți fi gata să plecați.

Dacă sunteți nou la Arduino și capul ușor se topește, consultați Ghidul nostru pentru începători Începeți cu Arduino: Ghidul începătorului Începeți cu Arduino: Un ghid pentru începători Arduino este o platformă de prototipuri electronice cu sursă deschisă bazată pe flexibilitate și ușor de utilizat utilizați hardware și software. Este destinat artiștilor, designerilor, pasionaților și tuturor celor interesați să creeze obiecte sau medii interactive. Citește mai multe pentru a vă ajuta să înțelegeți cu calculatorul dvs. frumos.

Configurarea proiectului dvs. de unitate

În Unitate, deschisă Fereastră> Magazin de bunuri pentru a accesa magazinul Unity's Asset Store din cadrul editorului Unity. Căutați în Magazinul de active pentru pluginul Uniduino. Acest plugin vă va permite să primiți și să trimiteți date către și de la pini dvs. Arduino din cadrul Unity. Pluginul în momentul scrierii costă 30 USD. Este posibil să faceți acest proiect fără să cumpărați plugin-ul, deși este mai complicat și puteți găsi plugin-ul mai convenabil pe tot parcursul.

Acest videoclip de la creatorii pluginului vă va duce prin procesul de testare a tuturor lucrurilor, împreună cu configurarea pentru prima dată. Rețineți că este posibil să fie necesar să resetați editorul Unity pe Windows.

Putem folosi același panou de testare pentru a testa controlorul nostru. Setați Pin D2 la INPUT și Digital. Mai jos, setați Pin A5 la ANALOG. Potențiometrul și butonul dvs. ar trebui să afișeze valori pe ecran lângă numerele lor PIN acum. progres!

Acum, pentru a face ceva ce putem controla

Deci avem un controlor, dar ce vom controla? Ei bine, posibilitățile sunt nesfârșite, dar pentru ziua de azi vom crea un joc foarte simplu de dodging pentru a testa noul nostru sistem de control. Vom trece peste setarea jocului destul de repede, deci, dacă sunteți complet nou la motorul Unity, puteți găsi unitatea noastră de joc Programarea Ghidul începătorului Programarea unui joc cu unitate: Un ghid pentru începători Programarea unui joc cu unitate: Un ghid pentru începători În evoluția peisajul de dezvoltare a jocului indie, Unity a apărut ca un standard de facto: costul său redus, ușurința în utilizare și setul larg de caracteristici îl fac ideal pentru o dezvoltare rapidă a jocului. Citiți mai utile pentru a vă aduce rulmenții.

Vom construi un joc foarte simplu în care scopul tău este să eviți sfera la stânga și la dreapta pentru a evita cuburile care se încadrează, ceea ce va folosi noul personalizat controler.

Creați o nouă scenă și trageți prefabricatul Uniduino din Active> Uniduino> Prefabricate în ierarhia dvs. și trageți prefabricatul Uniduino în ierarhie. Avem nevoie de asta pentru a vorbi între jocul și controlorul nostru.

În ierarhia unității faceți clic pe Creați> Sferă și utilizați fila Transformare în Inspector pentru al muta în partea de jos a ecranului de joc.

Este timpul să obțineți codificarea

Acum adăugați un cod la această petrecere. Cu sfera selectată în Ierarhie, faceți clic pe Adăugați componenta> Script nou în partea de jos a ferestrei Inspectorului. Numeste sphereMover și selectați C Sharp din meniul derulant. Clic Creați și adăugați iar scriptul va fi adăugat la GameObject. Faceți dublu clic pe el pentru a deschide scriptul și introduceți acest cod:

utilizând UnityEngine; utilizând System.Collections; folosind Uniduino; public sphere de clasăMover: MonoBehavior // Headers nu sunt strict necesare, dar fac viața mai ușor înapoi în inspector. [Header ("Arduino Variables")] // trebuie să declare Arduino ca arduino arduino public variabil; // trebuie să declare un număr întreg pentru numărul PIN al potențiometrului nostru, // făcând publice aceste variabile, le putem schimba în editor ulterior // dacă schimbăm structura arduino public int potPinNumber; // o variabilă float pentru a menține valoarea potențiometrului (0 - 1023) float public potValue; // vom mai tarziu sa remapam acel potValue in pozitia y a capsulei noastre si sa il mentinem in acest float public variabil mappedPot; // public int pentru butonul nostru PIN public int buttonPinNumber; [Header ("Variabile sferice")] // variabile pentru a ține valorile pe care le-am notat mai devreme pentru laturile ecranului public float leftEdge; public float rightEdge; // Folosiți acest lucru pentru inițierea void Start () // și inițializați vom începe, cu Variabila Arduino. // folosim doar un arduino, astfel încât să putem folosi Arduino.global pentru al apuca. arduino = Arduino.global; arduino.Setup (ConfigurePins);  void ConfigurePins () // configurați pinul Arduino pentru a fi analog pentru potențiometrul nostru arduino.pinMode (potPinNumber, PinMode.ANALOG); // Spuneți lui Arduino să raporteze orice modificare a valorii potențiometrului nostru arduino.reportAnalog (5, 1); // configurați pinul butonului arduino.pinMode (butonulPinNumber, PinMode.INPUT); arduino.reportDigital ((octet) (butonPinNumăr / 8), 1); 

Ia un moment pentru a citi comentariile de cod. Până acum, am afirmat câteva variabile pentru arduinul nostru, capetele lui și sfera noastră. Am folosit de asemenea
Începeți și configurați metodele de tipărire pentru a inițializa Arduino la timpul de execuție. Să ne salvăm scriptul și să ne întoarcem în editorul Unity și să vedem ce sa schimbat.

Acum putem vedea variabilele noastre publice în fereastra Inspector. Să vedem ce putem intra în această etapă pentru a ne ajuta mai târziu. Știm ce pini folosim pe Arduino de la construirea noastră mai devreme, putem să le introducem. De asemenea, știm din experimentul nostru cât de departe dorim ca sfera noastră să poată călători la stânga și la dreapta, astfel încât să nu cadă pe ecran. Permiteți introducerea acestor valori acum.

Primele semne ale vieții

Este timpul să vedem de fapt valori de la Arduino în Editorul Unității. Deocamdată, putem adăuga o linie de cod în funcția de actualizare a scriptului sphereMover și salvați scriptul din nou.

void Update () // Am atribuit valoarea pe care arduino le citește de la potențiometrul nostru la variabila potValue potValue = arduino.analogRead (potPinNumber);  

Acum, când avem variabila noastră de variație potValue actualizată la fiecare cadru, putem vedea valoarea lui în timp real în inspectorul de unitate. Înainte de a face un test, acum ar fi un moment bun pentru a verifica dacă plug-in-ul Uniduino ascultă pe portul potrivit. Faceți clic pe Uniduino din Heirarchy și verificați numele portului în Inspector. Dacă este necompletat, completați numărul corect al portului pentru Arduino. În acest caz a fost COM4, ​​deși poate fi diferit pentru dvs. Verificați dacă utilizați ID-ul Arduino dacă nu sunteți sigur.

Selectați sfera în ierarhie și faceți clic pe butonul Redare din partea de sus a ecranului. Sistemul are nevoie de câteva secunde pentru inițializare, după care ar trebui să începeți să vedeți schimbarea variabilei Pot Value în inspector atunci când mutați potențiometrul.

Acum vorbim! Bineînțeles, Unitatea și Arduino vorbesc, dar cine numără? Dacă ați ajuns atât de departe și nu vedeți modificarea valorii în inspector, verificați pașii de configurare și asigurați-vă că aveți portul corect selectat pentru Arduino.

Să mutați această sferă

Acum, când avem variabila potValue actualizată, vrem să folosim această valoare pentru a muta sfera noastră. Când potențiometrul este tot la stânga, vrem ca sfera să fie în partea stângă a ecranului și invers. Obiectele din Unitate sunt poziționate într-un punct din spațiul Vector, determinat de valorile transformării sale. În imaginea de mai jos, în cazul în care sfera este la cel mai îndepărtat punct spre stânga am dori-o, puteți vedea că este vectorul de poziție este 9.5, -4, 0.

Vrem să afecteze poziția X a sferei. Din nefericire, folosirea valorilor de la potențiometrul nostru direct nu va funcționa, ca atunci când potențiometrul este tot drumul spre stânga, acesta oferă o valoare de 0 - ceea ce ar pune sfera noastră direct în mijlocul ecranului. La cealaltă extremă, valoarea maximă a potențiometrului, 1023, ar plasa calea cubului în dreapta ecranului nostru. Nefolositor. Avem nevoie de aici niște matematică.

De ce facem matematica atunci când unitatea o va face pentru tine?

Pentru cei din voi care se tem de o bucată de hârtie acoperită cu numere grotești (deși există câteva site-uri grozave Cele 20 de site-uri pe care trebuie să le învățați pe Math pas cu pas Cele 20 de site-uri pe care trebuie să le învățați Math Step by Step Am compilat cele mai bune site-uri pentru fiecare nivel, astfel încât să puteți învăța sistematic, să înțelegeți mai bine matematica la un nivel și să vă distrați! Citiți mai multe care vă pot ajuta să învățați matematica), nu vă temeți. Avem nevoie de o modalitate de a face valorile potențiometrului să corespundă poziției X a sferei noastre. Din fericire, putem folosi un Metoda extensiei.

O metodă de extindere este un script care face un loc de muncă specific pentru noi. În acest caz, îi oferim valorile pe care le avem și le returnează cartografiate unul pe altul, gata de a fi utilizate în sphereMover script-ul. În partea de sus a panoului Proiect, faceți clic pe Creați> Script C # și numiți ExtensionMethods. Introduceți codul de mai jos în script:

utilizând UnityEngine; utilizând System.Collections; (de la 1) / (to1 - de la1) * (to2 - de la1) / (to1 - din1) din2) + de la2; 

Salvați scriptul și reveniți la scriptul dvs. sphereMover. Acum putem folosi această funcție Remap în scriptul ExtensionMethods în funcția de actualizare pentru a converti valorile potențiometrului în valori utilizabile în jocul nostru. Sub care am atribuit variabila potValue, tastați următoarele:

Promptul ne arată că Remapul nostru are două seturi de valori From and To și le mută împreună. Putem intra în valorile noastre în acest sens.

mappedPot = potValue.Remap (0, 1023, leftEdge, rightEdge);

Salvați scenariul, reveniți la editorul Unity și apăsați pe butonul de redare. Ar trebui să vedeți acum că variabila cartuș variază atunci când mutați potențiometrul, pentru a corespunde valorilor pe care le-am determinat pentru marginile stânga și dreapta. Ia-ți un moment să te așezi înapoi și să mulțumesc scriptului tău ExtensionMethods. Nu este un calculator în vedere.

Notă: dacă observați că valorile dvs. sunt inversate, atunci când potențiometrul dvs. este tot drumul spre dreapta, obțineți o valoare negativă pentru variabila dvs. Carted Pot, este posibil ca potențiometrul dvs. să fie configurat în mod greșit. Din fericire, puteți rezolva acest lucru fără a efectua nicio reîncadrare. Puteți schimba pur și simplu valorile atunci când le remapați:

Acum avem în sfârșit valori utile. Acum, tot ce trebuie să facem este să atribuim aceste valori poziției X a sferei noastre:

// Alocați valoarea potului mapată la poziția x a sferei transform.position = Vector3 nou (mappedPot, transform.position.y, transform.position.z);

Salvați scenariul, reveniți la editorul Unity și apăsați redarea. Acum ar trebui să vă puteți muta Sfera spre stânga și spre dreapta utilizând potențiometrul!

Punerea butonului la locul de muncă

Acum, când avem sfera noastră în mișcare, nu ar fi plăcut să avem o cale de a încetini puțin lucrurile când ajungem într-un loc strâmt? Vom folosi butonul nostru pentru a încetini timpul în jocul nostru. Deschideți scriptul dvs. sphereMover și adăugați acest cod la funcția Actualizare

// dacă Unity detectează că butonul este apăsat, scala de timp se reduce dacă (arduino.digitalRead (buttonPinNumber) == 1) Time.timeScale = 0.4f;  altceva Time.timeScale = 1.0f;

Acum avem mecanica jocului nostru, să adăugăm niște obstacole! Vom folosi inamicul natural al sferei, cubul. În ierarhie, faceți clic pe Creați> Obiect 3d> Cub. În inspectorul cubului, Adăugați Component> Fizică> Corp dur. Setați valoarea de tragere a corpului rigid la 5. De asemenea, sub componenta Collider de box din inspector, selectați Trigger. Acest lucru ne va permite să detectăm coliziunile cu sfera noastră.

Creați un script pe cub și sunați-l collideWithSphere, deschideți scriptul și ștergeți funcțiile Start și Actualizare, deoarece nu o vom avea nevoie de această dată. Introduceți acest cod:

utilizând UnityEngine; utilizând System.Collections; clasa publica collideWithSphere: MonoBehavior void OnTriggerEnter (altul Collider) Destroy (other.gameObject); 

OnTriggerEnter trimite un mesaj ori de câte ori colliderul declanșatorului lovește un alt coliziune. În acest caz, îi spunem să distrugă ceea ce atinge. Salvați scenariul și reveniți la editorul Unity. Glisați cubul din ierarhie în panoul Proiect. Veți observa că textul cubului din ierarhie a devenit albastru. Acest lucru se datorează faptului că am creat un prefabricat și l-am salvat în proiectul nostru. Ștergeți acum cubul din ierarhie.

Tot ce avem nevoie acum este un scenariu pentru a da naștere cuburilor. În ierarhia faceți clic pe Creați> Creați gol, și redenumiți-o la Game Manager în Inspector și adăugați un script la el numit gameManager. Deschideți scriptul și adăugați acest cod:

utilizând UnityEngine; utilizând System.Collections; public class gameManager: MonoBehavior // o variabilă pentru a ține prefabricatul pe care dorim să-l facem cubul GameObject public; // vrem niște variabile care să decidă cum să coboare cuburile // și cât de sus ni se dorește ca ei să sporească numărul public intToSpwan; public float lowestSpawnheight; public float cea mai mareSpawnheight; // Utilizați acest lucru pentru inițializare void Start () pentru (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 ()   

Salvați scenariul. Înapoi în editor, selectați Managerul de jocuri în ierarhie și trageți prefabricatul dumneavoastră cub din panoul de proiect la variabila Cube din Inspector. Completați și valorile pentru reproducerea dvs. aici. Puteți să vă jucați cu ea pentru a vă face cât mai greu sau mai ușor cum doriți. Rețineți că merită să aveți cele mai scăzute cuburi pe care le obțineți suficient de mare pentru a permite inițierea jocului Uniduino - pierderea jocului înainte de a vă putea muta poate fi frustrant!

Proiectul finalizat

Acum când apăsați butonul de redare, cuburile se vor arunca peste tine și vor cădea. Puteți utiliza potențiometrul pentru a le evita și butonul dvs. pentru a încetini timpul.

În acest proiect am creat un controler personalizat cu un Arduino, configurat Unity și Uniduino pentru a comunica cu el și a creat un joc simplu pentru a fi testat. Conceptele de aici pot fi aplicate la aproape orice proiect, și există chiar blocaje de joc care se specializează în controlere personalizate.

Cu Arduino și Unitate ați putea crea un controler personalizat din aproape orice. Ai creat un hi-fi care controlează o navă spațială? Un toaster care controlează un joc pe platformă?

Dacă ați făcut un astfel de proiect, mi-ar plăcea să văd! Postați-l în comentariile de mai jos!

Explorați mai multe despre: Arduino, Controler de joc, Dezvoltare de jocuri, Programare.