Kaip sukurti pasirinktinį žaidimų valdiklį naudojant „Arduino“ ir „Unity“

Kaip sukurti pasirinktinį žaidimų valdiklį naudojant „Arduino“ ir „Unity“

Ar kada nors norėjote sukurti savo žaidimų valdiklį? Tai lengviau, nei manote!





Šiame trumpame projekte mes sukursime paprastą pasirinktinį žaidimų valdiklį, kurį naudosime su „Unity“ žaidimų varikliu. Šį valdiklį maitins „Arduino Uno“, nors šiam projektui taip pat galite naudoti vieną iš daugelio alternatyvų. Mes taip pat sukursime pagrindinį žaidimą, kuriame naudosite valdiklį, kad išvengtumėte krintančių objektų ir sulėtintumėte laiką.





Šiam projektui jums reikės

  • „Arduino“ ar panašus mikrovaldiklis
  • 1 x 10k omo rezistorius
  • 1 x momentinis jungiklis
  • 1 x potenciometras
  • Prijungimo laidai
  • Duonos lenta
  • „Unity“ žaidimo variklis
  • „Uniduino“ papildinys iš „Unity Asset Store“ (30 USD)
  • Užpildykite projekto kodą, jei nenorite jo išrašyti (neapima „Uniduino“ papildinio)

Dauguma šių dalykų yra „Arduino“ pradiniame rinkinyje. Jei neturite pradinio rinkinio, peržiūrėkite mūsų vadovą, kad išsirinktumėte geriausią.



Valdiklį galite padaryti taip sudėtingą, kaip norite, tačiau šiame pavyzdyje mes nustatysime potenciometrą ir mygtuką - puikiai tinka valdyti paprastą arkadinį žaidimą.

Valdiklio surinkimas

Nustatykite savo duonos lentą ir „Arduino“, kaip parodyta žemiau esančiame paveikslėlyje. Tai mes naudosime kaip savo žaidimų valdiklį, nors galėtumėte naudoti beveik tą pačią sąranką kaip ir „Pasidaryk pats“ midi valdiklis taip pat!



„Arduino“ paruošimas

Kai viskas bus prijungta, prijunkite „Arduino“ per USB. „Arduino Software IDE“ eikite į Įrankiai> Lenta ir Įrankiai> Uostas pasirinkti naudojamą mikrovaldiklį ir prievadą. „Arduino IDE“ komplektuojamas su mums reikalingu eskizu, kurį rasite žemiau Failas> Pavyzdžiai> Firmata> StandardFirmata . Spustelėkite Įkelti ir būsite pasiruošę eiti.

Jei esate naujas „Arduino“ ir jūsų galva šiek tiek tirpsta, patikrinkite mūsų Pradedančiųjų vadovas kad padėtų jums gražiai kalbėti su kompiuteriu.





„Unity“ projekto kūrimas

Vienybėje, atidarykite Langas> Turto parduotuvė pasiekti „Unity“ turto parduotuvę iš „Unity“ redaktoriaus. Ieškokite „Uniduino“ papildinio „Asset Store“. Šis papildinys leis jums gauti ir siųsti duomenis į „Unity“ esančius „Arduino“ kaiščius ir iš jų. Rašymo metu papildinys kainuoja 30 USD. Tai yra įmanoma atlikti šį projektą nepirkdami papildinio, nors jis yra gana sudėtingas ir jums gali atrodyti patogiau.

Šis vaizdo įrašas iš papildinio kūrėjų parodo, kaip viskas veikia, taip pat pirmą kartą nustatant. Atminkite, kad taip pat gali tekti iš naujo nustatyti „Unity“ redaktorių sistemoje „Windows“.





Mes galime naudoti tą patį bandymų skydelį, kad išbandytume savo valdiklį. Nustatykite kaištį D2 į INPUT ir Digital. Toliau žemyn nustatykite kaištį A5 į ANALOG. Jūsų potenciometras ir mygtukas dabar turėtų rodyti vertes ekrane šalia jų PIN kodų. Progresas!

Dabar padarykime tai, ką galime kontroliuoti

Taigi mes turime valdiklį, bet ką mes valdysime? Na, galimybės yra neribotos, tačiau šiandien mes sukursime labai paprastą išsisukimo žaidimą, kad išbandytume naują valdymo sistemą. Mes gana greitai pereisime prie žaidimo sąrankos, taigi, jei esate visiškai naujas „Unity“ variklis, galite rasti mūsų „Unity“ žaidimų programavimo pradedančiųjų vadovas naudinga atrasti savo pozicijas.

Mes sukursime labai paprastą žaidimą, kuriame jūsų tikslas yra nukreipti savo sferą į kairę ir į dešinę, kad išvengtumėte kubelių kritimo.

Sukurkite naują sceną ir vilkite „Uniduino“ surenkamąjį elementą iš Turtas> Uniduino> Surenkamieji elementai į savo hierachy ir vilkite Uniduino surenkamą elementą į hierarchiją. Mums to reikia, kad galėtume kalbėti tarp mūsų žaidimo ir valdiklio.

„Unity“ hierarchijoje spustelėkite Sukurti> Sfera ir naudokite Inspektoriaus skirtuką Transformuoti, kad perkeltumėte jį į žaidimo ekrano apačią.

Atėjo laikas gauti kodavimą

Dabar pridėkite šiai partijai šiek tiek kodo. Pasirinkę sritį Hierarchijoje, spustelėkite Pridėti komponentą> Naujas scenarijus jo inspektoriaus lango apačioje. Pavadink sferaMover ir pasirinkite C Sharp iš išskleidžiamojo meniu. Spustelėkite Sukurti ir pridėti ir scenarijus bus pridėtas prie „GameObject“. Dukart spustelėkite jį, kad atidarytumėte scenarijų, ir įveskite šį kodą:

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

Skirkite šiek tiek laiko ir perskaitykite kodo komentarus. Iki šiol mes paskelbėme kai kuriuos kintamuosius mūsų „Arduino“, jo kaiščiams ir mūsų sferai. Mes taip pat naudojome

Pradėkite ir „ConfigurePins“ metodus, kad paleistumėte „Arduino“ vykdymo metu. Išsaugokime scenarijų ir grįžkime į „Unity“ redaktorių ir pažiūrėkime, kas pasikeitė.

Dabar matome viešuosius kintamuosius Inspektoriaus lange. Pažiūrėkime, ką galime įvesti šiame etape ir padėti mums vėliau. Mes žinome, kokius smeigtukus naudojame „Arduino“ iš ankstesnės versijos, galime juos įvesti. Iš anksčiau atlikto eksperimento taip pat žinome, kiek toli norime, kad mūsų sfera galėtų keliauti kairėn ir dešinėn, kad ji nenukristų nuo ekrano. Įveskime šias vertes dabar.

Pirmieji gyvenimo ženklai

Laikas iš tikrųjų pamatyti „Arduino“ vertybes „Unity“ redaktoriuje. Kol kas prie „sphereMover“ scenarijaus atnaujinimo funkcijos galime pridėti vieną kodo eilutę ir dar kartą išsaugoti scenarijų.

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

Dabar, kai mūsų kintamasis „potValue“ atnaujinamas kiekviename kadre, jo vertę realiuoju laiku matome „Unity Inspector“. Prieš išbandydami, dabar būtų tinkamas laikas patikrinti, ar „Uniduino“ kištukas klausosi tinkamo prievado. Heirarchijoje spustelėkite „Uniduino“ ir patikrinkite inspektoriaus uosto pavadinimą. Jei jis tuščias, įveskite tinkamą „Arduino“ prievado numerį. Šiuo atveju tai buvo COM4, ​​nors jums gali būti kitaip. Patikrinkite naudodami „Arduino IDE“, jei nesate tikri.

Hierarchijoje pasirinkite sferą ir ekrano viršuje spustelėkite mygtuką Leisti. Sistemai inicijuoti reikia kelių sekundžių, o po to jūs turėtumėte matyti, kaip keičiasi Pot Value kintamasis parametras inspektoriuje, kai perkeliate potenciometrą.

Dabar mes kalbame! Na, griežtai kalbant, „Unity“ ir „Arduino“ kalba, bet kas skaičiuoja? Jei pasiekėte tiek toli ir nematote inspektoriaus vertės pasikeitimo, patikrinkite sąrankos veiksmus ir įsitikinkite, kad „Arduino“ pasirinktas tinkamas prievadas.

Perkelkime šią sferą

Dabar, kai atnaujinamas kintamasis „potValue“, norime naudoti šią vertę savo sferai perkelti. Kai potenciometras yra visiškai kairėje, mes norime, kad sfera būtų kairėje ekrano pusėje ir atvirkščiai. Vienybės objektai yra išdėstyti vektorinės erdvės taške, kurį lemia jo vertės Transformuoti.pozicija . Žemiau esančiame paveikslėlyje, kur sfera yra tolimiausiame taške į kairę, ko mes norėtume, galite pamatyti, kad jo padėties vektorius yra 9,5, -4, 0.

Mes norime paveikti sferos X padėtį. Deja, tiesiogiai naudojant mūsų potenciometro vertes neveiks, nes kai potenciometras yra iki galo į kairę, jis suteikia vertę 0 - tai mūsų sferą padėtų tiesiai ekrano viduryje. Kitu kraštutinumu, aukščiausia potenciometro vertė, 1023, kubą pastatytų mūsų ekrano dešinėje. Nenaudingas. Čia mums reikia tam tikros matematikos.

Kodėl matematika, kai vienybė tai padarys už jus?

Tiems iš jūsų, kurie bijo žiūrėti į popierių, padengtą beprasmiais skaičiais (nors yra keletas puikios svetainės tai gali padėti išmokti matematikos), nebijokite. Mums reikia būdo, kaip mūsų potenciometro vertės atitiktų mūsų sferos X padėtį. Laimei, mes galime naudoti Pratęsimo metodas .

Pratęsimo metodas yra scenarijus, kuris mums atlieka konkretų darbą. Tokiu atveju mes suteikiame jam turimas vertes ir jis grąžina jas susietas viena su kita, paruoštas naudoti mūsų sferaMover scenarijus. Projekto skydelio viršuje spustelėkite Sukurti> C# scenarijus ir pavadinkite jį „ExtensionMethods“. Įveskite žemiau esantį kodą į scenarijų:

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

Išsaugokite scenarijų ir grįžkite į savo „sphereMover“ scenarijų. Dabar galime naudoti šią „Remap“ funkciją savo „ExtensionMethods“ scenarijuje atnaujinimo funkcijoje, kad potenciometro reikšmes paverstų naudingomis mūsų žaidimo vertėmis. Ten, kur ką tik priskyrėme kintamąjį „potValue“, įveskite:

Paraginimas parodo mums, kad mūsų „Remap“ imasi dviejų verčių „Nuo“ ir „Į“ rinkinių ir kartu jas susieja. Į tai galime įvesti savo vertybes.

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

Išsaugokite scenarijų, grįžkite į „Unity“ redaktorių ir paspauskite paleidimo mygtuką. Dabar turėtumėte pamatyti, kad „Mapped Pot“ kintamasis keičiasi, kai perkeliate potenciometrą, kad atitiktų vertes, kurias nustatėme kairiesiems ir dešiniams kraštams. Skirkite šiek tiek laiko atsisėsti ir padėkoti savo „ExtensionMethods“ scenarijui. Matosi ne skaičiuotuvas.

Pastaba: jei pastebite, kad jūsų vertės yra atvirkštinės, taigi, kai jūsų potenciometras yra visiškai dešinėje, jūs gaunate neigiamą „Mapped Pot“ kintamojo vertę, gali būti, kad jūsų potenciometras nustatytas netinkamai. Laimei, galite tai ištaisyti neatlikdami jokių laidų. Galite tiesiog pakeisti vertes, kai jas pakeisite:

Dabar pagaliau turime naudingų vertybių. Dabar lieka tik priskirti šias vertes mūsų sferos X padėčiai:

kaip išjungti ribotą režimą
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Išsaugokite scenarijų, grįžkite į „Unity“ redaktorių ir paspauskite „Play“. Dabar, naudodami potenciometrą, turėtumėte sugebėti perkelti savo sferą į kairę ir į dešinę!

Mygtuko veikimas

Dabar, kai mūsų sfera juda, ar nebūtų malonu turėti būdą, kaip šiek tiek sulėtinti situaciją, kai atsidursime sunkioje padėtyje? Mes naudosime savo mygtuką, kad sulėtintume žaidimo laiką. Atidarykite „sphereMover“ scenarijų ir pridėkite šį kodą prie atnaujinimo funkcijos

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

Dabar mes turime savo žaidimo mechaniką, pridėkime keletą kliūčių! Mes panaudosime natūralų sferos priešą - kubą. Hierarchijoje spustelėkite Sukurti> 3D objektas> Kubas . Kubo inspektoriuje, Pridėti komponentą> Fizika> Rigidbody . Nustatykite standaus korpuso „Drag“ reikšmę į 5. Be to, inspektoriaus „Box Collider“ komponente pasirinkite „Is Trigger“. Tai leis mums aptikti susidūrimus su mūsų sfera.

Sukurkite scenarijų kube ir paskambinkite susidurti su sfera , atidarykite scenarijų ir ištrinkite „Start“ ir „Update“ funkcijas, nes šį kartą mums jų neprireiks. Įveskite šį kodą:

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

„OnTriggerEnter“ siunčia pranešimą, kai paleidimo greitintuvas atsitrenkia į kitą greitintuvą. Šiuo atveju mes sakome, kad jis sunaikintų viską, ką liečia. Išsaugokite scenarijų ir grįžkite į „Unity“ redaktorių. Vilkite kubą iš hierarchijos į projekto skydą. Pastebėsite, kad kubo tekstas hierarchijoje tapo mėlynas. Taip yra todėl, kad sukūrėme surenkamą elementą ir išsaugojome jį savo projekte. Dabar ištrinkite kubą iš hierarchijos.

Viskas, ko mums dabar reikia, yra scenarijus kubeliams atnešti. Hierarchijoje spustelėkite Sukurti> Sukurti tuščią ir pervardykite jį į Inspektoriaus žaidimų tvarkyklę ir pridėkite prie jo scenarijų, pavadintą gameManager. Atidarykite scenarijų ir pridėkite šį 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 ()
{

}
}

Išsaugokite scenarijų. Grįžę į redaktorių, hierarchijoje pasirinkite žaidimų tvarkyklę ir vilkite kubo surenkamąjį elementą iš projekto skydelio į inspektoriaus kintamąjį Kubas. Čia taip pat užpildykite savo neršto vertes. Galite su juo smuikuoti, kad būtų taip sunku ar lengva, kaip jums patinka. Turėkite omenyje, kad žemiausi kubeliai turėtų būti pakankamai aukšti, kad „Uniduino“ galėtų inicijuoti - žaidimo praradimas prieš pradedant judėti gali būti varginantis!

Baigtas projektas

Dabar, kai paspausite žaisti, kubeliai nerš virš jūsų ir nukris. Galite jų naudoti potenciometru, kad jų išvengtumėte, o mygtuku - sulėtinti laiką.

Šiame projekte sukūrėme pasirinktinį valdiklį su „Arduino“, sukonfigūravome „Unity“ ir „Uniduino“ su juo bendrauti ir sukūrėme paprastą žaidimą, kad jį išbandytume. Čia pateiktos sąvokos gali būti taikomos beveik bet kokiam projektui, ir yra net žaidimų uogienės, kurios specializuojasi pasirinktiniuose valdikliuose .

Naudodami „Arduino“ ir „Unity“ galite sukurti pasirinktinį valdiklį iš beveik bet ko. Ar sukūrėte „Hi-Fi“, valdantį erdvėlaivį? Skrudintuvas, valdantis platforminį žaidimą?

Jei sukūrėte tokį projektą, aš norėčiau jį pamatyti! Paskelbkite tai komentaruose žemiau!

Dalintis Dalintis „Tweet“ Paštu 6 garsinės alternatyvos: geriausios nemokamos arba pigios garso knygų programos

Jei nenorite mokėti už garso knygas, čia yra keletas puikių programų, leidžiančių nemokamai ir legaliai jų klausytis.

Skaityti toliau
Susijusios temos
  • Pasidaryk pats
  • Programavimas
  • Arduino
  • Žaidimų valdiklis
  • Žaidimo kūrimas
Apie autorių Ianas Buckley(Paskelbti 216 straipsniai)

Ianas Buckley yra laisvai samdomas žurnalistas, muzikantas, atlikėjas ir vaizdo įrašų prodiuseris, gyvenantis Berlyne, Vokietijoje. Kai jis nerašo ar scenoje, jis tikisi pasidaryk pats elektronika ar kodu, tikėdamasis tapti pamišusiu mokslininku.

Daugiau iš Ian Buckley

Prenumeruokite mūsų naujienlaiškį

Prisijunkite prie mūsų naujienlaiškio, kad gautumėte techninių patarimų, apžvalgų, nemokamų el. Knygų ir išskirtinių pasiūlymų!

Norėdami užsiprenumeruoti, spustelėkite čia