Cum să faci un controler de joc personalizat cu Arduino și Unity

Cum să faci un controler de joc personalizat cu Arduino și Unity

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





În acest scurt proiect, vom construi un controler de joc personalizat simplu de utilizat cu motorul de joc Unity. Acest controler va fi alimentat de un Arduino Uno, deși puteți utiliza una dintre multele alternative disponibile pentru acest proiect. De asemenea, vom crea un joc de bază în care vă veți folosi controlerul pentru a evita căderea obiectelor și a încetini timpul.





Pentru acest proiect veți avea nevoie

  • Arduino sau un microcontroler similar
  • 1 rezistor 10 x Ohm
  • 1 x comutator momentan
  • 1 x Potențiometru
  • Cabluri de conectare
  • O placă de măsurare
  • Motor de joc Unity
  • Pluginul Uniduino din Unity Asset Store (30 USD)
  • Completați codul proiectului, în cazul în care nu doriți să îl scrieți (nu include pluginul Uniduino)

Majoritatea acestor lucruri sunt disponibile într-un kit de pornire Arduino. Dacă nu aveți un kit de pornire, consultați ghidul nostru pentru alegerea celui mai bun pentru dvs.





Puteți face controlerul la fel de complicat pe care îl 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 panoul de testare și Arduino așa cum se arată în imaginea de mai jos. Aceasta este ceea ce vom folosi ca controler de joc, deși puteți utiliza aproape aceeași configurare ca un Controler midi DIY de asemenea!



Pregătirea Arduino

După ce aveți totul conectat, conectați-vă Arduino prin USB. În Arduino Software IDE mergeți la Instrumente> Tablă și Instrumente> Port pentru a selecta ce microcontroler și port utilizați. ID-ul Arduino vine la pachet cu schița de care avem nevoie, și o puteți găsi mai jos Fișier> Exemple> Firmata> StandardFirmata . Faceți clic pe Încărcare și veți fi gata de plecare.

Dacă sunteți nou în Arduino și vă crește ușor capul, consultați Ghid pentru începători pentru a vă ajuta să discutați frumos cu computerul.





Configurarea proiectului Unity

În Unity, deschideți Fereastră> Magazin de active pentru a accesa Magazinul de active Unity din Unity Editor. Căutați în magazinul de active pluginul Uniduino. Acest plugin vă va permite să primiți și să trimiteți date către și de la pinii Arduino din Unity. Pluginul la momentul scrierii costă 30 USD. Este posibil să faceți acest proiect fără a cumpăra pluginul, deși este destul de complicat și este posibil să găsiți pluginul mai convenabil pe tot parcursul.

Acest videoclip de la creatorii pluginului vă duce prin procesul de testare a funcționării, împreună cu configurarea pentru prima dată. Rețineți că poate fi necesar să resetați editorul Unity pe Windows.





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

Acum să facem ceva ce putem controla

Deci avem un controler, dar ce trebuie să controlăm? Ei bine, posibilitățile sunt nelimitate, dar pentru astăzi vom crea un joc foarte simplu de evitare pentru a testa noul nostru sistem de control. Vom trece peste configurarea jocului destul de repede, așa că, dacă sunteți complet nou în motorul Unity, îl veți găsi Unity Game Programming Guide pentru începători util pentru a vă obține rulmenții.

Vom construi un joc foarte de bază în care scopul tău este să te eschivezi de sfera ta la stânga și la dreapta pentru a evita căderea cuburilor, care va utiliza controlerul personalizat nou creat.

Creați o scenă nouă și trageți de prefabricatul Uniduino Active> Uniduino> Prefab în ierarhia dvs. și trageți prefabricatul Uniduino în ierarhie. Avem nevoie de el acolo pentru a vorbi între jocul nostru și controler.

În ierarhia Unity faceți clic pe Creați> Sferă și utilizați fila Transformare din Inspector pentru a o muta în partea de jos a ecranului jocului.

Este timpul să obțineți codificare

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

using UnityEngine;
using System.Collections;
using Uniduino;
public class sphereMover : MonoBehaviour
{
//Headers aren't scrictly neccesary, but they make life easier back in the Inspector.
[Header('Arduino Variables')]
//we need to declare the Arduino as a variable
public Arduino arduino;
//we need to declare an integer for the pin number of our potentiometer,
//making these variables public means we can change them in the editor later
//if we change the layout of our arduino
public int potPinNumber;
//a float variable to hold the potentiometer value (0 - 1023)
public float potValue;
//we will later remap that potValue to the y position of our capsule and hold it in this variable
public float mappedPot;
//public int for our button pin
public int buttonPinNumber;
[Header('Sphere Variables')]
//variables to hold the values we noted earlier for the sides of our screen
public float leftEdge;
public float rightEdge;
// Use this for initialization
void Start ()
{//and initialize we shall, starting with the Arduino Variable.
//we are only using one arduino, so we can use Arduino.global to grab it.
arduino = Arduino.global;
arduino.Setup(ConfigurePins);
}
void ConfigurePins()
{
//configure the Arduino pin to be analog for our potentiometer
arduino.pinMode(potPinNumber, PinMode.ANALOG);
//Tell the Arduino to report any changes in the value of our potentiometer
arduino.reportAnalog(5, 1);
//configure our Button pin
arduino.pinMode(buttonPinNumber, PinMode.INPUT);
arduino.reportDigital((byte)(buttonPinNumber / 8), 1);
}
}

Faceți un moment pentru a citi comentariile despre cod. Până acum, am declarat câteva variabile pentru Arduino, pinii și Sfera noastră. De asemenea, am folosit

Porniți și configurați metodele pentru a inițializa Arduino în timpul rulării. Să ne salvăm scriptul și să revenim în editorul Unity și să vedem ce s-a schimbat.

Acum putem vedea variabilele noastre publice în fereastra Inspector. Să vedem în ce putem intra în această etapă pentru a ne ajuta mai târziu. Știm ce pin folosim pe Arduino din versiunea noastră mai devreme, le putem introduce. Știm din experimentul nostru mai devreme cât de mult vrem ca sfera noastră să poată călători în stânga și în dreapta, astfel încât să nu cadă de pe ecran. Să introducem aceste valori acum.

Primele semne de viață

Este timpul să vedem efectiv valorile din Arduino în Unity Editor. Deocamdată, putem adăuga o linie de cod la funcția de actualizare a scriptului nostruphereMover și putem salva din nou scriptul.

void Update ()
{
//We assign the value the arduino is reading from our potentionmeter to our potValue variable
potValue = arduino.analogRead(potPinNumber);
}

Acum că avem variabila potValue actualizată la fiecare cadru, putem vedea valoarea ei în timp real în Unity Inspector. Înainte de a-i 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 în Heirarchy și verificați numele portului în Inspector. Dacă este necompletat, completați numărul de port corect pentru Arduino. În acest caz, a fost COM4, ​​deși poate fi diferit pentru dvs. Verificați folosind IDE-ul Arduino dacă nu sunteți sigur.

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

Acum vorbim! Ei bine, vorbind strict Unity și Arduino vorbesc, dar cine contează? Dacă ați ajuns până aici și nu vedeți schimbarea valorii în inspector, verificați pașii de configurare și asigurați-vă că ați selectat portul corect pentru Arduino.

Să Mutăm Această Sferă

Acum că avem actualizată variabila potValue, dorim să folosim această valoare pentru a ne muta sfera. Când potențiometrul este complet la stânga, vrem ca sfera să fie în partea stângă a ecranului și invers. Obiectele din Unity sunt poziționate într-un punct din spațiul Vector, determinat de valorile acestuia Transformare.poziție . În imaginea de mai jos, unde sfera este în cel mai îndepărtat punct din stânga, am dori-o, puteți vedea că vectorul său de poziție este 9,5, -4, 0.

Vrem să afectăm poziția X a sferei. Din păcate, folosirea directă a valorilor din potențiometrul nostru nu va funcționa, deoarece atunci când potențiometrul este complet în stânga, acesta dă o valoare de 0 - ceea ce ar pune sfera noastră chiar în mijlocul ecranului. La cealaltă extremă, valoarea maximă a potențiometrului, 1023, ar plasa cubul spre dreapta ecranului nostru. Nefolositor. Avem nevoie aici de niște matematică.

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

Pentru cei dintre voi care se tem să se uite la o bucată de hârtie acoperită cu numere fără sens (deși există unele site-uri web grozave care vă poate ajuta să învățați matematica), nu vă temeți. Avem nevoie de un mod de a face ca valorile potențiometrului nostru să corespundă cu poziția X a sferei noastre. Din fericire, putem folosi un Metoda de extindere .

O metodă de extensie este un script care face o treabă specifică pentru noi. În acest caz, îi oferim valorile pe care le avem și le întoarce mapate una la alta, gata să fie utilizate în sferaMutare scenariu. În partea de sus a panoului Proiect, faceți clic pe Creați> Script C # și denumiți-o ExtensionMethods. Introduceți codul de mai jos în script:

using UnityEngine;
using System.Collections;
public static class ExtensionMethods {

//our handy dandy Remapper function
public static float Remap (this float value, float from1, float to1, float from2, float to2)
{
return (value - from1) / (to1 - from1) * (to2 - from2) + from2;
}
}

Salvați scenariul și reveniți la scriptul dvs.phereMover. Acum putem folosi această funcție Remap în scriptul nostru ExtensionMethods din funcția Actualizare pentru a converti valorile potențiometrului în valori utilizabile în jocul nostru. În locul în care tocmai am atribuit variabila potValue, tastați următoarele:

Solicitarea ne arată că Remap-ul nostru ia două seturi de valori De la și către și le mapează împreună. Putem introduce valorile noastre în acest sens.

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

Salvați scriptul, reveniți la editorul Unity și apăsați butonul de redare. Acum ar trebui să vedeți că variabila Mapped Pot se schimbă 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ă stai pe spate și să-ți mulțumești scriptul ExtensionMethods. Nu este un calculator la vedere.

Notă: dacă observați că valorile dvs. sunt inversate, deci atunci când potențiometrul dvs. este complet la dreapta, obțineți o valoare negativă pentru variabila Mapped Pot, este posibil să vă configurați potențiometrul în sens invers. Din fericire, puteți remedia acest lucru fără a face nicio re-cablare. Puteți pur și simplu schimba valorile atunci când le remapați:

Acum avem în sfârșit valori utilizabile. Acum nu mai rămâne decât să atribuim acele valori poziției X a sferei noastre:

mutați aplicația în rădăcina cardului SD
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

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

Punerea butonului la lucru

Acum că avem sfera în mișcare, nu ar fi frumos să avem o modalitate de a încetini puțin lucrurile când ajungem într-un loc strâns? Vom folosi butonul nostru pentru a încetini timpul din jocul nostru. Deschideți scriptul dvs.phereMover și adăugați acest cod la funcția de actualizare

//if Unity detects the button is being pressed, the time scale slows down
if (arduino.digitalRead(buttonPinNumber) == 1){
Time.timeScale = 0.4f;
}
else Time.timeScale = 1.0f;

Acum avem mecanica jocului nostru, să adăugăm câteva obstacole! Vom folosi dușmanul natural al sferei, cubul. În ierarhie, faceți clic pe Creați> Obiect 3d> Cub . În inspectorul cubului, Adăugați Component> Fizică> Rigidbody . Setați valoarea Drag a corpului rigid la 5. De asemenea, sub componenta Box Collider din inspector, selectați Is Trigger. Acest lucru ne va permite să detectăm coliziunile cu sfera noastră.

Creați un script pe cub și apelați-l collideWithSphere , deschideți scriptul și ștergeți funcțiile Start și Update deoarece nu vom avea nevoie de ele de data aceasta. Introduceți acest cod:

using UnityEngine;
using System.Collections;
public class collideWithSphere : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
Destroy(other.gameObject);
}
}

OnTriggerEnter trimite un mesaj ori de câte ori colizorul declanșator lovește un alt colizor. În acest caz, îi spunem să distrugă orice atinge. Salvați scriptul și reveniți la editorul Unity. Trageț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 o prefabricată și am salvat-o în proiectul nostru. Ștergeți acum cubul din ierarhie.

Tot ce ne trebuie acum este un script pentru a genera cuburile. În ierarhie faceți clic Creați> Creați gol , și redenumiți-l în Game Manager în Inspector și adăugați un script numit gameManager. Deschideți scriptul și adăugați acest cod:

using UnityEngine;
using System.Collections;
public class gameManager : MonoBehaviour {
//a variable to hold the prefab we want to spawn
public GameObject cube;
//we want some variables to decide how any cubes to spawn
//and how high above us we want them to spawn
public int numberToSpwan;
public float lowestSpawnheight;
public float highestSpawnheight;
// Use this for initialization
void Start ()
{
for (int i = 0; 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 scriptul. Înapoi în editor, selectați Managerul de jocuri din ierarhie și trageți prefabricatul cubului din panoul proiectului către variabila Cub din Inspector. Completați valorile pentru reproducerea dvs. și aici. Puteți să vă lăsați cu el pentru a-l face la fel de greu sau de ușor cum doriți. Rețineți că merită ca cuburile dvs. cele mai mici să apară suficient de sus pentru a permite Uniduino să inițializeze - pierderea jocului înainte de a vă putea muta poate fi frustrant!

Proiectul finalizat

Acum, când apăsați redare, cuburile vor răsări deasupra dvs. și vor cădea. Puteți utiliza potențiometrul pentru a le evita și butonul pentru a încetini timpul.

În acest proiect am creat un controler personalizat cu un Arduino, am configurat Unity și Uniduino pentru a comunica cu acesta și am creat un joc simplu pentru a-l testa. Conceptele de aici pot fi aplicate la aproape orice proiect și există chiar blocaje de jocuri specializate în controlere personalizate .

Cu Arduino și Unity puteți crea un controler personalizat din aproape orice. Ați creat un sistem hi-fi care controlează o navă spațială? Un prăjitor de pâine care controlează un joc de platformă?

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

Acțiune Acțiune Tweet E-mail 6 alternative sonore: cele mai bune aplicații gratuite sau ieftine pentru cărți audio

Dacă nu vă place să plătiți pentru cărți audio, iată câteva aplicații grozave care vă permit să le ascultați gratuit și legal.

Citiți în continuare
Subiecte asemănătoare
  • DIY
  • Programare
  • Arduino
  • Controlor de joc
  • Dezvoltarea jocului
Despre autor Ian Buckley(216 articole publicate)

Ian Buckley este un jurnalist independent, muzician, interpret și producător video care locuiește în Berlin, Germania. Când nu scrie sau pe scenă, se ocupă de electronice sau coduri DIY în speranța de a deveni un om de știință nebun.

Mai multe de la Ian Buckley

Aboneaza-te la newsletter-ul nostru

Alăturați-vă newsletter-ului pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!

Faceți clic aici pentru a vă abona
Categorie Diy