Hvordan lage en tilpasset spillkontroll med Arduino og Unity

Har du noen gang ønsket å designe din egen spillkontroller? Det er lettere enn du tror!

Har du noen gang ønsket å designe din egen spillkontroller?  Det er lettere enn du tror!
Annonse

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.

Tilpasset Controller Breadboard 670

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å!

Fritzing Diagram annotert

Forbereder Arduino

Når du har alt koblet til, må du koble din Arduino via USB. I Arduino Software IDE hodet til Verktøy> Styr 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 nybegynners guide. Komme i gang med Arduino: En nybegynnersveiledning Komme i gang med Arduino: En nybegynnerveiledning Arduino er en open source 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 for å 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 rundt.

Unity Asset Store Uniduino

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!

Uniduino Test

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 der målet ditt er å unnslippe sfæren din til venstre og høyre for å unngå fallende kuber, som vil benytte din nyopprettede tilpassede kontroller.

Opprett en ny scene og dra Uniduino prefab fra Assets> Uniduino> Prefabs i din hierachy og dra Uniduino prefab i hierarkiet. Vi trenger det der for å snakke mellom vårt spill og kontrolleren.

I enhetshierarkiet klikker du Opprett> Kule og bruk Transform-fanen i Inspektøren for å flytte den til bunnen av spillskjermbildet.

Inspektør Sphere X Posisjon

Det er på tide å få koding

Nå for å legge til noen koden til denne festen. Med kuglen valgt i hierarkiet, klikker du på Legg til komponent> Nytt skript nederst i det inspeksjonsvinduet. Navngi det sphereMover og velg C Sharp fra rullegardinmenyen. Klikk på Opprett og legg til, og skriptet blir lagt til GameObject. Dobbeltklikk på den for å åpne skriptet og skriv inn denne koden:

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

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.

Sphere Mover Script With Empty Variables

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å.

Sphere Mover Script With Variables

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.

 void Update () { //We assign the value the arduino is reading from our potentionmeter to our potValue variable 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.

Uniduino Check Port er riktig

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.

Tegn på livet 2

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 posisjoneringsvektoren 9, 5, -4, 0.

Transform Eksempel 670

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årt sphereMover- skript. Øverst på prosjektpanelet klikker du Opprett> C # Script og navngi det ExtensionMethods. Skriv inn koden under i skriptet:

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

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:

Remap-funksjon

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.

Mapped Pot

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:

Bytt omlasting

Nå har vi endelig brukbare verdier. Nå er alt som er igjen å gjøre, å tildele disse verdiene til sfærens X-posisjon:

 //Assign the mapped pot value to the sphere's x position transform.position = new 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 din sfære til venstre og høyre ved hjelp av potensiometeret ditt!

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

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

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 Opprett> 3d objekt> terning . I kubens inspektør legger du 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.

Opprett et skript på kuben og ring det kolliderer medWithSphere, åpne skriptet og slett Start- og oppdateringsfunksjonene, siden vi ikke trenger dem denne gangen. Skriv inn denne koden:

 using UnityEngine; using System.Collections; public class collideWithSphere : MonoBehaviour { void OnTriggerEnter(Collider other) { 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 Opprett> Opprett tomt og omdøper det til Game Manager i inspektøren og legger til et skript for det som heter gameManager. Åpne skriptet og legg til denne koden:

 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< 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!

Game Manager

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!

In this article