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

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

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





I dette korte projekt vil vi bygge en simpel brugerdefineret spilcontroller til brug med Unity -spilmotoren. Denne controller drives af en Arduino Uno, selvom du også kan bruge et af de mange alternativer derude til dette projekt. Vi vil også oprette et grundlæggende spil, hvor du vil bruge din controller til at undgå faldende objekter og bremse tiden.





Til dette projekt får du brug for

  • Arduino eller lignende mikrokontroller
  • 1 x 10k Ohm modstand
  • 1 x Midlertidig kontakt
  • 1 x potentiometer
  • Tilslutningskabler
  • Et brødbræt
  • Enhedsspilmotor
  • Uniduino -pluginet fra Unity Asset Store ($ 30)
  • Fuldfør projektkoden, hvis du ikke vil skrive den ud (inkluderer ikke Uniduino -plugin)

De fleste af disse ting er tilgængelige i et Arduino -startsæt. Hvis du ikke har et startsæt, kan du se vores guide til at vælge det bedste til dig.





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

Montering af din controller

Opsæt dit brødbræt og Arduino som vist på billedet herunder. Dette er, hvad vi vil bruge som vores spilcontroller, selvom du næsten kan bruge det samme setup som en DIY midi controller også!



Forberedelse af din Arduino

Når alt er kablet op, skal du tilslutte din Arduino via USB. I Arduino Software IDE leder til Værktøjer> Board 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, og du er klar til at gå.

Hvis du er ny i Arduino, og dit hoved smelter lidt, kan du tjekke vores Nybegynderguide for at hjælpe dig med at få det til at snakke med din computer pænt.





Opsætning af dit enhedsprojekt

I enhed, åbn Vindue> Aktivbutik for at få adgang til Unity's Asset Store fra Unity Editor. Søg i Asset Store efter Uniduino -plugin. Dette plugin giver dig mulighed for at modtage og sende data til og fra dine Arduino -pins i Unity. Pluginet koster i skrivende stund $ 30. Det er muligt at udføre dette projekt uden at købe pluginet, selvom det er ret mere kompliceret, og du kan finde pluginet mere bekvemt hele vejen rundt.

Denne video fra skaberne af pluginet tager dig igennem processen med at teste alt fungerer sammen med første gangs opsætning. Bemærk, at du muligvis også skal nulstille Unity -editoren i Windows.





Vi kan bruge det samme testpanel til at teste vores controller. Indstil Pin D2 til INPUT og Digital. Længere ned, sæt Pin A5 til ANALOG. Dit potentiometer og din 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? Mulighederne er uendelige, men i dag skal vi lave et meget simpelt dodging -spil for at teste vores nye kontrolsystem. Vi går hurtigt over spilopsætningen, så hvis du er helt ny inden for Unity -motoren, kan du finde vores Unity Game Programming Begyndervejledning nyttigt at få dine lejer.

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å at falde terninger, som vil bruge din nyfremstillede brugerdefinerede controller.

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

Klik på enhedshierarkiet Opret> Sphere og brug fanen Transform i Inspektøren til at flytte den til bunden af ​​spilskærmen.

Det er tid til at få kodning

Nu for at tilføje noget kode til denne fest. Klik på med kuglen valgt i hierarkiet Tilføj komponent> Nyt script i bunden af ​​inspektionsvinduet. Navngiv det sfæreMover og vælg C Skarp fra rullemenuen. Klik på Opret og tilføj og scriptet tilføjes til GameObject. Dobbeltklik på det 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);
}
}

Brug et øjeblik på at læse kodekommentarerne igennem. 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 driftstid. 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 vinduet Inspektør. Lad os se, hvad vi kan indtaste på dette tidspunkt for at hjælpe os senere. Vi ved, hvilken pin vi bruger på Arduino fra vores build tidligere, vi kan indtaste 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å den ikke falder af skærmen. Lad os indtaste disse værdier nu.

De første tegn på liv

Det er tid til faktisk at se værdier fra vores Arduino inde i Unity Editor. For nu 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 hvor vi har opdateret vores potValue -variabel hver ramme, kan vi se dens værdi i realtid i Unity Inspector. Inden vi tester det, ville det nu være et godt tidspunkt at kontrollere, at Uniduino -stikket lytter på den rigtige port. Klik på Uniduino i heirarkiet, og kontroller portens navn i inspektøren. Hvis det er tomt, skal du udfylde det korrekte portnummer til din Arduino. I dette tilfælde var det COM4, ​​selvom 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 at initialisere, hvorefter du skal begynde at se variablen Pot Value -ændring i inspektøren, når du flytter potentiometeret.

Nu taler vi! Tja, strengt taget taler Unity og Arduino, men hvem tæller? Hvis du er nået så langt og ikke kan se værdien ændres i inspektøren, skal du kontrollere installationstrinnene og kontrollere, at du har valgt den korrekte port 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 sfære. Når potentiometeret er helt til venstre, ønsker vi, at kuglen skal være i venstre side af skærmen og omvendt. Objekter i enhed er placeret på et punkt i vektorrum, bestemt af dets værdier Transform. Placering . På billedet herunder, hvor kuglen er længst til venstre, vi gerne vil have den, kan du se, at dens positionsvektor er 9,5, -4, 0.

Vi vil påvirke kuglens X -position. Desværre vil det ikke virke direkte at bruge værdierne fra vores potentiometer, da når potentiometeret er helt til venstre, giver det en værdi på 0 - hvilket ville sætte vores kugle lige midt på skærmen. I den anden ekstreme ville potentiometerets topværdi, 1023, placere terningen langt til højre for vores skærm. Ikke nyttig. Det, vi har brug for her, er noget matematik.

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

Til jer derude der gruer sig til at stirre på et stykke papir dækket af useriøse tal (selvom der er nogle store hjemmesider der kan hjælpe dig med at lære matematik), frygt ikke. Vi har brug for en måde at få vores potentiometerværdier til at svare til vores kugles X -position. Heldigvis kan vi bruge en Udvidelsesmetode .

En udvidelsesmetode er et script, der udfører et specifikt job for os. I dette tilfælde giver vi det de værdier, vi har, og det returnerer dem kortlagt til hinanden, klar til at blive brugt i vores sfæreMover manuskript. Klik på øverst i projektpanelet Opret> C# Script og navngiv det ExtensionMethods. Indtast koden herunder 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 opdateringsfunktion til at konvertere vores potentiometerværdier til brugbare værdier i vores spil. Under hvor vi lige har tildelt variablen potValue, skal du skrive følgende:

Prompten viser os, at vores Remap tager to sæt From og To -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, for at svare til de værdier, vi har bestemt for vores venstre og højre kant. Brug et øjeblik på at læne dig tilbage og takke dit ExtensionMethods -script. Ikke en lommeregner i sigte.

Bemærk: Hvis du bemærker, at dine værdier er omvendt, så når dit potentiometer er helt til højre, får du en negativ værdi for din Mapped Pot -variabel, kan du få dit potentiometer konfigureret den forkerte vej. Heldigvis kan du ordne dette uden at foretage nogen genopkobling. Du kan simpelthen ændre værdierne, når du ændrer dem igen:

Nu har vi endelig brugbare værdier. Nu er det bare at tildele disse værdier til vores kugles X -position:

ekstern harddisk vises ikke i diskhåndtering Windows 10
//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å play. Du skal nu kunne flytte din sfære til venstre og højre ved hjælp af dit potentiometer!

Sætte knappen i gang

Nu hvor vi har vores kugle i bevægelse, ville det ikke være rart at have en måde at bremse tingene lidt på, når vi kommer i en stram situation? Vi kommer til at bruge vores knap til 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 kommer til at bruge kuglens naturlige fjende, terningen. Klik på i hierarkiet Opret> 3d Object> Cube . I terningens inspektør, Tilføj komponent> Fysik> Rigidbody . Indstil trækværdien for det stive legeme til 5. Vælg også Is Trigger under Box Collider -komponenten i inspektøren. Dette giver 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 får brug for 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 kollider. 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 panelet Projekt. Du vil bemærke, at teksten i terningen i hierarkiet er blevet blå. Dette er fordi vi har oprettet en præfabrikeret 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øb det til Game Manager i inspektøren og tilføj et script til det kaldet 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 {
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 skal du vælge Game Manager i hierarkiet og trække din terningefabrik fra projektpanelet til Cube -variablen i inspektøren. Udfyld også værdierne for din gydning her. Du kan rode med det for at gøre det så hårdt eller let som du vil. Bemærk, at det er værd at få dine laveste terninger til at gyde højt nok til, at Uniduino kan initialiseres - at tabe spillet, før du kan bevæge dig, 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 den, og skabt et simpelt spil for at teste det. Begreberne her kan anvendes på næsten ethvert projekt, og der er endda spilstop, der er specialiseret 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! Send det i kommentarerne herunder!

Del Del Tweet E -mail 6 hørbare alternativer: De bedste gratis eller billige lydbogsapps

Hvis du ikke har lyst til at betale for lydbøger, her er nogle gode apps, der lader dig lytte til dem gratis og lovligt.

Læs Næste
Relaterede emner
  • gør det selv
  • Programmering
  • Arduino
  • Spilcontroller
  • Spiludvikling
Om forfatteren Ian Buckley(216 artikler udgivet)

Ian Buckley er freelance journalist, musiker, performer og videoproducent bosat i Berlin, Tyskland. Når han ikke skriver eller på scenen, piller han med DIY -elektronik eller kode i håb om at blive en gal videnskabsmand.

Mere fra Ian Buckley

Abonner på vores nyhedsbrev

Tilmeld dig vores nyhedsbrev for at få tekniske tips, anmeldelser, gratis e -bøger og eksklusive tilbud!

Klik her for at abonnere