Hoe maak je een aangepaste gamecontroller met Arduino en Unity?

Hoe maak je een aangepaste gamecontroller met Arduino en Unity?

Heb je altijd al je eigen gamecontroller willen ontwerpen? Het is makkelijker dan je denkt!





In dit korte project zullen we een eenvoudige, aangepaste gamecontroller bouwen om te gebruiken met de Unity-game-engine. Deze controller wordt aangedreven door een Arduino Uno, hoewel je ook voor dit project een van de vele alternatieven kunt gebruiken. We zullen ook een basisspel maken waarin je je controller gebruikt om vallende voorwerpen te vermijden en de tijd te vertragen.





Voor dit project heb je nodig

  • Arduino of vergelijkbare microcontroller
  • 1 x 10k Ohm weerstand
  • 1 x Momentschakelaar
  • 1 x potentiometer
  • Aansluitdraden
  • een breadboard
  • Unity-game-engine
  • De Uniduino-plug-in van Unity Asset Store ($ 30)
  • Volledige projectcode, voor het geval u deze niet wilt wegschrijven (exclusief de Uniduino-plug-in)

De meeste van deze dingen zijn beschikbaar in een Arduino-starterkit. Als je geen starterskit hebt, bekijk dan onze gids om de beste voor jou te kiezen.





Je kunt je controller zo ingewikkeld maken als je wilt, maar voor dit voorbeeld zullen we een potentiometer en een knop plaatsen - perfect voor het besturen van een eenvoudig arcadespel.

Uw controller in elkaar zetten

Stel je breadboard en Arduino in zoals weergegeven in de onderstaande afbeelding. Dit is wat we zullen gebruiken als onze gamecontroller, hoewel je bijna exact dezelfde setup kunt gebruiken als een DIY midi-controller te!



Je Arduino voorbereiden

Zodra je alles hebt aangesloten, sluit je je Arduino aan via USB. Ga in Arduino Software IDE naar Gereedschappen > Bord en Hulpmiddelen > Poort om te selecteren welke microcontroller en poort u gebruikt. De Arduino IDE wordt geleverd met de schets die we nodig hebben, en je kunt hem vinden onder Bestand> Voorbeelden> Firmata> StandaardFirmata . Klik op Uploaden en je bent klaar om te gaan.

Als Arduino nieuw voor je is en je hoofd een beetje aan het smelten is, bekijk dan onze beginners gids om u te helpen om het goed met uw computer te laten praten.





Uw Unity-project opzetten

In Unity, open Venster > Activawinkel om toegang te krijgen tot Unity's Asset Store vanuit de Unity Editor. Zoek in de Asset Store naar de Uniduino-plug-in. Met deze plug-in kunt u gegevens ontvangen en verzenden van en naar uw Arduino-pinnen in Unity. De plug-in kost op het moment van schrijven . Het is mogelijk om dit project te doen zonder de plug-in te kopen, hoewel het nogal gecompliceerd is en je de plug-in misschien overal handiger vindt.

Deze video van de makers van de plug-in neemt je mee door het proces van testen dat alles werkt, samen met de eerste installatie. Houd er rekening mee dat u mogelijk ook de Unity-editor op Windows moet resetten.





We kunnen hetzelfde testpaneel gebruiken om onze controller te testen. Stel pin D2 in op INPUT en digitaal. Zet verder naar beneden Pin A5 op ANALOG. Uw potentiometer en knop zouden nu waarden op het scherm naast hun pinnummers moeten weergeven. Voortgang!

Nu iets maken dat we kunnen controleren

We hebben dus een controller, maar wat gaan we controleren? Nou, de mogelijkheden zijn eindeloos, maar voor vandaag zullen we een heel eenvoudig ontwijkspel maken om ons nieuwe besturingssysteem te testen. We zullen de game-setup vrij snel doorlopen, dus als je helemaal nieuw bent in de Unity-engine, vind je misschien onze Unity Game Programmeren Beginnersgids handig om je te oriënteren.

We zullen een heel eenvoudig spel bouwen waarin het je doel is om je bol naar links en rechts te ontwijken om vallende kubussen te vermijden, die je nieuw gemaakte aangepaste controller zullen gebruiken.

Maak een nieuwe scène en sleep de Uniduino prefab van Activa > Uniduino > Prefabs in uw hiërarchie en sleep de Uniduino-prefab naar de hiërarchie. We hebben het daar nodig om het gesprek tussen onze game en controller te voeren.

Klik in de Unity-hiërarchie op Creëren > Bol en gebruik het tabblad Transformeren in het infovenster om het naar de onderkant van het spelscherm te verplaatsen.

Het is tijd om te coderen

Nu om wat code toe te voegen aan dit feest. Klik met de bol geselecteerd in de hiërarchie op Component toevoegen > Nieuw script onderaan het infovenster. Noem maar op bolverhuizer en selecteer C Scherp uit het vervolgkeuzemenu. Klik Aanmaken en toevoegen en het script wordt toegevoegd aan het GameObject. Dubbelklik erop om het script te openen en voer deze code in:

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

Neem even de tijd om de opmerkingen over de code door te lezen. Tot nu toe hebben we enkele variabelen gedeclareerd voor onze Arduino, zijn pinnen en onze Sphere. We hebben ook gebruik gemaakt van de

Start en ConfigurePins-methoden om onze Arduino tijdens runtime te initialiseren. Laten we ons script opslaan en teruggaan naar de Unity-editor en kijken wat er is veranderd.

We kunnen nu onze openbare variabelen zien in het infovenster. Laten we eens kijken wat we in dit stadium kunnen invoeren om ons later te helpen. We weten welke pin's we gebruiken op de Arduino uit onze eerdere build, we kunnen ze invoeren. We weten ook uit ons eerdere experiment hoe ver we willen dat onze bol naar links en rechts kan reizen, zodat hij niet van het scherm valt. Laten we deze waarden nu invoeren.

Eerste tekenen van leven

Het is tijd om de waarden van onze Arduino daadwerkelijk te zien in de Unity Editor. Voor nu kunnen we één regel code toevoegen aan de functie Update van ons sphereMover-script en het script opnieuw opslaan.

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

Nu onze potValue-variabele elk frame wordt bijgewerkt, kunnen we de waarde ervan in realtime zien in de Unity Inspector. Voordat we het een test geven, is het nu een goed moment om te controleren of de Uniduino-plug-in op de juiste poort luistert. Klik op Uniduino in de heirarchie en controleer de poortnaam in het infovenster. Als het leeg is, vult u het juiste poortnummer voor uw Arduino in. In dit geval was dat COM4, ​​al kan dat voor jou anders zijn. Controleer met behulp van de Arduino IDE als u het niet zeker weet.

Selecteer uw bol in de hiërarchie en klik op de knop Afspelen bovenaan het scherm. Het systeem heeft een paar seconden nodig om te initialiseren, waarna u de Pot Value-variabele in de inspecteur zou moeten zien veranderen wanneer u de potentiometer verplaatst.

Nu praten we! Nou, strikt genomen spreken Unity en de Arduino, maar wie telt? Als je zo ver bent gekomen en de waardeverandering niet in de inspecteur ziet, controleer dan de installatiestappen en zorg ervoor dat je de juiste poort hebt geselecteerd voor je Arduino.

Laten we dit gebied verplaatsen

Nu we de variabele potValue hebben bijgewerkt, willen we deze waarde gebruiken om onze bol te verplaatsen. Als de potentiometer helemaal naar links staat, willen we dat de bol zich aan de linkerkant van het scherm bevindt en omgekeerd. Objecten in Unity worden gepositioneerd op een punt in de vectorruimte, bepaald door de waarden van it's Positie.transformeren . In de onderstaande afbeelding, waar de bol zich op het verste punt naar links bevindt, zouden we hem willen hebben, je kunt zien dat de positievector 9,5, -4, 0 is.

We willen de X-positie van de bol beïnvloeden. Helaas werkt het rechtstreeks gebruik van de waarden van onze potentiometer niet, want als de potentiometer helemaal naar links staat, geeft deze een waarde van 0 -- wat onze bol precies in het midden van het scherm zou plaatsen. Aan het andere uiterste zou de topwaarde van de potentiometer, 1023, de kubus helemaal rechts van ons scherm plaatsen. Niet bruikbaar. Wat we hier nodig hebben, is wat wiskunde.

Waarom wiskunde doen als Unity het voor je doet?

Voor degenen onder u die bang zijn om naar een stuk papier te staren dat bedekt is met onzinnige cijfers (hoewel er enkele geweldige websites die je kan helpen bij het leren van wiskunde), vrees niet. We hebben een manier nodig om onze potentiometerwaarden overeen te laten komen met de X-positie van onze bol. Gelukkig kunnen we een Uitbreidingsmethode: .

Een Extension Method is een script dat een specifiek werk voor ons doet. In dit geval geven we het de waarden die we hebben, en het retourneert ze aan elkaar toegewezen, klaar om te worden gebruikt in onze bolverhuizer script. Klik bovenaan het paneel Project op Maken > C#-script en noem het ExtensionMethods. Voer de onderstaande code in het script in:

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

Sla het script op en ga terug naar je sphereMover-script. We kunnen deze Remap-functie nu gebruiken in ons ExtensionMethods-script in onze Update-functie om onze potentiometerwaarden om te zetten in bruikbare waarden in ons spel. Typ het volgende onder waar we zojuist de variabele potValue hebben toegewezen:

De prompt laat ons zien dat onze Remap twee sets Van en Naar waarden neemt en deze samen in kaart brengt. Hierin kunnen we onze waarden invoeren.

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

Sla je script op, ga terug naar de Unity-editor en druk op de afspeelknop. Je zou nu moeten zien dat de Mapped Pot-variabele verandert wanneer je de potentiometer beweegt, om overeen te komen met de waarden die we hebben bepaald voor onze linker- en rechterrand. Neem even de tijd om achterover te leunen en uw ExtensionMethods-script te bedanken. Geen rekenmachine in zicht.

Let op: als je merkt dat je waarden omgedraaid zijn, dus als je potentiometer helemaal naar rechts staat krijg je een negatieve waarde voor je Mapped Pot-variabele, dan heb je misschien je potentiometer verkeerd ingesteld. Gelukkig kun je dit oplossen zonder herbedrading te doen. U kunt de waarden eenvoudig wijzigen wanneer u ze opnieuw toewijst:

Nu hebben we eindelijk bruikbare waarden. Nu hoeft u alleen nog die waarden toe te wijzen aan de X-positie van onze bol:

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

Sla je script op, ga terug naar de Unity-editor en druk op play. Je zou nu je bol naar links en rechts moeten kunnen bewegen met je potentiometer!

De knop aan het werk zetten

Nu we onze bol in beweging hebben, zou het niet fijn zijn om een ​​manier te hebben om de zaken een beetje te vertragen als we op een krappe plek komen? We gaan onze knop gebruiken om de tijd in ons spel te vertragen. Open uw sphereMover-script en voeg deze code toe aan uw Update-functie

//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 hebben we de mechanica van ons spel, laten we wat obstakels toevoegen! We gaan de natuurlijke vijand van de bol gebruiken, de kubus. Klik in de hiërarchie op Maken > 3D-object > Kubus . In de inspecteur van de kubus, Component toevoegen > Natuurkunde > Stijve behuizing . Stel de Drag-waarde van de starre body in op 5. Selecteer ook onder de component Box Collider in het infovenster Is Trigger. Hierdoor kunnen we botsingen met onze Sphere detecteren.

Maak een script op de kubus en noem het botsenMetSphere , open het script en verwijder de Start- en Update-functies omdat we ze deze keer niet nodig zullen hebben. Voer deze code in:

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

OnTriggerEnter stuurt een bericht wanneer de trigger-collider een andere collider raakt. In dit geval zeggen we dat het alles wat het aanraakt moet vernietigen. Sla het script op en ga terug naar de Unity-editor. Sleep de kubus van de hiërarchie naar het deelvenster Project. U zult zien dat de tekst van de kubus in de hiërarchie blauw is geworden. Dit komt omdat we een prefab hebben gemaakt en deze in ons project hebben opgeslagen. Verwijder nu uw kubus uit de hiërarchie.

Het enige dat we nu nodig hebben, is een script om de kubussen te spawnen. Klik in de hiërarchie op Maken > Leeg maken , en hernoem het naar Game Manager in de Inspector en voeg er een script aan toe met de naam gameManager. Open het script en voeg deze code toe:

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

}
}

Sla het script op. Terug in de editor, selecteer de Game Manager in de hiërarchie en sleep je kubus prefab van het projectpaneel naar de Cube-variabele in het infovenster. Vul hier ook de waarden voor je spawning in. Je kunt ermee spelen om het zo moeilijk of gemakkelijk te maken als je wilt. Merk op dat het de moeite waard is om je laagste kubussen hoog genoeg te laten spawnen om Uniduino te laten initialiseren -- het spel verliezen voordat je in staat bent om te bewegen kan frustrerend zijn!

Het voltooide project

Als je nu op play drukt, zullen de kubussen boven je spawnen en vallen. U kunt uw potentiometer gebruiken om ze te vermijden, en uw knop om de tijd te vertragen.

In dit project hebben we een aangepaste controller gemaakt met een Arduino, Unity en Uniduino geconfigureerd om ermee te communiceren en een eenvoudig spel gemaakt om het uit te testen. De concepten hier kunnen op bijna elk project worden toegepast, en er zijn zelfs game-jams die gespecialiseerd zijn in aangepaste controllers .

Met Arduino en Unity kun je van bijna alles een aangepaste controller maken. Heb je een hifi gemaakt die een ruimtevaartuig bestuurt? Een broodrooster die een platformspel bestuurt?

Als je zo'n project hebt gemaakt, zou ik het graag zien! Post het in de reacties hieronder!

Deel Deel Tweeten E-mail 6 hoorbare alternatieven: de beste gratis of goedkope audioboek-apps

Als je geen zin hebt om voor audioboeken te betalen, zijn hier enkele geweldige apps waarmee je gratis en legaal naar ze kunt luisteren.

Lees volgende
Gerelateerde onderwerpen
  • doe-het-zelf
  • Programmeren
  • Arduino
  • Spelbesturing
  • Spelontwikkeling
Over de auteur Ian Buckley(216 artikelen gepubliceerd)

Ian Buckley is een freelance journalist, muzikant, performer en videoproducent die in Berlijn, Duitsland woont. Als hij niet aan het schrijven of op het podium staat, sleutelt hij aan doe-het-zelf-elektronica of code in de hoop een gekke wetenschapper te worden.

Meer van Ian Buckley

Abonneer op onze nieuwsbrief

Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!

Klik hier om je te abonneren