Kuinka tehdä mukautettu peliohjain Arduinon ja Unityn avulla

Kuinka tehdä mukautettu peliohjain Arduinon ja Unityn avulla

Oletko koskaan halunnut suunnitella oman peliohjaimesi? Se on helpompaa kuin luulet!





Tässä lyhyessä projektissa rakennamme yksinkertaisen mukautetun peliohjaimen käytettäväksi Unity -pelimoottorin kanssa. Tämä ohjain saa virtansa Arduino Unosta, vaikka voit käyttää yhtä monista vaihtoehdoista myös tähän projektiin. Luomme myös peruspelin, jossa käytät ohjainta välttääksesi putoavia esineitä ja hidastaaksesi aikaa.





Tätä projektia varten tarvitset

  • Arduino tai vastaava mikro
  • 1 x 10 k ohmin vastus
  • 1 x hetkellinen kytkin
  • 1 x potentiometri
  • Liitäntäjohdot
  • Leipälauta
  • Unity -pelimoottori
  • Uniduino -laajennus Unity Asset Storesta (30 dollaria)
  • Täydellinen projektikoodi, jos et halua kirjoittaa sitä ulos (ei sisällä Uniduino -laajennusta)

Suurin osa näistä asioista on saatavana Arduino -aloituspaketissa. Jos sinulla ei ole aloituspakettia, tutustu oppaaseemme valitaksesi sinulle parhaan.





Voit tehdä ohjaimesta niin monimutkaisen kuin haluat, mutta tässä esimerkissä asetamme potentiometrin ja painikkeen - täydellinen yksinkertaisen arcade -pelin ohjaamiseen.

Ohjaimen kokoaminen

Aseta leipälauta ja Arduino alla olevan kuvan mukaisesti. Tätä käytämme peliohjaimena, vaikka voit käyttää melkein täsmälleen samaa asetusta kuin a DIY midi -ohjain liian!



Arduinon valmistelu

Kun kaikki on kytketty, liitä Arduino USB: n kautta. Siirry Arduino Software IDE: ssä Työkalut> Hallitus ja Työkalut> Portti valitaksesi käyttämääsi mikro -ohjainta ja porttia. Arduino IDE toimitetaan tarvittavan luonnoksen mukana, ja löydät sen alta Tiedosto> Esimerkit> Firmata> StandardFirmata . Napsauta Lataa ja olet valmis menemään.

Jos olet uusi Arduinossa ja pääsi sulaa hieman, tutustu meidän Aloittelijan opas auttaa sinua saamaan sen puhumaan tietokoneellesi hienosti.





Unity -projektin perustaminen

Avaa Unityssä Ikkuna> Omaisuuskauppa päästä Unityn omaisuuskauppaan Unity Editorissa. Etsi Uniduino -laajennus Asset Storesta. Tämän laajennuksen avulla voit vastaanottaa ja lähettää tietoja Unityn Arduino -nastoille ja niistä. Laajennus maksaa kirjoitushetkellä 30 dollaria. On mahdollista tehdä tämä projekti ostamatta laajennusta, vaikka se on melko monimutkainen ja saatat löytää laajennuksen kätevämmäksi kaikin puolin.

Tämä laajennuksen tekijöiden video vie sinut testaamaan, että kaikki toimii, sekä ensimmäiset asetukset. Huomaa, että sinun on ehkä myös nollattava Unity -editori Windowsissa.





Voimme käyttää samaa testipaneelia testataksemme ohjaimemme. Aseta nasta D2 asentoon INPUT ja Digital. Aseta alaspäin nasta A5 asentoon ANALOG. Potentiometrin ja painikkeen pitäisi nyt näyttää arvot näytöllä niiden pin -numeroiden vieressä. Edistystä!

Tehdään nyt jotain, mitä voimme hallita

Meillä on siis ohjain, mutta mitä hallitsemme? Mahdollisuudet ovat rajattomat, mutta tänään luomme hyvin yksinkertaisen väistymispelin testataksemme uutta ohjausjärjestelmäämme. Siirrymme pelin asetusten yli melko nopeasti, joten jos olet täysin uusi Unity -moottorissa, saatat löytää meidän Unity Game -ohjelmoinnin aloitusopas hyödyllistä saada laakerit.

Rakennamme hyvin yksinkertaisen pelin, jossa sinun tavoitteena on väistää palloasi vasemmalle ja oikealle välttääksesi putoavia kuutioita, mikä hyödyntää juuri valmistettua mukautettua ohjainta.

Luo uusi kohtaus ja vedä Uniduino -esivalmisteet Omaisuus> Uniduino> Esivalmisteet hierarkiaan ja vedä Uniduino -esivalmisteet hierarkiaan. Tarvitsemme sitä siellä, jotta voimme keskustella pelimme ja ohjaimen välillä.

Napsauta Unity -hierarkiassa Luo> pallo ja käytä Inspectorin Muuta -välilehteä siirtääksesi se pelinäytön alareunaan.

On aika hankkia koodaus

Nyt lisätään koodi tähän puolueeseen. Kun pallo on valittu Hierarkiassa, napsauta Lisää komponentti> Uusi komentosarja tarkastaja -ikkunan alareunassa. Nimeä se sphereMover ja valitse C Sharp pudotusvalikosta. Klikkaus Luo ja lisää ja komentosarja lisätään GameObjectiin. Avaa skripti kaksoisnapsauttamalla sitä ja kirjoita tämä koodi:

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

Käytä hetki koodikommenttien lukemiseen. Toistaiseksi olemme ilmoittaneet muuttujia Arduinollemme, sen nastoille ja pallollemme. Olemme myös käyttäneet

Käynnistä ja ConfigurePins -menetelmät alustavat Arduinomme ajoaikana. Tallenna skriptimme ja palaa Unity -editoriin ja katso, mikä on muuttunut.

Näemme nyt julkiset muuttujamme Tarkastaja -ikkunassa. Katsotaanpa, mitä voimme tehdä tässä vaiheessa auttaaksemme meitä myöhemmin. Tiedämme, mitä tappeja käytämme Arduinolla, jo valmiiksi rakennettuina, voimme syöttää ne. Tiedämme myös aikaisemmasta kokeilustamme, kuinka pitkälle haluamme pallomme kulkevan vasemmalle ja oikealle, jotta se ei putoa näytöltä. Anna nämä arvot nyt.

Elämän ensimmäiset merkit

On aika todella nähdä Arduinon arvot Unity Editorissa. Toistaiseksi voimme lisätä yhden koodirivin sphereMover -skriptimme päivitystoimintoon ja tallentaa komentosarjan uudelleen.

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

Nyt kun potValue -muuttujamme päivitetään joka kehyksessä, voimme nähdä sen arvon reaaliajassa Unity Inspectorissa. Ennen kuin annamme sille testin, nyt olisi hyvä aika tarkistaa, että Uniduino -liitin kuuntelee oikeaa porttia. Napsauta Unirainoa Heirarchiassa ja tarkista tarkastajan portin nimi. Jos se on tyhjä, kirjoita Arduinon oikea portin numero. Tässä tapauksessa se oli COM4, ​​vaikka se voi olla erilainen sinulle. Tarkista Arduino IDE, jos et ole varma.

Valitse alueesi hierarkiassa ja napsauta Toista -painiketta näytön yläreunassa. Järjestelmä tarvitsee muutaman sekunnin alustuksen, minkä jälkeen sinun pitäisi alkaa nähdä potin arvon muuttuvan muutoksen tarkastajassa, kun siirrät potentiometriä.

Nyt puhumme! Tarkkaan ottaen Unity ja Arduino puhuvat, mutta kuka laskee? Jos olet päässyt näin pitkälle etkä näe arvon muutosta tarkastajassa, tarkista asennusvaiheet ja varmista, että olet valinnut oikean portin Arduinollesi.

Siirretään tätä alaa

Nyt kun potValue -muuttuja on päivitetty, haluamme käyttää tätä arvoa alueemme siirtämiseen. Kun potentiometri on kokonaan vasemmalla, haluamme pallon olevan näytön vasemmassa reunassa ja päinvastoin. Unityn objektit sijoitetaan vektoriavaruuden kohtaan sen arvojen perusteella Muuta asema . Alla olevassa kuvassa, jossa pallo on kauimpana vasemmalla puolella, jota haluaisimme, näet, että sen sijaintivektori on 9,5, -4, 0.

Haluamme vaikuttaa pallon X -asemaan. Valitettavasti potentiometrimme arvojen käyttäminen suoraan ei toimi, koska kun potentiometri on kokonaan vasemmalla, se antaa arvon 0 - mikä sijoittaisi pallon suoraan näytön keskelle. Toisessa ääripäässä potentiometrin huippuarvo, 1023, sijoittaisi kuution näytön oikealle puolelle. Ei hyödyllinen. Tässä tarvitsemme matematiikkaa.

Miksi matematiikka, kun yhtenäisyys tekee sen puolestasi?

Niille teistä, jotka pelkäävät tuijottaa paperia, joka on peitetty järjettömillä numeroilla (vaikka on joitain hienoja verkkosivustoja joka voi auttaa sinua oppimaan matematiikkaa), älä pelkää. Tarvitsemme tavan saada potentiometrin arvot vastaamaan pallomme X -asemaa. Onneksi voimme käyttää Laajennusmenetelmä .

Laajennusmenetelmä on käsikirjoitus, joka tekee tietyn tehtävän meille. Tässä tapauksessa annamme sille arvot, jotka meillä on, ja se palauttaa ne toisiinsa kartoitettuna valmiina käytettäväksi sphereMover käsikirjoitus. Napsauta Projekti -paneelin yläreunassa Luo> C# Script ja nimeä se ExtensionMethods. Kirjoita alla oleva koodi komentosarjaan:

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

Tallenna komentosarja ja palaa takaisin sphereMover -komentosarjaan. Voimme nyt käyttää tätä Remap -toimintoa ExtensionMethods -skriptissämme päivitystoiminnossamme muuntaaksemme potentiometrin arvot pelimme käyttökelpoisiksi arvoiksi. Kirjoita seuraavaan kohtaan potValue -muuttuja:

Kehote osoittaa meille, että Remap ottaa kaksi Lähettäjä- ja To -arvoa ja kartoittaa ne yhdessä. Voimme syöttää arvomme tähän.

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

Tallenna skriptisi, palaa Unity -editoriin ja paina toistopainiketta. Sinun pitäisi nyt nähdä, että kartoitetun potin muuttuja muuttuu, kun siirrät potentiometriä vastaamaan vasemman ja oikean reunan määrittämiämme arvoja. Ota hetki aikaa istua alas ja kiittää ExtensionMethods -käsikirjoitustasi. Ei laskin näkyvissä.

Huomautus: Jos huomaat, että arvosi ovat päinvastaiset, joten kun potentiometri on aivan oikealla, saat negatiivisen arvon Mapped Pot -muuttujalle, potentiometri saattaa olla asetettu väärin päin. Onneksi voit korjata tämän ilman johdotusta. Voit yksinkertaisesti vaihtaa arvoja, kun määrität ne uudelleen:

Nyt meillä on vihdoin käyttökelpoisia arvoja. Nyt ei ole muuta kuin määrittää nämä arvot alueemme X -asemaan:

parhaat virtuaalitodellisuussovellukset Androidille
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Tallenna skriptisi, palaa Unity -editoriin ja paina play. Sinun pitäisi nyt pystyä siirtämään palloasi vasemmalle ja oikealle potentiometrilläsi!

Painikkeen työntäminen

Nyt, kun olemme aloittaneet toimintamme, eikö olisi hienoa saada tapa hidastaa asioita hieman, kun joudumme ahtaaseen paikkaan? Hidastamme aikaa pelissämme painikkeella. Avaa sphereMover -komentosarja ja lisää tämä koodi päivitystoimintoosi

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

Nyt meillä on pelimme mekaniikka, lisätään joitain esteitä! Käytämme pallon luonnollista vihollista, kuutiota. Napsauta hierarkiassa Luo> 3D -objekti> Kuutio . Kuution tarkastaja, Lisää komponentti> Fysiikka> Jäykkä runko . Aseta jäykän rungon vetovoima -arvoksi 5. Valitse myös tarkastajan Box Collider -komponentin alta Is Trigger. Näin voimme havaita törmäykset palloomme.

Luo komentosarja kuutioon ja soita sille törmätäSphereen , avaa komentosarja ja poista Käynnistä- ja Päivitä -toiminnot, koska emme tarvitse niitä tällä kertaa. Anna tämä koodi:

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

OnTriggerEnter lähettää viestin aina, kun liipaisimen törmäyslaite osuu toiseen törmätäjään. Tässä tapauksessa me kehotamme sitä tuhoamaan kaiken, mihin se koskettaa. Tallenna komentosarja ja palaa Unity -editoriin. Vedä kuutio hierarkiasta Projekti -paneeliin. Huomaat, että hierarkian kuution teksti on muuttunut siniseksi. Tämä johtuu siitä, että olemme luoneet esivalmisteen ja tallentaneet sen projektiin. Poista kuutio hierarkiasta nyt.

Tarvitsemme nyt vain käsikirjoituksen kuutioiksi. Napsauta hierarkiassa Luo> Luo tyhjä ja nimeä se uudelleen Inspectorin Game Manageriin ja lisää siihen komentosarja nimeltä gameManager. Avaa komentosarja ja lisää tämä koodi:

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

}
}

Tallenna käsikirjoitus. Takaisin editorissa valitse Game Manager hierarkiasta ja vedä kuutioesivalmistesi projektipaneelista Inspectorin Cube -muuttujaan. Täytä kuteesi arvot myös täällä. Voit viipyä sen kanssa, jotta se olisi niin vaikeaa tai helppoa kuin haluat. Huomaa, että alimmat kuutiot kannattaa kasvattaa riittävän korkealle, jotta Uniduino voi aloittaa - pelin häviäminen ennen siirtymistä voi olla turhauttavaa!

Valmis projekti

Nyt kun painat play, kuutiot kutivat yläpuolellasi ja putoavat. Voit välttää niitä käyttämällä potentiometriäsi ja hidastaa painiketta.

Tässä projektissa olemme luoneet mukautetun ohjaimen Arduinolla, määrittäneet Unityn ja Uniduinon kommunikoimaan sen kanssa ja luoneet yksinkertaisen pelin sen testaamiseksi. Tässä olevia käsitteitä voidaan soveltaa melkein mihin tahansa projektiin, ja niitä on jopa pelitukoksia, jotka ovat erikoistuneet mukautettuihin ohjaimiin .

Arduinon ja Unityn avulla voit luoda mukautetun ohjaimen melkein mistä tahansa. Oletko luonut hifin, joka ohjaa avaruusalusta? Leivänpaahdin, joka ohjaa tasohyppelypeliä?

Jos olet tehnyt tällaisen projektin, haluaisin nähdä sen! Lähetä se alla oleviin kommentteihin!

Jaa Jaa Tweet Sähköposti 6 kuultavaa vaihtoehtoa: parhaat ilmaiset tai halvat äänikirjasovellukset

Jos et halua maksaa äänikirjoista, tässä on hienoja sovelluksia, joiden avulla voit kuunnella niitä ilmaiseksi ja laillisesti.

Lue seuraava
Liittyvät aiheet
  • tee-se-itse
  • Ohjelmointi
  • Arduino
  • Pelin ohjain
  • Pelikehitys
Kirjailijasta Ian Buckley(216 artikkelia julkaistu)

Ian Buckley on freelance -toimittaja, muusikko, esiintyjä ja videotuottaja, joka asuu Berliinissä, Saksassa. Kun hän ei kirjoita tai ei ole lavalla, hän hieroo DIY -elektroniikkaa tai koodia toivossa tulla hulluksi tiedemieheksi.

Lisää Ian Buckleyltä

tilaa uutiskirjeemme

Liity uutiskirjeeseemme saadaksesi teknisiä vinkkejä, arvosteluja, ilmaisia ​​e -kirjoja ja ainutlaatuisia tarjouksia!

Klikkaa tästä tilataksesi