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

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

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

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 detta exempel kommer vi att ställa in en potentiometer och en knapp - perfekt för att styra ett enkelt arkadespel.

Custom Controller Breadboard 670

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

Fritzing Diagram Antecknat

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

Öppna Unity, öppna fönstret> Asset Store för att komma åt 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 runtom.

Unity Asset Store Uniduino

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!

Uniduino-test

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 nyanställda anpassade kontroller.

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

I Unity-hierarkin klickar du på Skapa> Sphere och använder Transform-fliken i inspektören för att flytta den till botten av spelskärmen.

Inspektör Sphere X Position

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> Nytt skript längst ner i inspektionsfönstret. Namnge det sphereMover och välj C Sharp från rullgardinsmenyn. Klicka på Skapa och lägg till och skriptet läggs till i GameObject. Dubbelklicka på den för att öppna skriptet och ange den här 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 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.

Sphere Mover Script With Empty Variables

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.

Sphere Mover Script With Variables

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

Uniduino Check Port är korrekt

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.

Tecken på livet 2

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 dess positionsvektor är 9, 5, -4, 0.

Transformera exempel 670

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 gör mat 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 varandra, redo att användas i vårt sphereMover- skript. Överst på Projektpanelen klickar du på Skapa> C # Script och heter det ExtensionMethods. Ange koden nedan 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; } } 

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 omvandla våra potentiometervärden till användbara värden i vårt spel. Under var vi bara tilldelade potValue-variabeln skriver du följande:

Remap-funktion

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. Nu bör du 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.

Mappad kruka

Obs! Om du märker att dina värden är omvända, så när din potentiometer är helt till 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:

Byt omhändertagning

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:

 //Assign the mapped pot value to the sphere's x position transform.position = new 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

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

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> Cube . 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 skript på kuben och kalla det collideWithSphere, öppna skriptet och ta bort start- och uppdateringsfunktionerna eftersom vi inte behöver dem den här gången. Ange denna kod:

 using UnityEngine; using System.Collections; public class collideWithSphere : MonoBehaviour { void OnTriggerEnter(Collider other) { 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. I hierarkin klickar du på Skapa> Skapa tomt och byter namn på det till Spelhanteraren i inspektören och lägger till ett skript till det som heter gameManager. Öppna skriptet och lägg till den här 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 () { } } 

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 skörd tillräckligt högt för att tillåta Uniduino att initialisera - förlora spelet innan du kan flytta kan vara frustrerande!

Spelhanterare

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!

In this article