Sådan oprettes en brugerdefineret spilkontroller med Arduino og enhed

  • Michael Cain
  • 0
  • 5281
  • 1244
Reklame

Har du nogensinde ønsket at designe din egen spilcontroller? Det er lettere, end du tror!

I dette korte projekt bygger vi en enkel brugerdefineret spilcontroller til brug sammen med Unity-spillemotoren. Denne controller drives af en Arduino Uno, skønt du kunne bruge et af de mange alternativer Arduino Buying Guide: Hvilket bord skal du få? Arduino Købsvejledning: Hvilket bord skal du få? Der er så mange forskellige slags Arduino-tavler derude, du vil blive tilgitt for at blive forvirret. Hvilket skal du købe til dit projekt? Lad os hjælpe med denne Arduino-købsguide! derude til dette projekt også. Vi vil også oprette et grundlæggende spil, hvor du vil bruge din controller til at undgå faldende genstande og bremse tiden.

Til dette projekt har du brug for

  • Arduino eller lignende mikrokontroller
  • 1 x 10 k Ohm-modstand
  • 1 x Momentant switch
  • 1 x potentiometer
  • Tilslutningsledninger
  • En brødbræt
  • Enhedsspilmotor
  • Uniduino-pluginet fra Unity Asset Store ($ 30)
  • Fuldfør projektkoden, i tilfælde af at du ikke ønsker at skrive den ud (inkluderer ikke Uniduino-pluginet)

De fleste af disse ting fås i et Arduino-startkit. Hvis du ikke har et startkit, så tjek vores guide til at vælge de bedste 4 bedste startesæt til Arduino begyndere 4 bedste startkits til Arduino begyndere Der er masser af gode begyndere Arduino projekter, som du kan bruge til at komme i gang, men du vil har brug for en Arduino og nogle komponenter først. Her er vores valg af 4 af de bedste starter sæt til ... en til dig.

Du kan gøre din controller så kompliceret som du ønsker, selvom vi til dette eksempel opretter et potentiometer og en knap - perfekt til styring af et enkelt arkadespil.

Montering af din controller

Opsæt din brødbræt og Arduino som vist på billedet herunder. Dette vil vi bruge som vores spilcontroller, selvom du kunne bruge næsten den samme opsætning som en DIY midi-controller Hvordan man laver en MIDI-controller med en Arduino Sådan oprettes en MIDI-controller med en Arduino Som musiker, der har samlet en ydelse af musikinstrumenter og støjbokse, den ydmyge Arduino er det perfekte værktøj til at skabe en brugerdefineret MIDI-controller. også!

Forbered din Arduino

Når du har tilsluttet alt, skal du slutte din Arduino via USB. I Arduino Software skal IDE gå til Værktøjer> Tavle og Værktøjer> Port for at vælge, hvilken mikrokontroller og port du bruger. Arduino IDE leveres sammen med den skitse, vi har brug for, og du kan finde den under Fil> Eksempler> Firmata> StandardFirmata. Klik på Upload, så er du klar til at gå.

Hvis du er ny med Arduino, og dit hoved smelter lidt, så tjek vores Begyndersvejledning Kom godt i gang med Arduino: En begynderguide Kom godt i gang med Arduino: En begynderguide Arduino er en open source-elektronik-prototype-platform baseret på fleksibel, let at håndtere bruge hardware og software. Det er beregnet til kunstnere, designere, hobbyister og enhver der er interesseret i at skabe interaktive objekter eller miljøer. for at hjælpe dig med at få det til at tale med din computer pænt.

Opsætning af dit enhedsprojekt

Åbn i Enhed Vindue> Asset Store for at få adgang til Unitys Asset Store fra Unity Editor. Søg i Asset Store efter Uniduino-pluginet. Dette plugin giver dig mulighed for at modtage og sende data til og fra dine Arduino-stifter i Unity. Plugin i skrivende stund koster $ 30. Det er muligt at gøre dette projekt uden at købe plugin, skønt det er temmelig mere kompliceret, og du kan synes, at plugin er mere praktisk hele vejen rundt.

Denne video fra skaberne af plugin fører dig gennem processen med at teste alt fungerer, sammen med første gangs opsætning. Bemærk, at du muligvis også bliver nødt til at nulstille Unity-redigereren på Windows.

Vi kan bruge det samme testpanel til at teste vores controller. Indstil Pin D2 til INPUT og Digital. Længere nede skal du indstille Pin A5 til ANALOG. Dit potentiometer og knap skal vise værdier på skærmen ved siden af ​​deres pin-numre nu. Fremskridt!

Nu for at lave noget, vi kan kontrollere

Så vi har en controller, men hvad skal vi kontrollere? Nå, mulighederne er uendelige, men for i dag skal vi skabe et meget simpelt dodging-spil til at teste vores nye kontrolsystem. Vi vil gå hurtigt igennem spilopsætningen, så hvis du er helt ny i Unity-motoren, kan du muligvis finde vores Unity Game-programmering Begyndersvejledning Programmering af et spil med Unity: En begynderguide Programmering af et game with Unity: En begyndersvejledning under udvikling landskab med indie-spiludvikling, har Unity fremstået som noget af en de-facto-standard: dens lave omkostninger, brugervenlighed og brede funktionssæt gør det ideelt til hurtig spiludvikling. nyttigt at få dine kuglelejer.

Vi vil opbygge et meget grundlæggende spil, hvor dit mål er at undvige din sfære til venstre og højre for at undgå at falde terninger, som vil bruge din nyligt lavede tilpassede controller.

Opret en ny scene, og træk Uniduino-præfabriket fra Aktiver> Uniduino> Præfabs ind i din hierachy og træk Uniduino-præfabriket ind i hierarkiet. Vi har brug for det der for at tale mellem vores spil og controller.

Klik på Unity-hierarkiet Opret> Kugle og brug fanen Transform i inspektøren for at flytte den til bunden af ​​spilleskærmen.

Det er tid til at få kodning

Nu for at tilføje nogle kode til denne fest. Klik på knappen med den sfære, der er valgt i hierarkiet Tilføj komponent> Ny script nederst i dets inspektionsvindue. Navn det sphereMover og vælg C Skarp fra rullemenuen. Klik Opret og tilføj og scriptet tilføjes til GameObject. Dobbeltklik på det for at åbne scriptet og indtast denne kode:

ved hjælp af UnityEngine; ved hjælp af System.Collections; ved hjælp af Uniduino; offentlig klasse sfæreMover: MonoBehaviour // Headers er ikke nøje nødvendige, men de gør livet lettere i inspektøren. [Header ("Arduino Variables")] // Vi er nødt til at erklære Arduino som en variabel offentlig Arduino arduino; // vi er nødt til at erklære et heltal for pin-nummeret på vores potentiometer, // at gøre disse variabler offentlige betyder, at vi kan ændre dem i redigeringsprogrammet senere // hvis vi ændrer layoutet på vores arduino public int potPinNumber; // en floatvariabel til at holde potentiometerværdien (0 - 1023) offentlig float potValue; // vi senere vil omforme denne potValue til y-kapslingen af ​​vores kapsel og holde den i denne variable offentlige float mappedPot; // offentlig int til vores knapnåle offentlig int-knapPinNummer; [Header ("Kuglevariabler")] // variabler for at indeholde de værdier, vi har noteret tidligere for siderne af vores skærm public float leftEdge; public float rightEdge; // Brug dette til initialisering ugyldig Start () // og initialiser vi skal, startende med Arduino-variablen. // vi bruger kun en arduino, så vi kan bruge Arduino.global til at gribe den. arduino = Arduino.global; arduino.Setup (ConfigurePins);  ugyldigt ConfigurePins () // konfigurer Arduino-tappen til at være analog til vores potentiometer arduino.pinMode (potPinNumber, PinMode.ANALOG); // Bed Arduino om at rapportere eventuelle ændringer i værdien af ​​vores potentiometer arduino.reportAnalog (5, 1); // konfigurere vores Button pin arduino.pinMode (buttonPinNumber, PinMode.INPUT); arduino.reportDigital ((byte) (buttonPinNumber / 8), 1); 

Brug et øjeblik på at læse kodekommentarer. Indtil videre har vi erklæret nogle variabler for vores Arduino, dens stifter og vores sfære. Vi har også brugt
Start og ConfigurePins metoder til at initialisere vores Arduino under kørselstid. Lad os gemme vores script og gå tilbage til Unity-editoren og se, hvad der er ændret.

Vi kan nu se vores offentlige variabler i Inspector-vinduet. Lad os se, hvad vi kan komme ind på dette tidspunkt for at hjælpe os senere. Vi ved, hvilke pin vi bruger på Arduino fra vores build tidligere, vi kan komme ind i dem. Vi ved også fra vores eksperiment tidligere, hvor langt vi ønsker, at vores sfære skal kunne rejse til venstre og højre, så det ikke falder af skærmen. Lad os indtaste disse værdier nu.

Første tegn på livet

Det er tid til faktisk at se værdier fra vores Arduino inde i Unity Editor. Foreløbigt kan vi tilføje en kodelinje til vores sphereMover-scriptets opdateringsfunktion og gemme scriptet igen.

void Update () // Vi tildeler den værdi, arduino læser fra vores potentialmeter til vores potValue-variabel potValue = arduino.analogRead (potPinNumber);  

Nu, hvor vi har vores potValue-variabel, der opdateres hver ramme, kan vi se, at det er værdi i realtid i Unity Inspector. Inden vi tester det, ville det nu være et godt tidspunkt at tjekke, at Uniduino-stikket lytter til den rigtige port. Klik på Uniduino i Heirarchy, og kontroller, at det er Portnavn i inspektøren. Hvis det er tomt, skal du udfylde det rigtige portnummer til din Arduino. I dette tilfælde var det COM4, ​​skønt det kan være anderledes for dig. Tjek ved hjælp af Arduino IDE, hvis du ikke er sikker.

Vælg din sfære i hierarkiet, og klik på knappen Afspil øverst på skærmen. Systemet har brug for et par sekunder til initialisering, hvorefter du skal begynde at se Pot Value-variablen ændre sig i inspektøren, når du flytter potentiometeret.

Nu taler vi! Nå, absolut snakker Unity og Arduino, men hvem tæller? Hvis du er nået så langt og ikke ser værdien ændres i inspektøren, skal du kontrollere installationstrinnene og sørge for, at du har valgt den rigtige port til din Arduino.

Lad os flytte denne sfære

Nu, hvor vi har variablen PotValue, der bliver opdateret, ønsker vi at bruge denne værdi til at flytte vores sfære. Når potentiometeret er helt til venstre, ønsker vi, at kuglen skal være på venstre side af skærmen, og vice versa. Objekter i enhed er placeret på et punkt i vektorrum, bestemt af værdierne i dets Transform.position. I nedenstående billede, hvor sfæren er på det længste punkt til venstre, vi ønsker det, kan du se, at dets positionsvektor er 9,5, -4, 0.

Vi ønsker at påvirke kuglens X-position. Desværre vil brug af værdierne fra vores potentiometer direkte ikke fungere, da når potentiometeret er helt til venstre, giver det en værdi på 0 - hvilket vil sætte vores sfære lige i midten af ​​skærmen. I det andet ekstreme ville potentiometerets øverste værdi, 1023, placere terningen væk til højre for vores skærm. Ikke nyttigt. Hvad vi har brug for her er noget matematik.

Hvorfor laver matematik, når enhed gør det for dig?

For dem af jer derude, der gruer sig til at stirre på et stykke papir, der er dækket af ikke-sensiske tal (selvom der er nogle gode websteder. De 20 websteder, du har brug for at lære matematik trin for trin. De 20 websteder, du har brug for at lære matematik, trin for trin. Vi har samlet bedste sider til hvert niveau, så du kan lære systematisk, få et bedre greb om matematik et niveau ad gangen og have det sjovt! som kan hjælpe dig med at lære matematik), frygt ikke. Vi har brug for en måde at gøre vores potentiometerværdier til at svare til vores sfære X position. Heldigvis kan vi bruge en Udvidelsesmetode.

En udvidelsesmetode er et script, der gør et specifikt job for os. I dette tilfælde giver vi det de værdier, vi har, og det returnerer dem, der er kortlagt til hinanden, klar til brug i vores sphereMover manuskript. Klik på knappen øverst på projektpanelet Opret> C # script og navng den ExtensionMethods. Indtast koden herunder i scriptet:

ved hjælp af UnityEngine; ved hjælp af System.Collections; public static class ExtensionMethods // vores praktiske dandy Remapper-funktion public static float Remap (denne floatværdi, float from1, float to1, float from2, float to2) return (værdi - fra1) / (to1 - from1) * (to2 - fra2) + fra2; 

Gem scriptet, og gå tilbage til dit sfæreMover-script. Vi kan nu bruge denne Remap-funktion i vores ExtensionMethods-script i vores Update-funktion til at konvertere vores potentiometerværdier til brugbare værdier i vores spil. Under det sted, hvor vi lige har tildelt variablen potValue, skriv følgende:

Anmodningen viser os, at vores Remap tager to sæt fra og til værdier og kortlægger dem sammen. Vi kan indtaste vores værdier i dette.

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

Gem dit script, gå tilbage til Unity-editoren, og tryk på play-knappen. Du skal nu se, at variablen Mapped Pot ændres, når du flytter potentiometeret, så det svarer til de værdier, vi bestemte for vores venstre og højre kanter. Tag et øjeblik på at læne dig tilbage og takke dit ExtensionMethods-script. Ikke en lommeregner i syne.

Bemærk: Hvis du bemærker, at dine værdier er vendt, så når dit potentiometer er helt til højre, får du en negativ værdi for din Mapped Pot-variabel, kan du muligvis få dit potentiometer indstillet forkert. Heldigvis kan du løse dette uden at foretage nogen nye kabelforbindelser. Du kan blot skifte værdier, når du omformer dem:

Nu har vi endelig brugbare værdier. Nu skal vi bare tildele disse værdier til vores sfære X-position:

// Tildel den kortlagte pot-værdi til kuglens x-position transform.position = new Vector3 (mappedPot, transform.position.y, transform.position.z);

Gem dit script, gå tilbage til Unity-editoren, og tryk på play. Du skal nu være i stand til at flytte din sfære til venstre og højre ved hjælp af dit potentiometer!

At sætte knappen på arbejde

Nu hvor vi har vores sfære i bevægelse, ville det ikke være rart at have en måde at bremse tingene op lidt på, når vi kommer på et trangt sted? Vi vil bruge vores knap til at bremse tiden i vores spil. Åbn dit sphereMover-script, og tilføj denne kode til din opdateringsfunktion

// hvis Unity opdager, at der trykkes på knappen, nedsættes tidsskalaen, hvis (arduino.digitalRead (buttonPinNumber) == 1) Time.timeScale = 0.4f;  andet Time.timeScale = 1.0f;

Nu har vi mekanikerne i vores spil, lad os tilføje nogle forhindringer! Vi vil bruge den naturlige fjende af kuglen, terningen. Klik på i hierarkiet Opret> 3d-objekt> Cube. I terningens inspektør, Tilføj komponent> Fysik> Rigidbody. Indstil trækværdien for den stive krop til 5. Vælg også Trigger under Box Collider-komponenten i inspektøren. Dette vil give os mulighed for at opdage kollisioner med vores sfære.

Opret et script på terningen og kald det collideWithSphere, åbn scriptet og slet Start- og opdateringsfunktionerne, da vi ikke har brug for dem denne gang. Indtast denne kode:

ved hjælp af UnityEngine; ved hjælp af System.Collections; offentlig klasse kollidererWithSphere: MonoBehaviour void OnTriggerEnter (Collider anden) Destroy (other.gameObject); 

OnTriggerEnter sender en meddelelse, når triggercollideren rammer en anden collider. I dette tilfælde fortæller vi det at ødelægge, hvad det rører ved. Gem scriptet og gå tilbage til Unity-editoren. Træk terningen fra hierarkiet til projektpanelet. Du vil bemærke, at teksten på terningen i hierarkiet er blevet blå. Dette skyldes, at vi har oprettet en præfabrik og gemt den i vores projekt. Slet din terning fra hierarkiet nu.

Alt, hvad vi har brug for nu, er et script til at gyde terningerne. Klik i hierarkiet Opret> Opret tom, og omdøbe det til Game Manager i inspektøren og tilføje et script til det kaldet gameManager. Åbn scriptet, og tilføj denne kode:

ved hjælp af UnityEngine; ved hjælp af System.Collections; public class gameManager: MonoBehaviour // en variabel til at holde det præfabrik, vi vil gyde offentlig GameObject-terning; // vi ønsker, at nogle variabler skal bestemme, hvordan nogen terninger der skal gyde //, og hvor højt over os, vi ønsker, at de skal gyde offentligt int-nummerToSpwan; offentlig flydende laveste farvehøjde; offentligt float højesteSpawnheight; // Brug dette til initialisering ugyldigt 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 ()   

Gem scriptet. Tilbage i editoren, vælg Game Manager i hierarkiet, og træk din terningepræfab fra projektpanelet til Cube-variablen i Inspector. Udfyld også værdierne for din gydning her. Du kan lege med det for at gøre det så hårdt eller let, som du vil. Bemærk, at det er værd at have dine laveste terninger spawn højt nok til at give Uniduino mulighed for at initialisere - at tabe spillet, før du er i stand til at flytte, kan være frustrerende!

Det færdige projekt

Når du nu trykker på play, vil terningerne gyde over dig og falde. Du kan bruge dit potentiometer til at undgå dem og din knap for at bremse tiden.

I dette projekt har vi oprettet en brugerdefineret controller med en Arduino, konfigureret Unity og Uniduino til at kommunikere med det, og skabt et simpelt spil til at teste det ud. Koncepterne her kan anvendes til næsten ethvert projekt, og der er endda spilstop, der er specialiserede i brugerdefinerede controllere.

Med Arduino og Unity kunne du oprette en brugerdefineret controller fra næsten alt. Har du oprettet en hi-fi, der styrer et rumfartøj? En brødrister, der styrer et platformspil?

Hvis du har lavet et projekt som dette, vil jeg meget gerne se det! Skriv det i kommentarerne nedenfor!




Endnu ingen kommentarer

Om moderne teknologi, enkel og overkommelig.
Din guide i en verden af moderne teknologi. Lær hvordan du bruger de teknologier og gadgets, der omgiver os hver dag, og lær, hvordan du finder interessante ting på Internettet.