Hur man gör en anpassad spelkontroll med Arduino och Unity

Hur man gör en anpassad spelkontroll med Arduino och Unity / DIY

Har du någonsin velat designa din egen spelkontroll? Det är lättare än du tror!

I det här korta projektet kommer vi att bygga en enkel anpassad spelkontroll för användning med Unity-spelmotorn. Denna styrenhet kommer att drivas av en Arduino Uno, men du kan använda ett av de många alternativen Arduino Buying Guide: Vilken styrelse ska du få? Arduino Köpguide: Vilket styrelse ska du få? Det finns så många olika typer av Arduino brädor där ute, du skulle bli förlåtad för att vara förvirrad. Vilket ska du köpa för ditt projekt? Låt oss hjälpa till med den här Arduino-köpguiden! Läs mer där ute för detta projekt också. Vi kommer också att skapa ett grundläggande spel där du kommer att använda din kontroller för att undvika att falla objekt och sakta ner tiden.

För det här projektet behöver du

  • Arduino eller liknande mikrokontroller
  • 1 x 10k ohm motstånd
  • 1 x Moment switch
  • 1 x Potentiometer
  • Hook-up-ledningar
  • En brödbräda
  • Unity spelmotor
  • Uniduino-plugin från Unity Asset Store ($ 30)
  • Komplett projektkod, om du inte vill skriva ut det (innehåller inte Uniduino-plugin)

De flesta av dessa saker finns i ett Arduino startpaket. Om du inte har en startpaket, kolla in vår guide för att välja de bästa 4 bästa nybörjarsatserna för Arduino Beginners 4 Bästa Startpaket för Arduino Nybörjare Det finns många fantastiska nybörjare Arduino-projekt som du kan använda för att komma igång, men du kommer behöver en Arduino och några komponenter först. Här är vårt val av 4 av de bästa startpaket för ... Läs mer en för dig.

Du kan göra din kontroller så komplicerad som du vill, men för det här exemplet kommer vi att ställa in en potentiometer och en knapp - perfekt för att styra ett enkelt arkadespel.

Montering av din controller

Ställ in ditt brödbräda och Arduino enligt bilden nedan. Det här är vad vi ska använda som vår spelkontroll, även om du kan använda nästan exakt samma inställning som en DIY midi-controller. Hur man gör en MIDI-kontroller med en Arduino Hur man gör en MIDI-kontroller med en Arduino Som en musiker som har samlat en samling av musikinstrument och ljudlådor, är den ödmjuka Arduino det perfekta verktyget för att skapa en anpassad MIDI-kontroller. Läs mer också!

Förbereder din Arduino

När du har allt anslutet, anslut din Arduino via USB. I Arduino Software IDE huvudet till Verktyg> Styrelse och Verktyg> Port för att välja vilken mikrokontroller och port du använder. Arduino IDE kommer med den skiss vi behöver, och du kan hitta den under Arkiv> Exempel> Firmata> StandardFirmata. Klicka på Ladda upp och du är redo att gå.

Om du är ny på Arduino och ditt huvud smälter något, kolla in vår nybörjarguide. Komma igång med Arduino: En nybörjarhandbok Komma igång med Arduino: En nybörjarhandbok Arduino är en öppen källkods elektronik prototypplattform baserad på flexibel, lätt att använd hårdvara och programvara. Den är avsedd för artister, designers, hobbyister och alla som är intresserade av att skapa interaktiva objekt eller miljöer. Läs mer för att hjälpa dig att prata med datorn snyggt.

Ställa in ditt enhetsprojekt

I enhet, öppna Fönster> Asset Store att få tillgång till Unitys Asset Store från Unity Editor. Sök i Asset Store för Uniduino-plugin. Med denna plugin kan du ta emot och skicka data till och från dina Arduino-stift inom Unity. Plugin vid skrivetid kostar $ 30. Det är möjligt att göra detta projekt utan att köpa plugin, men det är ganska mer komplicerat och du kan hitta pluggen bekvämare runt.

Den här videon från skaparna av plugin tar dig genom processen att testa allt som fungerar, tillsammans med första gångsinstallationen. Observera att du kanske måste återställa Unity-redigeraren på Windows.

Vi kan använda samma testpanel för att testa vår controller. Ställ in Pin D2 till INPUT och Digital. Vidare ner, ställa in Pin A5 till ANALOG. Din potentiometer och knapp borde visa värden på skärmen bredvid deras pinnummer nu. Framsteg!

Nu för att göra något vi kan kontrollera

Så vi har en kontroller, men vad ska vi kontrollera? Tja, möjligheterna är oändliga, men för idag ska vi skapa ett mycket enkelt dodging-spel för att testa vårt nya styrsystem. Vi kommer att flytta över spelet setup ganska snabbt, så om du är helt ny på Unity-motorn kan du hitta vår Unity Game Programmering Beginners Guide Programmering av ett spel med enhet: En nybörjarguide Programmering av ett spel med enhet: En nybörjarguide i den utvecklande Unity har uppstått som något av en de facto-standard: den låga kostnaden, användarvänligheten och den breda funktionen gör den idealisk för snabb spelutveckling. Läs mer användbart för att få dina lager.

Vi kommer att bygga ett mycket grundläggande spel där ditt mål är att undvika din sfär till vänster och höger för att undvika fallande kuber, som kommer att utnyttja din nyanpassade anpassade kontroller.

Skapa en ny scen och dra Uniduino prefab från Tillgångar> Uniduino> Prefabs in i din hierachi och dra Uniduino prefab i hierarkin. Vi behöver det där för att prata mellan vårt spel och regulatorn.

Klicka på Unity hierarchy Skapa> Sfär och använd fliken Transform i inspektören för att flytta den till botten av spelskärmen.

Det är dags att få kodning

Nu för att lägga till en kod till den här festen. Med den sfär som valts i hierarkin klickar du på Lägg till komponent> New Script längst ner på det är inspektionsfönstret. Namnge det sphereMover och välj Ciss från rullgardinsmenyn. Klick Skapa och lägg till och manuset läggs till i GameObject. Dubbelklicka på den för att öppna skriptet och ange den här koden:

använder UnityEngine; Använda System.Collections; använder Uniduino; public class sphereMover: MonoBehaviour // Headers är inte absolut nödvändiga, men de gör livet enklare tillbaka i inspektören. [Header ("Arduino Variables")] // Vi måste förklara Arduino som en variabel offentlig Arduino Arduino; // vi måste förklara ett heltal för pinnumret för vår potentiometer, // göra dessa variabler offentliga, så att vi kan ändra dem i redigeraren senare // om vi ändrar layouten på vår arduino public int potPinNumber; // en flytningsvariabel för att hålla potentiometervärdet (0 - 1023) public float potValue; // vi kommer senare omhänderta den potValue till y-positionen för vår kapsel och hålla den i den här variabla offentliga float mappedPot; // public int för vår knapp pin public int buttonPinNumber; [Header ("Sphere Variables")] // variabler för att hålla de värden som vi noterade tidigare för sidorna på vår skärm public float leftEdge; offentlig float rightEdge; // Använd det här för initialisering tomt Start () // och initiera vi ska, från och med Arduino Variable. // vi använder bara en arduino, så vi kan använda Arduino.global för att ta tag i det. arduino = Arduino.global; arduino.Setup (ConfigurePins);  void ConfigurePins () // konfigurera Arduino-stiftet för att vara analog för vår potentiometer arduino.pinMode (potPinNumber, PinMode.ANALOG); // Berätta för Arduino att anmäla eventuella förändringar i värdet av vår potentiometer arduino.reportAnalog (5, 1); // konfigurera vår knappstift arduino.pinMode (buttonPinNumber, PinMode.INPUT); arduino.reportDigital ((byte) (buttonPinNumber / 8), 1); 

Ta en stund att läsa igenom koden kommentarer. Hittills har vi förklarat några variabler för våra Arduino, dess pinnar och vår sfär. Vi har också använt
Starta och konfigureraPins metoder för att initiera vår Arduino på körtid. Låt oss spara vårt skript och gå tillbaka till Unity-redigeraren och se vad som ändrats.

Vi kan nu se våra offentliga variabler i inspektionsfönstret. Låt oss se vad vi kan komma in på detta stadium för att hjälpa oss senare. Vi vet vilken stift vi använder på Arduino från vår bygg tidigare, vi kan komma in i dem. Vi vet också från vårt experiment tidigare hur långt vi vill att vår sfär ska kunna resa till vänster och höger så att den inte faller av skärmen. Låt oss ange dessa värden nu.

Första tecken på livet

Det är dags att faktiskt se värden från vår Arduino inom Unity Editor. För närvarande kan vi lägga till en rad kod till vår sphereMover-skript Update-funktion och spara skriptet igen.

void Update () // Vi tilldelar det värde som arduino läser från vår potentitetsmätare till vår potValue-variabel potValue = arduino.analogRead (potPinNumber);  

Nu när vi har uppdaterat vår potValue-variabel varje ram kan vi se värdet i realtid i Unity Inspector. Innan vi ger det ett test, skulle det nu vara en bra tid att kontrollera att Uniduino-pluggen lyssnar på rätt port. Klicka på Uniduino i Heirarchy och kontrollera att det är Portnamn i inspektören. Om det är tomt, fyll i rätt portnummer för din Arduino. I det här fallet var det COM4, ​​men det kan vara annorlunda för dig. Kontrollera med Arduino IDE om du inte är säker.

Välj din sfär i hierarkin och klicka på knappen Spela upp längst upp på skärmen. Systemet behöver några sekunder att initialisera, varefter du bör börja se förändringen av Pot Value variant i inspektören när du flyttar potentiometern.

Nu snackar vi! Tja, strikt talar enighet och Arduino, men vem räknar? Om du har det här långt och inte ser värdeförändringen i inspektören, kolla över installationsstegen och se till att du har rätt port vald för din Arduino.

Låt oss flytta den här sfären

Nu när vi har uppdaterat potValue-variabeln vill vi använda detta värde för att flytta vår sfär. När potentiometern är helt till vänster vill vi att sfären ska ligga på vänster sida av skärmen och vice versa. Objekt i enhet är placerade vid en punkt i vektorutrymmet, bestämt av värdena för det är Transform.position. I bilden nedan, där sfären ligger längst till vänster skulle vi vilja ha det, kan du se att det är positionsvektorn är 9,5, -4, 0.

Vi vill påverka sfärens X-position. Tyvärr använder vi inte värdena från vår potentiometer direkt, eftersom potentiometern ligger helt till vänster ger det ett värde på 0 - vilket skulle sätta vår sfär rätt i mitten av skärmen. På andra sidan skulle potentiometerns högsta värde, 1023, placera kuben långt bort till höger om vår skärm. Ej användbar. Vad vi behöver här är lite matte.

Varför matta när enighet kommer att göra det för dig?

För de av er där ute stirrar du på ett papper som är täckt av oanständiga nummer (även om det finns några bra webbplatser De 20 webbplatser du behöver lära dig matematik steg för steg De 20 webbplatser du behöver lära dig matematik steg för steg Vi har sammanställt bästa webbplatser för varje nivå så att du kan lära dig systematiskt, få bättre grepp om matematik en nivå åt gången och ha kul! Läs mer som kan hjälpa dig att lära dig matematik), rädd inte. Vi behöver ett sätt att göra våra potentiometervärden motsvarar vår sfärens X-position. Lyckligtvis kan vi använda en Förlängningsmetod.

En förlängningsmetod är ett manus som gör ett specifikt jobb för oss. I det här fallet ger vi det värdet vi har, och det returnerar dem mappade till en annan, redo att användas i vår sphereMover manus. Överst på Projektpanelen klickar du på Skapa> C # Script och namnge det ExtensionMethods. Ange koden nedan i skriptet:

använder UnityEngine; Använda System.Collections; offentliga statiska klassen ExtensionMethods // vår praktiska dandy Remapper funktion offentlig statisk float Remap (detta float värde, float from1, float to1, float from2, float to2) return (value - from1) / (to1 - from1) * (to2 - från2) + från2; 

Spara skriptet och gå tillbaka till ditt sphereMover-skript. Vi kan nu använda denna Remap-funktion i vårt ExtensionMethods-skript i vår uppdateringsfunktion för att konvertera våra potentiometervärden till användbara värden i vårt spel. Under var vi bara tilldelade potValue-variabeln skriver du följande:

Prompten visar oss att vår Remap tar två uppsättningar av från och till värden och kartlägger dem tillsammans. Vi kan ange våra värden i detta.

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

Spara ditt skript, gå tillbaka till Unity-redigeraren och tryck på uppspelningsknappen. Du bör nu se att variabeln Mapped Pot ändras när du flyttar potentiometern, för att motsvara de värden vi bestämde för våra vänstra och högra kanter. Ta en stund att luta dig tillbaka och tacka ditt ExtensionMethods-skript. Inte en räknare i sikte.

Obs! Om du märker att dina värden är omvända, så när din potentiometer är helt åt höger får du ett negativt värde för din Mapped Pot-variabel, du kan få din potentiometer att ställa in fel väg. Lyckligtvis kan du fixa det här utan att göra någon omkoppling. Du kan helt enkelt byta värden när du remapar dem:

Nu har vi äntligen användbara värden. Nu är allt som är kvar att göra, att tilldela dessa värden till sfärens X-position:

// Tilldela det kartlagda pottvärdet till sfärens x-position transform.position = ny Vector3 (mappedPot, transform.position.y, transform.position.z);

Spara ditt skript, gå tillbaka till Unity-redigeraren och tryck på spela. Du borde nu kunna flytta din sfär till vänster och höger med din potentiometer!

Knappen på jobbet

Nu när vi har sfären i rörelse, skulle det inte vara trevligt att få ett sätt att sakta ner lite när vi kommer i en stram plats? Vi ska använda vår knapp för att sakta ner tiden i vårt spel. Öppna ditt sphereMover-skript och lägg till den här koden i din uppdateringsfunktion

// Om Unity upptäcker att knappen trycks ned slocknar tidsskalan om (arduino.digitalRead (buttonPinNumber) == 1) Time.timeScale = 0.4f;  annat Time.timeScale = 1.0f;

Nu har vi mekaniken i vårt spel, låt oss lägga till några hinder! Vi ska använda den naturliga fienden i sfären, kuben. I hierarkin klickar du på Skapa> 3d objekt> kub. I kubens inspektör, Lägg till komponent> Fysik> Rigidbody. Ställ in Drag-värdet på den styva kroppen till 5. Välj även Is Trigger under komponenten Box Collider i inspektören. Detta gör det möjligt för oss att upptäcka kollisioner med vår sfär.

Skapa ett manus på kuben och ring det collideWithSphere, öppna skriptet och ta bort start- och uppdateringsfunktionerna eftersom vi inte behöver dem den här gången. Ange denna kod:

använder UnityEngine; Använda System.Collections; offentliga klassen kolliderar medSfären: MonoBehaviour void OnTriggerEnter (Collider andra) Destroy (other.gameObject); 

OnTriggerEnter skickar ett meddelande när triggerkolliden träffar en annan collider. I det här fallet säger vi att det förstör vad det än berör. Spara skriptet och gå tillbaka till Unity-redigeraren. Dra kuben från hierarkin till projektpanelen. Du kommer märka texten i kuben i hierarkin har blivit blå. Detta beror på att vi har skapat en prefab och sparat det i vårt projekt. Ta bort din kub från hierarkin nu.

Allt vi behöver nu är ett manus för att gräva kuberna. Klicka här i hierarkin Skapa> Skapa tom, och byt namn på det till Game Manager i inspektören och lägg till ett skript till det som heter gameManager. Öppna skriptet och lägg till den här koden:

använder UnityEngine; Använda System.Collections; public class gameManager: MonoBehaviour // en variabel för att hålla prefaben vi vill gissa offentliga GameObject kub; // Vi vill att vissa variabler ska bestämma hur några kuber ska gyta // och hur högt ovanför oss vi vill att de ska gissa offentliga int numberToSpwan; offentliga float lowestSpawnheight; offentlig float highestSpawnheight; // Använd detta för initialisering tomt Start () för (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 ()   

Spara skriptet. Tillbaka i redigeraren, välj spelhanteraren i hierarkin och dra din kub prefabrik från projektpanelen till kub variabeln i inspektören. Fyll i värdena för din gytning här också. Du kan fitta med det för att göra det så svårt eller enkelt som du vill. Observera att det är värt att ha dina lägsta kuber krukas tillräckligt högt för att Uniduino ska kunna initiera - förlora spelet innan du kan flytta kan vara frustrerande!

Det färdiga projektet

Nu när du trycker på spelar kuberna över dig och faller. Du kan använda din potentiometer för att undvika dem och din knapp för att sakta ner tiden.

I det här projektet har vi skapat en anpassad controller med en Arduino, konfigurerad Unity och Uniduino att kommunicera med det och skapade ett enkelt spel för att testa det. Begreppen här kan tillämpas på nästan vilket som helst projekt, och det finns även jamsystem som specialiserar sig i anpassade kontroller.

Med Arduino och Unity kan du skapa en anpassad controller från nästan vad som helst. Har du skapat en hi-fi som styr en rymdfarkost? En brödrost som styr ett plattformsspel?

Om du har gjort ett projekt så här skulle jag gärna se det! Posta det i kommentarerna nedan!

Utforska mer om: Arduino, spelkontroll, spelutveckling, programmering.