Hvordan lage en tilpasset spillkontroll med Arduino og Unity
Har du noen gang ønsket å designe din egen spillkontroller? Det er lettere enn du tror!
I dette korte prosjektet vil vi bygge en enkel tilpasset spillkontroll for å bruke med Unity-spillmotoren. Denne kontrolleren vil bli drevet av en Arduino Uno, selv om du kan bruke ett av de mange alternativene Arduino Buying Guide: Hvilket styre bør du få? Arduino Kjøpsguide: Hvilket styre bør du få? Det er så mange forskjellige typer Arduino boards der ute, du vil bli tilgitt for å være forvirret. Hvilken bør du kjøpe for prosjektet ditt? La oss hjelpe, med denne Arduino kjøpesiden! Les mer der ute for dette prosjektet også. Vi vil også lage et grunnleggende spill hvor du vil bruke kontrolleren din for å unngå å falle objekter og redusere tiden.
For dette prosjektet trenger du
- Arduino eller lignende mikrokontroller
- 1 x 10k ohm motstand
- 1 x Momentary bryter
- 1 x Potensiometer
- Hook-up ledninger
- Et brødbrett
- Unity spillmotor
- Uniduino-pluginet fra Unity Asset Store ($ 30)
- Fullfør prosjektkode, hvis du ikke vil skrive den ut (inkluderer ikke Uniduino-pluginet)
De fleste av disse tingene er tilgjengelige i et Arduino startpakke. Hvis du ikke har en startpakke, se vår guide for å velge de beste 4 Best Starter Kit for Arduino Beginners 4 Best Starter Kit for Arduino Beginners Det er mange flotte nybegynnere Arduino prosjekter som du kan bruke for å komme i gang, men du vil trenger en Arduino og noen komponenter først. Her er vårt utvalg av 4 av de beste startpakker for ... Les mer en for deg.
Du kan gjøre kontrolleren din så komplisert som du ønsker, men for dette eksempelet vil vi sette opp et potensiometer og en knapp - perfekt for å kontrollere et enkelt arkadespill.
Montering av kontrolleren
Sett opp ditt brødbrett og Arduino som vist på bildet nedenfor. Dette er hva vi skal bruke som vår spillkontroller, selv om du kan bruke nesten nøyaktig samme oppsett som en DIY midi-kontroller. Hvordan lage en MIDI-kontroller med en Arduino. Hvordan lage en MIDI-kontroller med en Arduino. Som en musiker som har samordnet en samling av musikinstrumenter og støybokser, er den ydmyke Arduino det perfekte verktøyet for å skape en tilpasset MIDI-kontroller. Les mer også!
Forbereder Arduino
Når du har alt koblet til, må du koble din Arduino via USB. I Arduino Software IDE head to Verktøy> Styret og Verktøy> Port for å velge hvilken mikrokontroller og port du bruker. Arduino IDE følger med skissen vi trenger, og du finner den under Fil> Eksempler> Firmata> StandardFirmata. Klikk på Last opp, og du vil være klar til å gå.
Hvis du er ny for Arduino og hodet ditt smelter litt, kan du se vår Begynnerveiledning Komme i gang med Arduino: En nybegynnersveiledning Komme i gang med Arduino: En nybegynners guide Arduino er en åpen kilde elektronikk prototyping plattform basert på fleksibel, lett å bruk maskinvare og programvare. Det er ment for kunstnere, designere, hobbyister, og alle som er interessert i å lage interaktive objekter eller miljøer. Les mer for å hjelpe deg med å snakke med datamaskinen pent.
Sette opp ethetsprosjektet
I Enhet, åpne Vindu> Asset Store Å få tilgang til Unitys Asset Store fra Unity Editor. Søk i Asset Store for Uniduino plugin. Denne plugin vil tillate deg å motta og sende data til og fra dine Arduino pins i Unity. Pluggen ved skriving koster $ 30. Det er mulig å gjøre dette prosjektet uten å kjøpe plugin, selv om det er litt mer komplisert, og du kan finne pluggen mer praktisk hele runden.
Denne videoen fra skaperne av plugin tar deg gjennom prosessen med å teste alt som fungerer, sammen med første gangs oppsett. Merk at du kanskje også må tilbakestille Unity-redigeringsprogrammet på Windows.
Vi kan bruke samme testpanel til å teste vår kontroller. Sett Pin D2 til INPUT og Digital. Videre ned, sett pin A5 til ANALOG. Potentiometeret og knappen din skal vise verdiene på skjermen ved siden av pinnumrene nå. Framgang!
Nå for å gjøre noe vi kan kontrollere
Så vi har en kontroller, men hva skal vi kontrollere? Vel, mulighetene er uendelige, men for i dag skal vi lage et veldig enkelt dodging-spill for å teste ut vårt nye kontrollsystem. Vi vil bevege oss over spilloppsettet ganske fort, så hvis du er helt ny i Unity-motoren, kan du finne vår Unity Game Programmering Begynners Guide Programmering av et spill med enighet: En nybegynners guide Programmering av et spill med enhet: En nybegynners guide i den utviklende Unity har oppstått som noe av en de facto-standard: den lave prisen, brukervennligheten og det brede funksjonssettet gjør det ideelt for rask spillutvikling. Les mer nyttig for å få lagrene dine.
Vi vil bygge et veldig grunnleggende spill hvor målet ditt er å smette unna sfæren til venstre og høyre for å unngå fallende kuber, som vil benytte din nyopprettede tilpassede kontroller.
Lag en ny scene og dra Uniduino prefab fra Eiendeler> Uniduino> Prefabs inn i hierachiet og dra Uniduino prefab i hierarkiet. Vi trenger det der for å snakke mellom vårt spill og kontrolleren.
I enhetshierarkiet klikker du Opprett> Sphere og bruk Transform-fanen i inspektøren for å flytte den til bunnen av spillskjermbildet.
Det er på tide å få koding
Nå for å legge til noen koden til denne festen. Med sfæren valgt i hierarkiet klikker du på Legg til komponent> Nytt script nederst på det er inspektørvinduet. Navngi det sphereMover og velg C Sharp fra rullegardinmenyen. Klikk Opprett og legg til og skriptet vil bli lagt til GameObject. Dobbeltklikk på den for å åpne skriptet og skriv inn denne koden:
bruker UnityEngine; bruker System.Collections; bruker Uniduino; offentlig klasse sfæreMover: MonoBehaviour // Headers er ikke absolutt nødvendig, men de gjør livet lettere tilbake i inspektøren. [Overskrift ("Arduino Variables")] // Vi må deklarere Arduino som en variabel offentlig Arduino arduino; // vi trenger å erklære et heltall for pin nummeret til vårt potensiometer, // gjøre disse variablene offentlige betyr at vi kan endre dem i redaktøren senere // hvis vi endrer oppsettet til vår arduino offentlige int potPinNumber; // en variabel variabel for å holde potensiometerverdien (0 - 1023) offentlig float potValue; // vi vil senere omarbeide den potValue til y-posisjonen til kapselen vår og holde den i denne variabelen offentlige float mappedPot; // offentlig int for vår knapp pin offentlig int buttonPinNumber; [Overskrift ("Sphere Variables")] // variabler for å holde verdiene vi noterte tidligere for sidene av skjermen offentlig float leftEdge; offentlig float rightEdge; // Bruk dette for initialisering tomt Start () // og initialiser vi skal, fra og med Arduino Variable. // vi bruker bare en arduino, så vi kan bruke Arduino.global å ta tak i det. arduino = Arduino.global; arduino.Setup (ConfigurePins); void ConfigurePins () // konfigurer Arduino pin til å være analog for vårt potensiometer arduino.pinMode (potPinNumber, PinMode.ANALOG); // Fortell Arduino å rapportere eventuelle endringer i verdien av vårt potensiometer arduino.reportAnalog (5, 1); // konfigurer vår knappestift arduino.pinMode (buttonPinNumber, PinMode.INPUT); arduino.reportDigital ((byte) (buttonPinNumber / 8), 1);
Ta et øyeblikk for å lese gjennom kodens kommentarer. Så langt har vi erklært noen variabler for våre Arduino, dens pinner og vårt kule. Vi har også brukt
Start og ConfigurePins metoder for å initialisere vår Arduino på kjøretid. Lar redde skriptet vårt, og gå tilbake til Unity-redaktøren og se hva som er endret.
Vi kan nå se våre offentlige variabler i Inspector-vinduet. La oss se hva vi kan legge inn på dette stadiet for å hjelpe oss senere. Vi vet hvilken pinne vi bruker på Arduino fra vår bygning tidligere, vi kan komme inn i dem. Vi vet også fra eksperimentet tidligere hvor langt vi vil at sfæren skal kunne reise til venstre og høyre slik at den ikke faller av skjermen. Lar oss skrive inn disse verdiene nå.
Første tegn på livet
Det er på tide å faktisk se verdier fra vår Arduino i Unity Editor. For nå kan vi legge til en linje med kode i vårt sphereMover-skripts Update-funksjon, og lagre skriptet på nytt.
ugyldig oppdatering () // Vi tildeler verdien arduino leser fra vår potensitetsmåler til vår potValue-variabel potValue = arduino.analogRead (potPinNumber);
Nå som vi har oppdatert vår potValue-variabel hver ramme, kan vi se verdien i sanntid i Unity Inspector. Før vi gir det en test, ville det vært en god tid å sjekke at Uniduino-pluggen lytter til høyre port. Klikk på Uniduino i Heirarchy, og sjekk det er Portnavn i inspektøren. Hvis det er tomt, fyll inn riktig portnummer for din Arduino. I dette tilfellet var det COM4, selv om det kan være annerledes for deg. Kontroller at du bruker Arduino IDE hvis du ikke er sikker.
Velg din sfære i hierarkiet og klikk på Play-knappen øverst på skjermen. Systemet trenger noen sekunder til å initialisere, hvorpå du skal begynne å se variabelen for Pot Value-varianten i inspektøren når du beveger potensiometeret.
Nå snakker vi! Vel, strengt snakkes Enhet og Arduino, men hvem teller? Hvis du har dette langt og ikke ser verdifallendringen i inspektøren, sjekk over oppsettstrinnene, og kontroller at du har riktig port valgt for din Arduino.
La oss flytte denne sfæren
Nå som vi har ut potValue-variabelen oppdatert, vil vi bruke denne verdien til å flytte sfæren vår. Når potensiometeret er helt til venstre, vil vi at kule skal ligge på venstre side av skjermen, og omvendt. Objekter i Enhet er plassert på et punkt i Vector-rom, bestemt av verdiene til det er Transform.position. I bildet under, hvor sfæren er lengst til venstre, vil vi ha det, du kan se at det er posisjonvektoren 9,5, -4, 0.
Vi ønsker å påvirke sfæreens X-posisjon. Dessverre fungerer ikke verdiene fra potensiometeret direkte, da potensiometeret er helt til venstre gir det en verdi på 0 - noe som ville sette vår sfære rett midt på skjermen. På den andre ekstreme vil potensiometerets høyeste verdi, 1023, plassere kuben helt til høyre på skjermen. Ikke brukbar. Det vi trenger her er litt matte.
Hvorfor gjør mat når enighet vil gjøre det for deg?
For de av dere der ute, dreading stirrer på et stykke papir som er dekket av usannsynlige tall (selv om det er noen gode nettsteder De 20 nettstedene du trenger å lære matematisk trinn for trinn De 20 nettstedene du trenger å lære matematisk trinn for trinn Vi har samlet beste nettsteder for hvert nivå, slik at du kan lære systematisk, få bedre forståelse av matematikk ett nivå av gangen, og ha det gøy! Les mer som kan hjelpe deg med å lære matematikk), ikke frykt. Vi trenger en måte å gjøre våre potensiometerverdier tilsvarer sfærens X-posisjon. Heldigvis kan vi bruke en Forlengelsesmetode.
En forlengelsesmetode er et skript som gjør en bestemt jobb for oss. I dette tilfellet gir vi det verdiene vi har, og det returnerer dem kartlagt til en annen, klar til bruk i vår sphereMover manus. Øverst på prosjektpanelet klikker du Opprett> C # Script og nev det ExtensionMethods. Skriv inn koden under i skriptet:
bruker UnityEngine; bruker System.Collections; offentlig statisk klasse ExtensionMethods // vår praktiske dandy Remapper funksjon offentlig statisk float Remap (denne float verdi, float from1, float to1, float from2, float to2) return (value - from1) / (to1 - from1) * (to2 - fra2) + fra2;
Lagre skriptet, og gå tilbake til ditt sphereMover-skript. Vi kan nå bruke denne Remap-funksjonen i vårt ExtensionMethods-skript i vår oppdateringsfunksjon for å konvertere potensiometerverdiene til brukbare verdier i vårt spill. Under der vi bare tilordnet potValue-variabelen, skriver du følgende:
Prompten viser oss at vår Remap tar to sett med Fra og Til-verdier, og kartlegger dem sammen. Vi kan legge inn verdiene våre i dette.
mappedPot = potValue.Remap (0, 1023, leftEdge, rightEdge);
Lagre skriptet ditt, gå tilbake til Unity-editoren, og klikk på avspillingsknappen. Du bør nå se at Mapped Pot-variabelen endres når du flytter potensiometeret, for å korrespondere med verdiene vi har bestemt for våre venstre og høyre kant. Ta deg tid til å lene deg tilbake og takke ExtensionMethods-skriptet. Ikke en kalkulator i sikte.
Merk: Hvis du merker at verdiene dine er reversert, så når potensiometeret ditt er helt til høyre, får du en negativ verdi for Mapped Pot-variabelen, det kan hende at potensiometeret har satt feil vei rundt. Heldigvis kan du reparere dette uten å gjøre noen rewiring. Du kan bare bytte verdiene når du omstiller dem:
Nå har vi endelig brukbare verdier. Nå er alt som er igjen å gjøre, å tildele disse verdiene til sfærens X-posisjon:
// Tilordne den kartlagte verdien til sfærens x-posisjon transform.position = ny Vector3 (mappedPot, transform.position.y, transform.position.z);
Lagre skriptet ditt, gå tilbake til Unity-editoren og trykk på spill. Du bør nå kunne bevege sfæren til venstre og høyre ved hjelp av potensiometeret!
Setter knappen i gang
Nå som vi har vår kule i bevegelse, ville det ikke vært fint å ha en måte å bremse opp litt når vi kommer i et stramt sted? Vi skal bruke vår knapp for å redusere tiden i spillet vårt. Åpne ditt sphereMover-skript, og legg til denne koden i oppdateringsfunksjonen
// Hvis Unity oppdager at knappen trykkes, setter tidsskalaen ned hvis (arduino.digitalRead (buttonPinNumber) == 1) Time.timeScale = 0.4f; ellers Time.timeScale = 1.0f;
Nå har vi mekanikken i spillet vårt, la oss legge til noen hindringer! Vi skal bruke den naturlige fienden av sfæren, terningen. I hierarkiet klikker du Lag> 3d objekt> terning. I kubens inspektør, Legg til komponent> Fysikk> Rigidbody. Angi Drag-verdien til den stive leggen til 5. I tillegg, under Box Collider-komponenten i inspektøren, velg Is Trigger. Dette vil tillate oss å oppdage kollisjoner med vårt kule.
Lag et skript på kuben og ring det collideWithSphere, åpne skriptet og slett Start- og oppdateringsfunksjonene, da vi ikke trenger dem denne gangen. Skriv inn denne koden:
bruker UnityEngine; bruker System.Collections; offentlig klasse kolliderer medSfære: MonoBehaviour void OnTriggerEnter (Collider andre) Destroy (other.gameObject);
OnTriggerEnter sender en melding når utløser collider treffer en annen collider. I dette tilfellet forteller vi det for å ødelegge hva det berører. Lagre skriptet og hodet tilbake til Unity-editoren. Dra kuben fra hierarkiet til prosjektpanelet. Du vil merke at kubens tekst i hierarkiet har blitt blå. Dette er fordi vi har laget en prefab og lagret den i prosjektet vårt. Slett kuben din fra hierarkiet nå.
Alt vi trenger nå er et skript for å gyte kubene. I hierarkiet klikker du Lag> Lag tom, og omdø det til spillleder i inspektøren og legg til et skript for det som heter gameManager. Åpne skriptet og legg til denne koden:
bruker UnityEngine; bruker System.Collections; offentlig klasse gameManager: MonoBehaviour // en variabel for å holde prefaben vi ønsker å gyte offentlig GameObject kube; // vi vil ha noen variabler til å bestemme hvordan noen kuber skal gyte // og hvor høyt over oss vi vil at de skal gyte offentlige int numberToSpwan; offentlig float lowestSpawnheight; offentlig float highestSpawnheight; // Bruk dette for initialisering tomt Start () for (int i = 0; i < numberToSpwan; i++) Instantiate(cube, new Vector3(Random.Range(-9, 9), Random.Range(lowestSpawnheight, highestSpawnheight), 0), Quaternion.identity); // Update is called once per frame void Update ()
Lagre skriptet. Tilbake i redigeringsprogrammet, velg spilleleder i hierarkiet, og dra kuben prefab fra prosjektpanelet til kubevariabelen i inspektøren. Fyll ut verdiene for gytingen din her også. Du kan fla med det for å gjøre det så vanskelig eller enkelt som du vil. Vær oppmerksom på at det er verdt å ha de laveste kubene hekket høyt nok til at Uniduino kan initialisere - å miste spillet før du er i stand til å flytte, kan være frustrerende!
Det ferdige prosjektet
Nå når du trykker på lekene, vil kubene gyte over deg og falle. Du kan bruke potensiometeret for å unngå dem, og knappen for å senke tiden.
I dette prosjektet har vi opprettet en tilpasset kontroller med en Arduino, konfigurert Unity og Uniduino for å kommunisere med det, og laget et enkelt spill for å teste det ut. Konseptene her kan brukes til nesten alle prosjekter, og det er jevn spillestopp som spesialiserer seg på tilpassede kontroller.
Med Arduino og Unity kan du lage en tilpasset kontroller fra nesten alt. Har du laget en hi-fi som styrer et romfartøy? En brødrister som styrer et plattformspill?
Hvis du har laget et prosjekt som dette, vil jeg gjerne se det! Legg det inn i kommentarene nedenfor!
Utforsk mer om: Arduino, spillkontroller, spillutvikling, programmering.