Hvordan lage en tilpasset spillkontroller med Arduino og enhet

Hvordan lage en tilpasset spillkontroller med Arduino og enhet

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





I dette korte prosjektet skal vi bygge en enkel tilpasset spillkontroller for bruk med Unity -spillmotoren. Denne kontrolleren vil bli drevet av en Arduino Uno, selv om du også kan bruke et av de mange alternativene der ute for dette prosjektet. Vi vil også lage et grunnleggende spill der du vil bruke kontrolleren din for å unngå fallende gjenstander og redusere tiden.





For dette prosjektet trenger du

  • Arduino eller lignende mikrokontroller
  • 1 x 10k Ohm motstand
  • 1 x Midlertidig bryter
  • 1 x potensiometer
  • Tilkoblingskabler
  • Et brødbrett
  • Enhetsspillmotor
  • Uniduino -pluginet fra Unity Asset Store ($ 30)
  • Fullfør prosjektkoden, 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 et startsett, kan du sjekke ut vår guide for å velge det beste for deg.





Du kan gjøre kontrolleren din så komplisert som du ønsker, men for dette eksemplet vil vi sette opp et potensiometer og en knapp - perfekt for å kontrollere et enkelt arkadespill.

Montering av kontrolleren

Sett opp brødbrettet og Arduino som vist på bildet nedenfor. Dette er det vi skal bruke som vår spillkontroller, selv om du kan bruke nesten det samme oppsettet som en DIY midi -kontroller også!



Forbereder din Arduino

Når alt er koblet til, kobler du til Arduino via USB. I Arduino Software IDE leder du til Verktøy> Brett 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, så er du klar.

Hvis du er ny på Arduino og hodet ditt smelter litt, sjekk ut vår Nybegynnerguide for å hjelpe deg med å snakke med datamaskinen din pent.





Sette opp ditt enhetsprosjekt

Åpne i enhet Vindu> Asset Store for å få tilgang til Unity's Asset Store fra Unity Editor. Søk i Asset Store etter Uniduino -pluginet. Denne pluginen lar deg motta og sende data til og fra Arduino -pinnene i Unity. Pluggen i skrivende stund koster $ 30. Det er mulig å gjøre dette prosjektet uten å kjøpe plugin, selv om det er ganske mer komplisert og du kan finne plugin mer praktisk alle runde.

Denne videoen fra skaperne av pluginet tar deg gjennom prosessen med å teste alt fungerer, sammen med første gangs oppsett. Vær oppmerksom på at du kanskje også må tilbakestille Unity -editoren på Windows.





Vi kan bruke det samme testpanelet til å teste kontrolleren vår. Sett Pin D2 til INPUT og Digital. Lengre ned, sett Pin A5 til ANALOG. Potensiometeret og knappen din skal vise verdier på skjermen ved siden av pin -tallene nå. Framgang!

Nå for å lage noe vi kan kontrollere

Så vi har en kontroller, men hva skal vi kontrollere? Mulighetene er uendelige, men for i dag skal vi lage et veldig enkelt dodging -spill for å teste ut vårt nye kontrollsystem. Vi går ganske raskt over spilloppsettet, så hvis du er helt ny på Unity -motoren, kan du finne vår Unity Game Programming Beginner's Guide nyttig for å få lagrene dine.

Vi vil bygge et veldig grunnleggende spill der målet ditt er å unngå domen din til venstre og høyre for å unngå å falle terninger, som vil benytte den nyopprettede skreddersydde kontrolleren din.

Lag en ny scene og dra Uniduino -prefabrikken fra Eiendeler> Uniduino> Prefabrikker inn i hierakien og dra Uniduino -prefabrikken inn i hierarkiet. Vi trenger det der for å snakke mellom spillet vårt og kontrolleren.

Klikk på enhetshierarkiet Lag> Sphere og bruk Transform -fanen i Inspektøren for å flytte den til bunnen av spillskjermen.

Det er på tide å få koding

Nå for å legge til noen kode til denne festen. Klikk på med sfæren valgt i hierarkiet Legg til komponent> Nytt skript nederst i inspektørvinduet. Navngi det sfæreMover og velg C Sharp fra rullegardinmenyen. Klikk Opprett og legg til og skriptet vil bli lagt til i GameObject. Dobbeltklikk på det for å åpne skriptet og skrive 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 deg tid til å lese gjennom kodekommentarene. Så langt har vi erklært noen variabler for vår Arduino, dens pinner og vår sfære. Vi har også brukt

Start og ConfigurePins -metoder for å initialisere Arduino på kjøretid. La oss lagre skriptet vårt, og gå tilbake til Unity -editoren og se hva som er endret.

Vi kan nå se våre offentlige variabler i Inspektør -vinduet. La oss se hva vi kan skrive inn på dette stadiet for å hjelpe oss senere. Vi vet hvilke pinner vi bruker på Arduino fra bygningen vår tidligere, vi kan legge dem inn. Vi vet også fra vårt eksperiment tidligere hvor langt vi vil at sfæren vår skal kunne reise til venstre og høyre, slik at den ikke faller av skjermen. La oss legge inn disse verdiene nå.

Første tegn på liv

Det er på tide å faktisk se verdier fra vår Arduino inne i Unity Editor. Foreløpig kan vi legge til en kodelinje i sphereMover -skriptets oppdateringsfunksjon, og lagre skriptet igjen.

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 vår potValue -variabel oppdatert for hver ramme, kan vi se verdien i sanntid i Unity Inspector. Før vi tester det, ville det være et godt tidspunkt å sjekke at Uniduino -pluggen lytter på riktig port. Klikk på Uniduino i heirarkiet, og sjekk portnavnet i inspektøren. Hvis det er tomt, fyll ut riktig portnummer for din Arduino. I dette tilfellet var det COM4, ​​selv om det kan være annerledes for deg. Kontroller å bruke Arduino IDE hvis du ikke er sikker.

Velg din sfære i hierarkiet og klikk på Spill av -knappen øverst på skjermen. Systemet trenger noen sekunder for å initialisere, hvoretter du bør begynne å se variabelen Pot Value -endring i inspektøren når du flytter potensiometeret.

Nå snakker vi! Vel, strengt tatt snakker Unity og Arduino, men hvem teller? Hvis du har kommet så langt og ikke ser verdiendringen i inspektøren, må du sjekke oppsettstrinnene og kontrollere at du har valgt riktig port for din Arduino.

La oss flytte denne sfæren

Nå som vi har ut variabelen potValue som oppdateres, vil vi bruke denne verdien til å flytte sfæren vår. Når potensiometeret er helt til venstre, vil vi at sfæren skal være på venstre side av skjermen, og omvendt. Objekter i enhet er plassert på et punkt i vektorrommet, bestemt av verdiene til det Transform. Posisjon . På bildet nedenfor, der sfæren er lengst til venstre vi ønsker det, kan du se at posisjonsvektoren er 9,5, -4, 0.

Vi ønsker å påvirke sfærens X -posisjon. Dessverre vil det ikke fungere å bruke verdiene fra potensiometeret vårt direkte, da når potensiometeret er helt til venstre, gir det en verdi på 0 - noe som vil sette sfæren vår midt på skjermen. I den andre ekstremen ville potensiometerets toppverdi, 1023, plassere kuben helt til høyre på skjermen vår. Ikke brukbar. Det vi trenger her er litt matte.

Hvorfor gjøre matematikk når enhet vil gjøre det for deg?

For dere der ute som gruer seg til å stirre på et stykke papir dekket med useriøse tall (selv om det er noen flotte nettsteder som kan hjelpe deg med å lære matematikk), ikke frykt. Vi trenger en måte å gjøre potensiometerverdiene våre til å stemme overens med sfærens X -posisjon. Heldigvis kan vi bruke en Utvidelsesmetode .

En utvidelsesmetode 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 hverandre, klare til bruk i våre sfæreMover manus. Klikk på øverst i prosjektpanelet Lag> C# Script og gi den navnet ExtensionMethods. Skriv inn koden nedenfor 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 sphereMover -skriptet. Vi kan nå bruke denne Remap -funksjonen i vårt ExtensionMethods -skript i vår oppdateringsfunksjon for å konvertere våre potensiometerverdier til brukbare verdier i spillet vårt. Under der vi nettopp tildelte varianten potValue, skriver du inn følgende:

Forespørselen viser oss at vår omlegging tar to sett med From og To -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 trykk på play -knappen. Du bør nå se at Mapped Pot -variabelen endres når du flytter potensiometeret, slik at det samsvarer med verdiene vi bestemte for våre venstre og høyre kanter. Ta deg tid til å lene deg tilbake og takke ExtensionMethods -skriptet ditt. Ikke en kalkulator i sikte.

Merk: Hvis du merker at verdiene dine er omvendt, så når potensiometeret ditt er helt til høyre, får du en negativ verdi for din Mapped Pot -variabel, kan du få potensiometeret ditt satt opp feil vei. Heldigvis kan du fikse dette uten å gjøre noen omkoblinger. Du kan bare bytte verdier når du gjør dem om:

Nå har vi endelig brukbare verdier. Nå gjenstår det bare å tilordne disse verdiene til sfærens X -posisjon:

gratis filmer uten registrering eller nedlasting
//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å play. Du bør nå kunne flytte din sfære til venstre og høyre ved hjelp av potensiometeret ditt!

Å sette knappen på jobb

Nå som vi har sfæren vår i bevegelse, ville det ikke vært fint å ha en måte å bremse ting litt på når vi kommer på et trangt sted? Vi kommer til å bruke knappen vår for å bremse tiden i spillet vårt. Åpne sphereMover -skriptet, 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 sfærens naturlige fiende, terningen. Klikk i hierarkiet Lag> 3d Object> Cube . I kubens inspektør, Legg til komponent> Fysikk> Rigidbody . Sett Drag -verdien til rigidbody til 5. Velg også Is Trigger under Box Collider -komponenten i inspektøren. Dette vil tillate oss å oppdage kollisjoner med sfæren vår.

Lag et skript på kuben og kall det collideWithSphere , åpne skriptet og slett Start- og oppdateringsfunksjonene, da 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 hver gang utløserkollideren treffer en annen kollider. I dette tilfellet forteller vi det å ødelegge alt det berører. Lagre skriptet og gå tilbake til Unity -redaktøren. Dra kuben fra hierarkiet til prosjektpanelet. Du vil legge merke til at teksten til kuben 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 manus for å gyte terningene. Klikk i hierarkiet Opprett> Lag tom , og gi det nytt navn til Game Manager i inspektøren, og legg til et script til 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 {
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 velger du Game Manager i hierarkiet, og drar prefabrikken kube fra prosjektpanelet til Cube -variabelen i Inspektøren. Fyll ut verdiene for gytingen din også her. Du kan fikle med det for å gjøre det så vanskelig eller enkelt som du vil. Vær oppmerksom på at det er verdt å la de laveste kuber gyte høyt nok til at Uniduino kan initialiseres - å miste spillet før du kan bevege deg kan være frustrerende!

Det ferdige prosjektet

Når du trykker på play, vil kubene gyte over deg og falle. Du kan bruke potensiometeret for å unngå dem, og knappen for å senke tiden.

I dette prosjektet har vi laget en tilpasset kontroller med en Arduino, konfigurert Unity og Uniduino for å kommunisere med den, og laget et enkelt spill for å teste det. Konseptene her kan brukes på nesten alle prosjekter, og det er til og med spill som har spesialisert seg på tilpassede kontrollere .

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 ut i kommentarene nedenfor!

Dele Dele kvitring E -post 6 hørbare alternativer: De beste gratis eller billige lydbokappene

Hvis du ikke liker å betale for lydbøker, er det noen flotte apper som lar deg lytte til dem gratis og lovlig.

Les neste
Relaterte temaer
  • DIY
  • Programmering
  • Arduino
  • Spillkontroller
  • Spillutvikling
Om forfatteren Ian Buckley(216 artikler publisert)

Ian Buckley er frilansjournalist, musiker, utøver og videoprodusent bosatt i Berlin, Tyskland. Når han ikke skriver eller står på scenen, pusler han med DIY elektronikk eller kode i håp om å bli en gal forsker.

Mer fra Ian Buckley

Abonner på vårt nyhetsbrev

Bli med i vårt nyhetsbrev for tekniske tips, anmeldelser, gratis ebøker og eksklusive tilbud!

Klikk her for å abonnere