Kako narediti krmilnik iger po meri z Arduinom in Unityjem

Kako narediti krmilnik iger po meri z Arduinom in Unityjem

Ste si kdaj želeli oblikovati lasten igralni krmilnik? Je lažje, kot si mislite!





V tem kratkem projektu bomo zgradili preprost krmilnik iger po meri za uporabo z igralnim mehanizmom Unity. Ta krmilnik bo poganjal Arduino Uno, čeprav bi lahko za ta projekt uporabili eno od številnih alternativ. Ustvarili bomo tudi osnovno igro, v kateri boste s krmilnikom preprečili padanje predmetov in upočasnili čas.





Za ta projekt boste potrebovali

  • Arduino ali podoben mikrokrmilnik
  • 1 x 10k ohmski upor
  • 1 x Momentalno stikalo
  • 1x potenciometer
  • Priključne žice
  • Tla
  • Igralni motor Unity
  • Vtičnik Uniduino iz trgovine Unity Asset Store (30 USD)
  • Celotna koda projekta, če je ne želite zapisati (ne vključuje vtičnika Uniduino)

Večina teh stvari je na voljo v začetnem kompletu Arduino. Če nimate začetnega kompleta, si oglejte naš vodnik za izbiro najboljšega za vas.





Kontroler lahko naredite tako zapletenega, kot želite, čeprav bomo v tem primeru nastavili potenciometer in gumb - kot nalašč za nadzor preproste arkadne igre.

Sestavljanje vašega krmilnika

Nastavite svojo ploščo in Arduino, kot je prikazano na spodnji sliki. To bomo uporabljali kot naš igralni krmilnik, čeprav bi lahko uporabili skoraj enako nastavitev kot a Midi krmilnik DIY tudi!



Priprava vašega Arduina

Ko vse povežete, povežite svoj Arduino prek USB -ja. V IDE programske opreme Arduino pojdite na Orodja> Plošča in Orodja> Vrata izberite mikrokrmilnik in vrata, ki jih uporabljate. Arduino IDE je priložen skici, ki jo potrebujemo, in jo najdete pod Datoteka> Primeri> Firmata> StandardFirmata . Kliknite Naloži in pripravljeni boste.

Če ste novi v Arduinu in vam se glava rahlo topi, si oglejte našo Vodnik za začetnike da vam pomaga, da se lepo pogovarja z računalnikom.





Nastavitev projekta Unity

V Unity odprite Okno> Shranjevanje sredstev za dostop do Unityjeve Asset Store iz urejevalnika Unity. Poiščite vtičnik Uniduino v trgovini Asset Store. Ta vtičnik vam bo omogočal prejemanje in pošiljanje podatkov na in iz vaših zatičev Arduino znotraj Unityja. Vtičnik v času pisanja stane 30 USD. Je mogoče narediti ta projekt brez nakupa vtičnika, čeprav je precej bolj zapleten in vtičnik se vam bo morda zdel bolj priročen.

Ta videoposnetek ustvarjalcev vtičnika vas popelje skozi postopek preizkušanja, ali vse deluje, skupaj s prvo nastavitvijo. Upoštevajte, da boste morda morali ponastaviti urejevalnik Unity v sistemu Windows.





To isto preskusno ploščo lahko uporabimo za preizkus našega krmilnika. Pin D2 nastavite na INPUT in Digital. Spodaj nastavite Pin A5 na ANALOG. Vaš potenciometer in gumb morata zdaj prikazati vrednosti na zaslonu poleg številk pin. Napredek!

Zdaj pa naredimo nekaj, kar lahko nadziramo

Torej imamo krmilnik, kaj pa bomo nadzorovali? No, možnosti so neskončne, a za danes bomo ustvarili zelo preprosto igro izogibanja, da preizkusimo naš novi nadzorni sistem. Hitro se bomo pomikali po nastavitvi igre, zato boste morda našli našo, če ste popolnoma novi v sistemu Unity Priročnik za programiranje iger Unity koristno, da se usmerite.

Zgradili bomo zelo preprosto igro, v kateri se želite izogniti krogli levo in desno, da se izognete padanju kock, kar bo uporabilo vaš na novo narejen krmilnik po meri.

Ustvarite nov prizor in povlecite montažno enoto Uniduino iz Sredstva> Uniduino> Montažne enote v svojo hierarhijo in povlecite montažno enoto Uniduino v hierarhijo. Potrebujemo ga za pogovor med našo igro in krmilnikom.

V hierarhiji Unity kliknite Ustvari> Sfera in z zavihkom Transform v inšpektorju premaknite na dno zaslona igre.

Čas je za kodiranje

Zdaj dodajte tej kodi nekaj kode. Ko je krogla izbrana v hierarhiji, kliknite Dodajte komponento> Nov skript na dnu okna Inšpektor. Poimenujte ga sphereMover in izberite C Ostro iz spustnega menija. Kliknite Ustvari in dodaj in skript bo dodan v GameObject. Dvokliknite nanj, da odprete skript in vnesete to kodo:

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

Vzemite si trenutek in preberite komentarje kode. Doslej smo razglasili nekaj spremenljivk za naš Arduino, njegove zatiče in našo sfero. Uporabili smo tudi

Metode Start in ConfigurePins za inicializacijo našega Arduina med izvajanjem. Shranimo naš skript in se vrnimo v urejevalnik Unity in poglejmo, kaj se je spremenilo.

Zdaj lahko v oknu Inšpektor vidimo naše javne spremenljivke. Poglejmo, kaj lahko na tej stopnji vnesemo, da nam bo kasneje pomagalo. Vemo, katere zatiče uporabljamo na Arduinu iz naše prejšnje gradnje, lahko jih vnesemo. Iz našega prejšnjega poskusa prav tako vemo, kako daleč želimo, da bi naša krogla lahko potovala levo in desno, da ne pade z zaslona. Zdaj vnesite te vrednosti.

Prvi znaki življenja

Čas je, da v urejevalniku Unity dejansko vidimo vrednosti iz našega Arduina. Zaenkrat lahko funkciji Posodobitev skripta SphereMover dodamo eno vrstico kode in skript znova shranimo.

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

Zdaj, ko imamo spremenljivko potValue, ki se posodablja vsak okvir, lahko njeno vrednost v realnem času vidimo v Unity Inspectorju. Preden ga preizkusimo, bi bil pravi čas, da preverite, ali priključek Uniduino posluša na desnih vratih. Kliknite Uniduino v Heirarchyju in v Inšpektorju preverite ime porta. Če je prazno, vnesite pravilno številko vrat za svoj Arduino. V tem primeru je bil COM4, ​​čeprav je pri vas morda drugače. Če niste prepričani, preverite z Arduino IDE.

Izberite svojo kroglo v hierarhiji in kliknite gumb Predvajaj na vrhu zaslona. Sistem potrebuje nekaj sekund za inicializacijo, nato pa bi morali videti, da se spremenljivka Pot Value spremeni v inšpektorju, ko premaknete potenciometer.

Zdaj se pogovarjamo! No, strogo gledano govorita Unity in Arduino, toda kdo šteje? Če ste prišli tako daleč in ne vidite spremembe vrednosti v inšpektorju, preverite korake namestitve in se prepričajte, da ste izbrali pravilna vrata za svoj Arduino.

Premaknimo to sfero

Zdaj, ko imamo spremenjeno spremenljivko potValue, želimo to vrednost uporabiti za premik naše krogle. Ko je potenciometer povsem levo, želimo, da je krogla na levi strani zaslona in obratno. Objekti v Unity so postavljeni na točki vektorskega prostora, določeni z vrednostmi it Transform.position . Na spodnji sliki, kjer je krogla na najbolj oddaljeni točki levo, bi jo želeli, vidite, da je njen vektor položaja 9,5, -4, 0.

Želimo vplivati ​​na položaj X krogle. Na žalost uporaba vrednosti iz našega potenciometra ne bo delovala, saj ko je potenciometer povsem levo, daje vrednost 0 - kar bi našo kroglo postavilo na sredino zaslona. Na drugi skrajnosti bi najvišja vrednost potenciometra, 1023, kocko postavila daleč desno od našega zaslona. Ni uporabno. Tukaj potrebujemo nekaj matematike.

Zakaj matematika, ko vam bo to naredila Unity?

Za tiste, ki ste zunaj, se bojite buljiti v kos papirja, ki je prekrit z nesmiselnimi številkami (čeprav jih je nekaj odlične spletne strani ki vam lahko pomaga pri učenju matematike), ne bojte se. Potrebujemo način, da naše vrednosti potenciometra ustrezajo položaju X krogle. Na srečo lahko uporabimo Metoda podaljšanja .

Razširitvena metoda je skript, ki za nas opravlja posebno delo. V tem primeru mu damo vrednosti, ki jih imamo, in jih vrne preslikane med seboj, pripravljene za uporabo v našem sphereMover skript. Na vrhu plošče Projekt kliknite Ustvari> Skript C# in ga poimenujte ExtensionMethods. V skript vnesite spodnjo kodo:

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

Shranite skript in se vrnite v skript sphereMover. To funkcijo Remap lahko zdaj uporabimo v skriptu ExtensionMethods v funkciji Update, da pretvorimo vrednosti potenciometra v uporabne vrednosti v naši igri. Pod mesto, kjer smo pravkar dodelili spremenljivko potValue, vnesite naslednje:

Poziv nam pokaže, da naš preslikak vzame dva niza vrednosti Od in Do ter jih skupaj preslika. V to lahko vnesemo svoje vrednote.

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

Shranite skript, pojdite nazaj v urejevalnik Unity in pritisnite gumb za predvajanje. Zdaj bi morali videti, da se spremenljivka Mapped Pot spremeni, ko premaknete potenciometer, da ustreza vrednostim, ki smo jih določili za naš levi in ​​desni rob. Vzemite si trenutek in se zahvalite svojemu skriptu ExtensionMethods. Kalkulatorja ni na vidiku.

Opomba: če opazite, da so vaše vrednosti obrnjene, zato, ko je vaš potenciometer povsem v desno, dobite negativno vrednost za spremenljivko Mapped Pot, je vaš potenciometer morda nastavljen napačno. Na srečo lahko to popravite brez ponovnega ožičenja. Ko jih znova preslikate, lahko preprosto spremenite vrednosti:

Zdaj imamo končno uporabne vrednosti. Zdaj je le še treba te vrednosti dodeliti položaju X naše krogle:

brezplačni filmi brez prenosa ali registracije
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Shranite skript, pojdite nazaj v urejevalnik Unity in pritisnite play. Sedaj bi lahko s potenciometrom premaknili svojo sfero v levo in desno!

Dajanje gumba na delo

Zdaj, ko se naša sfera premika, ne bi bilo lepo imeti načina, da nekoliko upočasnimo stvari, ko se znajdemo v stiski? Naš gumb bomo upočasnili v naši igri. Odprite skript sphereMover in dodajte to kodo svoji funkciji Posodobitev

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

Zdaj imamo mehaniko naše igre, dodajmo nekaj ovir! Uporabili bomo naravnega sovražnika krogle, kocko. V hierarhiji kliknite Ustvari> 3d predmet> Kocka . V inšpektorju kocke, Dodajte komponento> Fizika> Trdno telo . Vrednost vlečenja trdega telesa nastavite na 5. Prav tako pod komponento Box Collider v inšpektorju izberite Is Trigger. Tako bomo lahko zaznali trke z našo Sfero.

Ustvarite skript na kocki in ga pokličite collideWithSphere , odprite skript in izbrišite funkcije Start in Update, saj jih tokrat ne bomo potrebovali. Vnesite to kodo:

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

OnTriggerEnter pošlje sporočilo, kadar sprožilni trkalnik zadene drugo trkalnik. V tem primeru mu govorimo, naj uniči vse, česar se dotakne. Shranite skript in se vrnite v urejevalnik Unity. Povlecite kocko iz hierarhije na ploščo Projekt. Opazili boste, da je besedilo kocke v hierarhiji postalo modro. To je zato, ker smo ustvarili montažo in jo shranili v naš projekt. Zdaj izbrišite svojo kocko iz hierarhije.

Zdaj potrebujemo le skript za drsanje kock. V hierarhiji kliknite Ustvari> Ustvari prazno in ga preimenujte v Upravitelj iger v inšpektorju in mu dodajte skript, imenovan gameManager. Odprite skript in dodajte to kodo:

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

}
}

Shranite skript. Nazaj v urejevalniku izberite Upravitelj iger v hierarhiji in povlecite montažno kocko s plošče projekta na spremenljivko Kocka v inšpektorju. Tu vnesite vrednosti za svoj drstenje. Z njim se lahko poigravate, da bo tako težko ali enostavno. Upoštevajte, da je vredno, da se vaše najnižje kocke razvijejo dovolj visoko, da omogočite Uniduinu, da začne - izguba igre, preden se lahko premaknete, je lahko frustrirajuća!

Končan projekt

Ko pritisnete play, se bodo kocke drstile nad vami in padle. S potenciometrom se jim lahko izognete in s svojim gumbom upočasnite čas.

V tem projektu smo ustvarili krmilnik po meri z Arduinom, konfigurirali Unity in Uniduino za komunikacijo z njim ter ustvarili preprosto igro za preizkušanje. Tu lahko koncepte uporabimo za skoraj vsak projekt, obstajajo pa celo marmelade za igre, specializirane za krmilnike po meri .

Z Arduino in Unity lahko ustvarite krmilnik po meri iz skoraj vsega. Ste ustvarili hi-fi, ki upravlja vesoljsko plovilo? Toaster, ki nadzoruje igro na platformi?

Če ste naredili takšen projekt, bi ga rad videl! Objavite ga v komentarjih spodaj!

Deliti Deliti Cvrkutati E-naslov 6 zvočnih alternativ: najboljše brezplačne ali poceni aplikacije za zvočne knjige

Če ne želite plačati za zvočne knjige, je tukaj nekaj odličnih aplikacij, ki vam omogočajo, da jih poslušate brezplačno in zakonito.

Preberite Naprej
Sorodne teme
  • DIY
  • Programiranje
  • Arduino
  • Krmilnik iger
  • Razvoj iger
O avtorju Ian Buckley(216 objavljenih člankov)

Ian Buckley je samostojni novinar, glasbenik, izvajalec in video producent, ki živi v Berlinu v Nemčiji. Ko ne piše ali je na odru, se ukvarja z elektroniko ali kodo DIY v upanju, da bo postal nori znanstvenik.

Več od Iana Buckleyja

Naročite se na naše novice

Pridružite se našemu glasilu za tehnične nasvete, ocene, brezplačne e -knjige in ekskluzivne ponudbe!

Kliknite tukaj, če se želite naročiti
Kategorija Diy