Kako napraviti prilagođeni kontroler igre s Arduinom i Unityjem

Kako napraviti prilagođeni kontroler igre s Arduinom i Unityjem

Jeste li ikada poželjeli dizajnirati vlastiti kontroler igre? Lakše je nego što mislite!





U ovom kratkom projektu izgradit ćemo jednostavan prilagođeni kontroler igre za korištenje s Unity engineom za igre. Ovaj će kontroler pokretati Arduino Uno, iako biste za ovaj projekt mogli koristiti i jednu od mnogih alternativa. Također ćemo stvoriti osnovnu igru ​​u kojoj ćete pomoću svog kontrolera izbjeći padanje predmeta i usporiti vrijeme.





Za ovaj projekt trebat će vam

  • Arduino ili sličan mikrokontroler
  • 1 x 10k Ohm otpornik
  • 1 x Trenutni prekidač
  • 1 x potenciometar
  • Spojne žice
  • Matična ploča
  • Unity engine za igre
  • Uniduino dodatak iz Unity Asset Store (30 USD)
  • Cjeloviti kôd projekta, u slučaju da ga ne želite zapisati (ne uključuje dodatak Uniduino)

Većina ovih stvari dostupna je u početnom setu Arduina. Ako nemate početni komplet, pogledajte naš vodič za odabir najboljeg za vas.





Kontroler možete zakomplicirati koliko želite, iako ćemo za ovaj primjer postaviti potenciometar i gumb - savršeno za upravljanje jednostavnom arkadnom igrom.

Sklapanje vašeg kontrolera

Postavite svoju matičnu ploču i Arduino kako je prikazano na donjoj slici. Ovo ćemo koristiti kao naš kontroler igre, iako biste mogli koristiti gotovo iste postavke kao i Uradi sam midi kontroler isto!



Priprema vašeg Arduina

Nakon što sve ožičite, povežite svoj Arduino putem USB -a. U Arduino Software IDE krenite na Alati> Ploča i Alati> Priključak za odabir mikrokontrolera i priključka koji koristite. Arduino IDE dolazi u paketu sa skicom koja nam je potrebna, a možete je pronaći ispod Datoteka> Primjeri> Firmata> Standardne firme . Pritisnite Upload i bit ćete spremni za rad.

Ako ste tek počeli koristiti Arduino i glava vam se lagano topi, pogledajte našu Vodič za početnike kako bi vam pomogao da lijepo razgovarate s računalom.





Postavljanje vašeg projekta Unity

U jedinstvu, otvorite Prozor> Trgovina imovinom za pristup Unity's Asset Storeu iz Unity uređivača. Pretražite Uniduino dodatak u Asset Storeu. Ovaj će vam dodatak omogućiti primanje i slanje podataka na i sa vaših Arduino pinova unutar Unityja. Dodatak u vrijeme pisanja košta 30 USD. Moguće je napraviti ovaj projekt bez kupnje dodatka, iako je prilično složeniji i možda će vam dodatak biti prikladniji.

Ovaj videozapis kreatora dodatka provest će vas kroz proces testiranja da li sve radi, zajedno s prvim postavljanjem. Imajte na umu da ćete možda morati i resetirati uređivač Unity u sustavu Windows.





Istu testnu ploču možemo koristiti za testiranje našeg kontrolera. Postavite pin D2 na INPUT i Digital. Niže, postavite pin A5 na ANALOG. Vaš potenciometar i gumb sada bi trebali prikazati vrijednosti na ekranu pored njihovih brojeva pinova. Napredak!

Sada da napravimo nešto što možemo kontrolirati

Dakle, imamo kontroler, ali što ćemo kontrolirati? Pa, mogućnosti su beskrajne, ali za danas ćemo stvoriti vrlo jednostavnu igru ​​izbjegavanja kako bismo isprobali naš novi sustav upravljanja. Preći ćemo na postavljanje igre prilično brzo, pa ako ste potpuno novi u Unity motoru, možda ćete pronaći naš Unity Vodič za početnike u programiranju igara korisno da se snađete.

Izgradit ćemo vrlo osnovnu igru ​​u kojoj je vaš cilj izbjeći svoju sferu lijevo i desno kako biste izbjegli padanje kockica, što će koristiti vaš novoizrađeni prilagođeni kontroler.

Napravite novu scenu i odvucite montažnu jedinicu Uniduino iz Imovina> Uniduino> Montažni objekti u svoju hijerahiju i povucite montažnu jedinicu Uniduino u hijerarhiju. To nam je potrebno za razgovor između naše igre i kontrolera.

U hijerarhiji Unity kliknite Stvori> Sfera i pomoću kartice Transform u Inspectoru pomaknite je na dno zaslona igre.

Vrijeme je za kodiranje

Sada da dodam neki kod ovoj zabavi. Kad je sfera odabrana u Hijerarhiji, kliknite Dodajte komponentu> Nova skripta pri dnu prozora inspektora. Imenuj sphereMover i odaberite C Oštro s padajućeg izbornika. Klik Kreiraj i dodaj a skripta će biti dodana u GameObject. Dvaput kliknite na nju da biste otvorili skriptu i unijeli ovaj kôd:

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);
}
}

Odvojite trenutak da pročitate komentare koda. Do sada smo proglasili neke varijable za naš Arduino, njegove pinove i našu Sferu. Također smo koristili

Metode Start i ConfigurePins za inicijalizaciju našeg Arduina za vrijeme izvođenja. Spremimo našu skriptu, pa se vratimo u uređivač Unity i vidimo što se promijenilo.

Sada možemo vidjeti naše javne varijable u prozoru Inspector. Pogledajmo što možemo unijeti u ovoj fazi kako bismo nam kasnije pomogli. Znamo koje pin -ove koristimo na Arduinu iz naše prethodne verzije, možemo ih unijeti. Iz našeg ranijeg eksperimenta također znamo koliko želimo da naša sfera može putovati lijevo -desno kako ne bi pala s ekrana. Sada unesite ove vrijednosti.

Prvi znakovi života

Vrijeme je da zapravo vidite vrijednosti iz našeg Arduina u uređivaču Unity. Za sada možemo dodati jedan redak koda u funkciju Update naše skripte sphereMover i ponovno spremiti skriptu.

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

Sada kada imamo varijablu potValue koja se ažurira svaki okvir, možemo vidjeti njezinu vrijednost u stvarnom vremenu u Unity Inspectoru. Prije nego što ga testiramo, bilo bi dobro vrijeme da provjerimo da li Uniduino priključak sluša na desnom priključku. Pritisnite Uniduino u Heirarchyju i provjerite njegov naziv porta u Inspectoru. Ako je prazno, unesite ispravan broj porta za svoj Arduino. U ovom slučaju to je bio COM4, ​​iako je za vas možda drugačije. Ako niste sigurni, provjerite pomoću Arduino IDE -a.

Odaberite svoju sferu u hijerarhiji i kliknite gumb Reproduciraj pri vrhu zaslona. Sustavu je potrebno nekoliko sekundi za inicijalizaciju, nakon čega biste trebali vidjeti promjenu varijable Pot Value u inspektoru pri pomicanju potenciometra.

Sada pričamo! Pa, striktno govoreći, govore Unity i Arduino, ali tko broji? Ako ste stigli dovde i ne vidite promjenu vrijednosti u inspektoru, provjerite korake postavljanja i provjerite jeste li odabrali ispravan port za svoj Arduino.

Premjestimo ovu sferu

Sada kada imamo ažuriranu varijablu potValue, želimo koristiti ovu vrijednost za pomicanje naše sfere. Kad je potenciometar skroz ulijevo, želimo da sfera bude s lijeve strane ekrana i obrnuto. Objekti u Unityju pozicionirani su u točki vektorskog prostora, određenoj njezinim vrijednostima Transform.position . Na donjoj slici, gdje je sfera u najudaljenijoj točki s lijeve strane koju bismo htjeli, možete vidjeti da je njen vektor položaja 9,5, -4, 0.

Želimo utjecati na položaj X sfere. Nažalost, korištenje vrijednosti iz našeg potenciometra izravno neće funkcionirati, jer kada je potenciometar skroz ulijevo daje vrijednost 0 - što bi našu sferu stavilo točno na sredinu ekrana. S druge strane, najveća vrijednost potenciometra, 1023, smjestila bi kocku desno od našeg zaslona. Nije korisno. Ono što nam ovdje treba je matematika.

Zašto raditi matematiku kada će Unity to učiniti umjesto vas?

Za one od vas koji se plaše zureći u komad papira prekriven besmislenim brojevima (iako ih ima sjajne web stranice koje vam mogu pomoći u učenju matematike), ne bojte se. Potreban nam je način da naše vrijednosti potenciometra usklade s položajem X naše sfere. Srećom, možemo koristiti an Metoda produženja .

Metoda proširenja skripta je koja za nas obavlja poseban posao. U ovom slučaju dajemo mu vrijednosti koje imamo, a on ih vraća preslikane jedna u drugu, spremne za upotrebu u našim sphereMover skripta. Pri vrhu ploče Projekt kliknite Izradi> C# skriptu i nazvati ga ExtensionMethods. Unesite donji kôd u skriptu:

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;
}
}

Spremite skriptu i vratite se na svoju scriptMover skriptu. Sada možemo koristiti ovu funkciju preslikavanja u našoj skripti ExtensionMethods u našoj funkciji ažuriranja za pretvaranje naših vrijednosti potenciometra u korisne vrijednosti u našoj igri. Ispod mjesta gdje smo upravo dodijelili varijablu potValue, upišite sljedeće:

Odziv nam pokazuje da naš Remap uzima dva skupa vrijednosti Od i Do, te ih zajedno preslikava. U to možemo unijeti svoje vrijednosti.

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

Spremite skriptu, vratite se u uređivač Unity i pritisnite gumb za reprodukciju. Sada biste trebali vidjeti da se varijabla Mapped Pot mijenja kad pomaknete potenciometar kako bi odgovarala vrijednostima koje smo odredili za naš lijevi i desni rub. Odvojite trenutak i sjednite i zahvalite se na skripti ExtensionMethods. Kalkulator na vidiku.

Napomena: ako primijetite da su vam vrijednosti obrnute, pa kada je vaš potenciometar skroz udesno, dobivate negativnu vrijednost za varijablu Mapped Pot, možda ste potenciometar postavili pogrešno. Srećom, to možete popraviti bez ponovnog ožičenja. Možete jednostavno promijeniti vrijednosti kada ih preslikavate:

Sada konačno imamo upotrebljive vrijednosti. Sada preostaje samo dodijeliti te vrijednosti položaju X naše sfere:

najbolje aplikacije za virtualnu stvarnost za android
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Spremite skriptu, vratite se u uređivač Unity i pritisnite play. Sada biste svojim potenciometrom mogli pomaknuti svoju Sferu ulijevo i udesno!

Stavljanje gumba na posao

Sad kad imamo sferu u pokretu, ne bi li bilo lijepo imati način da malo usporimo stvari kad se nađemo u uskom položaju? Našim gumbom usporit ćemo vrijeme u igri. Otvorite svoju scriptMover skriptu i dodajte ovaj kôd u funkciju ažuriranja

//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;

Sada imamo mehaniku naše igre, dodajmo neke prepreke! Koristit ćemo prirodnog neprijatelja kugle, kocku. U hijerarhiji kliknite Stvori> 3D objekt> Kocka . U inspektoru kocke, Dodajte komponentu> Fizika> Kruto tijelo . Postavite vrijednost povlačenja krutog tijela na 5. Također, pod komponentom Box Collider u inspektoru odaberite Is Trigger. To će nam omogućiti otkrivanje sudara s našom Sferom.

Napravite skriptu na kocki i nazovite je collideWithSphere , otvorite skriptu i izbrišite funkcije Start i Update jer nam ovaj put neće trebati. Unesite ovaj kod:

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

OnTriggerEnter šalje poruku kad god okidač sudarača udari u drugi sudarač. U ovom slučaju govorimo mu da uništi sve što dotakne. Spremite skriptu i vratite se u uređivač Unity. Povucite kocku iz hijerarhije na ploču Projekt. Primijetit ćete da je tekst kocke u hijerarhiji postao plav. To je zato što smo izradili montažni objekt i spremili ga u svoj projekt. Odmah izbrišite svoju kocku iz hijerarhije.

Sve što nam sada treba je skripta za mrijest kocki. U hijerarhiji kliknite Stvori> Stvori prazno , i preimenujte ga u Game Manager u Inspectoru i dodajte mu skriptu koja se zove gameManager. Otvorite skriptu i dodajte ovaj kod:

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 ()
{

}
}

Spremite skriptu. Natrag u uređivaču, odaberite Upravitelj igara u hijerarhiji i povucite prefab kocke s ploče projekta na varijablu Kocka u Inspektoru. Ovdje također ispunite vrijednosti vašeg mrijesta. Možete se petljati s njim kako bi bilo teško ili jednostavno koliko želite. Imajte na umu da je vrijedno da se vaše najniže kocke izrode dovoljno visoko kako bi Uniduino mogao inicijalizirati - gubitak igre prije nego što se krenete može biti frustrirajuće!

Završeni projekt

Sada, kada pritisnete play, kocke će se mrijestiti iznad vas i padati. Pomoću potenciometra možete ih izbjeći, a gumbom usporiti vrijeme.

U ovom projektu stvorili smo prilagođeni kontroler s Arduinom, konfigurirali Unity i Uniduino za komunikaciju s njim i stvorili jednostavnu igru ​​za testiranje. Ovdje se koncepti mogu primijeniti na gotovo svaki projekt, pa čak postoje džemovi za igre koji su specijalizirani za prilagođene kontrolere .

Uz Arduino i Unity mogli ste stvoriti prilagođeni kontroler od gotovo svega. Jeste li stvorili hi-fi koji upravlja svemirskom letjelicom? Toster koji kontrolira igru ​​na platformi?

Ako ste napravili ovakav projekt, volio bih ga vidjeti! Objavite to u komentarima ispod!

Udio Udio Cvrkut E -pošta 6 zvučnih alternativa: najbolje besplatne ili jeftine aplikacije za audio knjige

Ako ne volite plaćati audioknjige, evo nekoliko sjajnih aplikacija koje vam omogućuju besplatno i legalno slušanje.

Pročitajte Dalje
Povezane teme
  • Uradi sam
  • Programiranje
  • Arduino
  • Kontroler igre
  • Razvoj igara
O autoru Ian Buckley(216 objavljenih članaka)

Ian Buckley je slobodni novinar, glazbenik, izvođač i video producent koji živi u Berlinu, Njemačka. Kad ne piše ili je na pozornici, petlja s DIY elektronikom ili kodom u nadi da će postati ludi znanstvenik.

Više od Iana Buckleyja

Pretplatite se na naše obavijesti

Pridružite se našem biltenu za tehničke savjete, recenzije, besplatne e -knjige i ekskluzivne ponude!

Kliknite ovdje za pretplatu