Sådan laver du en brugerdefineret spilcontroller med Arduino og Unity

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

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

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

I dette korte projekt vil vi opbygge en simpel brugerdefineret spilcontroller til brug med Unity spilmotor. Denne controller vil blive drevet af en Arduino Uno, selv om du kunne bruge en af ​​de mange alternativer Arduino Buying Guide: Hvilket board skal du få? Arduino Købsvejledning: Hvilket bestyrelse skal du få? Der er så mange forskellige slags Arduino boards derude, du ville blive tilgivet for at være forvirret. Hvad skal du købe til dit projekt? Lad os hjælpe med denne Arduino købeguide! Læs mere derude for dette projekt også. Vi vil også skabe et grundlæggende spil, hvor du vil bruge din controller til at undgå at falde objekter og sænke tiden.

Til dette projekt skal du bruge

  • Arduino eller lignende mikrocontroller
  • 1 x 10k ohm modstand
  • 1 x Momentary switch
  • 1 x Potentiometer
  • Hook-up ledninger
  • Et brødbræt
  • Unity game engine
  • Uniduino-pluginet fra Unity Asset Store ($ 30)
  • Komplet projektkode, hvis du ikke vil skrive det ud (inkluderer ikke Uniduino-plugin)

De fleste af disse ting er tilgængelige i et Arduino starter kit. Hvis du ikke har et startpakke, se vores guide til at vælge de bedste 4 Bedste Starter Kit til Arduino Beginners 4 Bedste Starter Kit til Arduino Beginners Der er masser af gode nybegyndere 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 kits til ... Læs mere en til dig.

Du kan gøre din controller så kompliceret som du ønsker, men i dette eksempel vil vi oprette et potentiometer og en knap - perfekt til styring af et simpelt arkadespil.

Custom Controller Breadboard 670

Montering af din controller

Sæt dit brødbræt og Arduino som vist på billedet nedenfor. Dette er, hvad vi vil bruge som vores game controller, selv om du kunne bruge næsten det samme setup som en DIY midi controller. Sådan laver du en MIDI Controller med en Arduino Sådan laver du en MIDI Controller med en Arduino Som en musiker, der har samlet en samling af musikinstrumenter og støjkasser, er den ydmyge Arduino det perfekte værktøj til at oprette en brugerdefineret MIDI controller. Læs mere også!

Fritzing Diagram noteret

Forbereder din Arduino

Når du har alt tilsluttet, skal du forbinde din Arduino via USB. I Arduino Software IDE head til Værktøjer> Board og Tools> Port for at vælge hvilken mikrocontroller og port du bruger. Arduino IDE leveres sammen med den skitse, vi har brug for, og du kan finde den under Filer> Eksempler> Firmata> StandardFirmata . Klik på Upload, og du vil være klar til at gå.

Hvis du er ny for Arduino, og dit hoved smelter lidt, skal du se vores Begyndervejledning. Kom i gang med Arduino: En nybegyndervejledning Kom i gang med Arduino: En nybegyndervejledning. Arduino er en open source elektronik prototypeplanlægning baseret på fleksibel og nem at Brug hardware og software. Det er beregnet til kunstnere, designere, hobbyister og alle interesserede i at skabe interaktive objekter eller miljøer. Læs mere for at hjælpe dig med at få det til at snakke godt med din computer.

Opsætning af dit enhedsprojekt

I enhed skal du åbne vinduet> Asset Store for at få adgang til Unitys Asset Store fra Unity Editor. Søg i Asset Store for Uniduino plugin. Dette plugin giver dig mulighed for at modtage og sende data til og fra dine Arduino-stifter i Unity. Pluginet på tidspunktet for skrivning koster $ 30. Det er muligt at gøre dette projekt uden at købe plugin'en, selvom det er noget mere kompliceret, og du kan finde plugin mere bekvemt hele vejen rundt.

Unity Asset Store Uniduino

Denne video fra skaberne af plugin'en tager dig igennem processen med at teste alt, hvad der fungerer, sammen med første gangs opsætning. Bemærk, at du måske også skal nulstille Unity-editoren på Windows.

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

Uniduino Test

Nu for at gøre noget, vi kan styre

Så vi har en controller, men hvad skal vi kontrollere? Tja, mulighederne er uendelige, men for i dag skaber vi et meget simpelt dodging-spil for at teste vores nye styresystem. Vi vil flytte over spillet opsætningen ret hurtigt, så hvis du er helt ny til Unity-motoren, kan du finde vores Unity Game Programmering Begynder's Guide Programmering af et spil med enhed: En nybegynder guide Programmering af et spil med enhed: En nybegynder guide i den udvikling Landskabet med indie spiludvikling, har Unity fremkommet som noget af en de facto-standard: dets lave omkostninger, brugervenlighed og brede featuresæt gør det ideelt til hurtig spiludvikling. Læs mere nyttigt at få dine kuglelejer.

Vi vil bygge et meget grundlæggende spil, hvor dit mål er at undvige din kugle til venstre og højre for at undgå faldende terninger, som vil udnytte din nyoprettede brugerdefinerede controller.

Opret en ny scene og træk Uniduino-præfabrikken fra Aktiver> Uniduino> Prefabs til dit hierarki og træk Uniduino prefab i hierarkiet. Vi har brug for det der for at snakke mellem vores spil og controlleren.

I enhedshierarkiet klik på Opret> Sphere og brug Transform-fanen i inspektøren for at flytte den til bunden af ​​spilskærmen.

Inspektør Sphere X Position

Det er på tide at få kodning

Nu skal du tilføje kode til denne fest. Med kuglen valgt i hierarkiet, skal du klikke på Tilføj komponent> Nyt script i bunden af ​​det inspektionsvindue. Navngiv det sphereMover og vælg C Sharp fra rullemenuen. Klik på Opret og Tilføj, og scriptet bliver føjet til GameObject. Dobbeltklik på den for at åbne scriptet og indtaste denne kode:

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

Tag et øjeblik til at læse koden kommentarer. Indtil videre har vi erklæret nogle variabler for vores Arduino, dens ben og vores kugle. Vi har også brugt
Start og ConfigurePins metoder til at initialisere vores Arduino i løbetid. Lad os gemme vores script og gå tilbage til Unity-editoren og se, hvad der er ændret.

Sphere Mover Script With Empty Variables

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

Sphere Mover Script With Variables

Første tegn på livet

Det er tid til faktisk at se værdier fra vores Arduino inde i Unity Editor. For øjeblikket kan vi tilføje en linje kode til vores sphereMover-scripts opdateringsfunktion og gemme scriptet igen.

 void Update () { //We assign the value the arduino is reading from our potentionmeter to our potValue variable potValue = arduino.analogRead(potPinNumber); } 

Nu da vi har opdateret vores potValue-variabel hver ramme, kan vi se det i realtid i Unity Inspector. Før vi giver det en test, ville det nu være en god tid at kontrollere, at Uniduino-pluggen lytter til den rigtige port. Klik på Uniduino i Heirarchy, og kontroller det er Portnavn i Inspektøren. Hvis det er tomt, udfyld det rigtige portnummer for din Arduino. I dette tilfælde var det COM4, ​​selvom det kan være anderledes for dig. Check med Arduino IDE, hvis du ikke er sikker.

Uniduino Check Port er korrekt

Vælg dit kugle i hierarkiet og klik på knappen Afspil øverst på skærmen. Systemet skal bruge nogle få sekunder til at initialisere, hvorefter du skal begynde at se variablen for Pot Value variable i inspektøren, når du flytter potentiometeret.

Tegn på livet 2

Nu taler vi! Tja, strenge taler Unity og Arduino, men hvem tæller? Hvis du har det her langt og ikke ser værdiforandringen i inspektøren, skal du kontrollere opsætningsstrinnene, og sørg for, at du har den korrekte port valgt til din Arduino.

Lad os flytte denne sfære

Nu hvor vi har opdateret potValue-variablen, vil vi bruge denne værdi til at flytte vores kugle. Når potentiometeret er helt til venstre, vil vi have kuglen til venstre på skærmen og omvendt. Objekter i enhed er placeret på et punkt i vektorrummet, bestemt af værdierne for det er Transform.position. I nedenstående billede, hvor kuglen er længst til venstre vi ønsker det, kan du se, at dens positionsvektor er 9, 5, -4, 0.

Transform Eksempel 670

Vi ønsker at påvirke sfæreens X position. Uheldigvis vil værdierne fra vores potentiometer ikke fungere korrekt, da potentiometeret er helt til venstre giver det en værdi på 0 - hvilket ville sætte vores kugle lige midt på skærmen. På den anden side ville potentiometerets topværdi, 1023, placere terningen helt væk til højre for vores skærm. Ikke nyttigt. Hvad vi har brug for her er noget matematik.

Hvorfor lave mat, når en enhed vil gøre det for dig?

For de af jer derude, der stirrer på et stykke papir, der er dækket af usammenlignende tal (selv om der er nogle gode hjemmesider De 20 websteder, du har brug for at lære matematisk trin for trin De 20 websteder, du har brug for at lære matematisk trin for trin Vi har samlet bedste steder for hvert niveau, så du kan lære systematisk at få en bedre forståelse af matematik et niveau ad gangen og have det sjovt! Læs mere, der kan hjælpe dig med at lære matematik), frygter 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 forlængelsesmetode .

En forlængelsesmetode er et script, der gør et bestemt job for os. I dette tilfælde giver vi det de værdier vi har, og det returnerer dem kortlagt til et andet, klar til at blive brugt i vores sphereMover script. Øverst på Projektpanelet klikker du på Opret> C # Script og navngiver det ExtensionMethods. Indtast koden nedenfor i scriptet:

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

Gem scriptet, og gå tilbage til dit sphereMover-script. Vi kan nu bruge denne Remap funktion i vores ExtensionMethods script i vores Update funktion til at konvertere vores potentiometer værdier til brugbare værdier i vores spil. Under hvor vi lige har tildelt potValue-variablen, skal du skrive følgende:

Remap funktion

Prompten 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å afspilningsknappen. Du skal nu se, at variablen Mapped Pot ændres, når du flytter potentiometeret, for at svare til de værdier, vi har fastsat for vores venstre og højre kant. Tag et øjeblik for at læne dig tilbage og takke dit ExtensionMethods script. Ikke en kalkulator i sikte.

Mapped Pot

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, du kan få dit potentiometer til at oprette den forkerte vej rundt. Heldigvis kan du reparere dette uden at genoprette. Du kan simpelthen skifte værdierne, når du ændrer dem:

Switch Remap

Nu har vi endelig brugbare værdier. Nu er alt det, der er tilbage at gøre, at tildele disse værdier til vores sfære X-position:

 //Assign the mapped pot value to the sphere's x position transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z); 

Gem dit script, gå tilbage til Unity-editoren og tryk på afspilning. Du skal nu kunne flytte din kugle til venstre og højre ved hjælp af dit potentiometer!

Sæt knappen i gang

Nu, hvor vi har vores kugleflytte, ville det ikke være dejligt at få en måde at bremse tingene lidt op, når vi kommer i et stramt sted? Vi skal bruge vores knap for at bremse tiden i vores spil. Åbn dit sphereMover-script, og tilføj denne kode til din opdateringsfunktion

 //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 mekanikken i vores spil, lad os tilføje nogle forhindringer! Vi skal bruge den naturlige fjende af kuglen, terningen. I hierarkiet skal du klikke på Opret> 3d objekt> terning . I kubens inspektør, Tilføj komponent> Fysik> Rigidbody . Indstil trækværdien af ​​den stive krop til 5. Vælg også Trigger under komponenten Box Collider i inspektøren. Dette gør det muligt for os at opdage kollisioner med vores kugle.

Opret et script på terningen og kalder det collideWithSphere, åbn scriptet og slet Start- og opdateringsfunktionerne, da vi ikke behøver dem denne gang. Indtast denne kode:

 using UnityEngine; using System.Collections; public class collideWithSphere : MonoBehaviour { void OnTriggerEnter(Collider other) { Destroy(other.gameObject); } } 

OnTriggerEnter sender en besked, når triggerkollideren rammer en anden collider. I dette tilfælde fortæller vi det at ødelægge, hvad det berører. Gem scriptet og gå tilbage til Unity-editoren. Træk terningen fra hierarkiet til projektpanelet. Du vil bemærke teksten af ​​terningen i hierarkiet er blevet blå. Dette skyldes, at vi har lavet en prefab 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. I hierarkiet klik på Opret> Opret tomt, og omdøb det til Game Manager i inspektøren og tilføj et script til det, der hedder gameManager. Åbn scriptet og tilføj denne kode:

 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 () { } } 

Gem scriptet. Tilbage i editoren, vælg Game Manager i hierarkiet, og træk din terning prefab fra projektpanelet til Cube variablen i Inspektøren. Udfyld værdierne for dit gydning her også. Du kan fyre med det for at gøre det så svært eller nemt som du vil. Bemærk at det er værd at have dine laveste kuber kæmpe højt nok til at tillade Uniduino at initialisere - at miste spillet, før du er i stand til at flytte, kan være frustrerende!

Game Manager

Det færdige projekt

Nu, når du trykker på spil, kuberne vil kaste 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. Begreberne her kan anvendes til næsten ethvert projekt, og der er endda jamspil, der specialiserer sig i brugerdefinerede controllere.

Med Arduino og Unity kan du oprette en brugerdefineret controller fra næsten alt. Har du lavet 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 gerne se det! Skriv det i kommentarerne nedenfor!

In this article