Een aangepaste spelbesturing maken met Arduino en Unity

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

Heb je ooit je eigen gamecontroller willen ontwerpen?  Het is makkelijker dan je denkt!
Advertentie

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

In dit korte project zullen we een eenvoudige aangepaste spelbesturing bouwen om te gebruiken met de Unity-game-engine. Deze controller wordt aangedreven door een Arduino Uno, hoewel je een van de vele alternatieven zou kunnen gebruiken Arduino Koopgids: welke kaart moet je kopen? Arduino Koopwijzer: welk bord moet je kopen? Er zijn zoveel verschillende soorten Arduino-boards, dat je zou worden vergeven dat je in de war was. Welke moet je kopen voor je project? Laat ons helpen, met deze Arduino koopgids! Lees ook meer over dit project. We zullen ook een basisspel maken waarin je je controller gebruikt om vallende voorwerpen te vermijden en de tijd te vertragen.

Voor dit project dat je nodig hebt

  • Arduino of vergelijkbare microcontroller
  • 1 x 10k Ohm weerstand
  • 1 x kortstondige schakelaar
  • 1 x potentiometer
  • Aansluitdraden
  • Een breadboard
  • Unity game-engine
  • De Uniduino-plug-in van Unity Asset Store ($ 30)
  • Voltooi de projectcode, voor het geval je het niet wilt opschrijven (bevat de Uniduino-plug-in niet)

De meeste van deze dingen zijn verkrijgbaar in een Arduino-starterkit. Als je geen starterkit hebt, bekijk dan onze gids voor het kiezen van de beste 4 beste starterskits voor Arduino beginners 4 beste starterskits voor Arduino beginners Er zijn tal van geweldige Arduino beginnersprojecten die je kunt gebruiken om aan de slag te gaan, maar je zult heb eerst een Arduino en een aantal componenten nodig. Hier is onze keuze uit 4 van de beste starterkits voor ... Lees er meer over voor jou.

Je kunt je controller zo gecompliceerd maken als je wilt, hoewel we voor dit voorbeeld een potentiometer en een knop instellen - perfect voor het besturen van een eenvoudig arcadespel.

Aangepaste controller breadboard 670

Uw controller assembleren

Stel je breadboard en Arduino samen zoals getoond in de afbeelding hieronder. Dit is wat we zullen gaan gebruiken als onze spelcontroller, hoewel je bijna exact dezelfde setup zou kunnen gebruiken als een DIY-midi-controller. Hoe maak je een MIDI-controller met een Arduino Hoe maak je een MIDI-controller met een Arduino Als een muzikant die heeft verzameld een verzameling muziekinstrumenten en noise-boxes, de bescheiden Arduino is de perfecte tool om een ​​aangepaste MIDI-controller te maken. Meer lezen ook!

Fritzing Diagram Geannoteerd

Voorbereiding van uw Arduino

Zodra je alles bedraad hebt, verbind je je Arduino via USB. Ga in Arduino Software IDE naar Tools> Board and Tools> Port om te selecteren welke microcontroller en poort u gebruikt. De Arduino IDE wordt geleverd met de schets die we nodig hebben, en je kunt deze vinden onder Bestand> Voorbeelden> Firmata> StandardFirmata . Klik op Uploaden en u bent klaar om te vertrekken.

Als Arduino nieuw is en je hoofd iets smelt, bekijk dan onze beginnershandleiding Aan de slag met Arduino: een beginnersgids Aan de slag met Arduino: een beginnersgids Arduino is een prototype-platform voor open-source elektronica op basis van flexibele, eenvoudig te gebruiken gebruik hardware en software. Het is bedoeld voor kunstenaars, ontwerpers, hobbyisten en iedereen die geïnteresseerd is in het maken van interactieve objecten of omgevingen. Lees meer om u te helpen het netjes met uw computer te laten praten.

Uw Unity-project opzetten

Open in Unity Window> Asset Store om toegang te krijgen tot de Asset Store van Unity 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 op het moment van schrijven kost $ 30. Het is mogelijk om dit project te doen zonder de plug-in te kopen, hoewel het eerder gecompliceerd is en je vindt de plug-in gemakkelijker in het algemeen.

Unity Asset Winkel Uniduino

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

We kunnen ditzelfde testpaneel gebruiken om onze controller uit te testen. Stel Pin D2 in op INPUT en Digital. Verderop zet je Pin A5 op ANALOG. Uw potentiometer en knop zouden nu op hun scherm waarden moeten weergeven naast hun pincodes. Vooruitgang!

Uniduino-test

Nu iets maken dat we kunnen controleren

Dus we hebben een controller, maar wat zullen we controleren? Nou, de mogelijkheden zijn eindeloos, maar voor vandaag zullen we een heel eenvoudig ontwijkend spel maken om ons nieuwe besturingssysteem te testen. We gaan vrij snel over de game-instellingen, dus als je helemaal nieuw bent in de Unity-engine, kun je onze Unity Game Programming-handleiding voor beginners vinden. Een game met eenheid programmeren: een beginnershandleiding Een game met eenheid programmeren: een beginnershandleiding In de evoluerende wereld landschap van indie game-ontwikkeling, Unity is naar voren gekomen als iets van een de-facto standaard: de lage kosten, het gebruiksgemak en brede functies maken het ideaal voor een snelle ontwikkeling van games. Lees meer nuttig om je te oriënteren.

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

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

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

Inspecteur Sphere X-positie

Het is tijd om codering te krijgen

Nu om wat code toe te voegen aan deze partij. Klik met de bol geselecteerd in de hiërarchie op Component toevoegen> Nieuw script onderaan in het infovenster. Noem het sphereMover en selecteer C Sharp in het vervolgkeuzemenu. Klik op Maken 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 te lezen. Tot nu toe hebben we enkele variabelen verklaard voor onze Arduino, zijn pinnen en onze bol. We hebben ook het
Start en ConfigurePins-methoden om onze Arduino tijdens runtime te initialiseren. Laten we ons script opslaan en teruggaan naar de Unity-editor om te zien wat er is veranderd.

Sphere Mover Script met lege variabelen

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

Sphere Mover Script met variabelen

Eerste tekenen van leven

Het is tijd om de waarden van onze Arduino daadwerkelijk in Unity Editor te bekijken. Voorlopig kunnen we een regel code toevoegen aan de Update-functie van het 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 we onze potValue-variabele elk frame hebben bijgewerkt, kunnen we de waarde in realtime zien in de Unity Inspector. Voordat we het een test geven, zou het nu een goed moment zijn om te controleren of de Uniduino-plug-in naar de juiste poort luistert. Klik op Uniduino in de Heirarchy en controleer de poortnaam in het infovenster. Als dit leeg is, vult u het juiste poortnummer voor uw Arduino in. In dit geval was het COM4, ​​hoewel het voor u misschien anders is. Controleer het gebruik van de Arduino IDE als je het niet zeker weet.

Uniduino Controleer poort is correct

Selecteer uw bol in de hiërarchie en klik op de knop Afspelen aan de bovenkant van het scherm. Het systeem heeft enkele seconden nodig om te initialiseren, waarna u de verandering in de Pot Value-variabele in het infovenster kunt zien wanneer u de potentiometer verplaatst.

Tekenen van leven 2

Nu zijn we aan het praten! Nou, strikt genomen praten Eenheid en de Arduino, maar wie telt? Als je zo ver bent gekomen en de waardewijziging in de inspector niet ziet, controleer dan de installatiestappen en zorg ervoor dat je de juiste poort hebt geselecteerd voor je Arduino.

Laten we deze sfeer verplaatsen

Nu we de potValue-variabele hebben bijgewerkt, willen we deze waarde gebruiken om onze sfeer te verplaatsen. Wanneer de potentiometer helemaal naar links is, willen we dat de bol zich aan de linkerkant van het scherm bevindt en omgekeerd. Objecten in eenheid worden gepositioneerd op een punt in de vectorruimte, bepaald door de waarden van de transform.positie. In de onderstaande afbeelding, waar de bol het verst naar links staat, zouden we het willen, je kunt zien dat de positievector 9.5, -4, 0 is.

Transformeer Voorbeeld 670

We willen de X-positie van de bol beïnvloeden. Helaas werkt het niet direct om de waarden van onze potentiometer te gebruiken, want wanneer de potentiometer helemaal naar links is, geeft deze een waarde van 0 - die onze bol precies in het midden van het scherm zou plaatsen. Aan de andere kant, de topwaarde van de potentiometer, 1023, zou de kubus helemaal rechts van ons scherm plaatsen. Niet bruikbaar. Wat we hier nodig hebben is wiskunde.

Waarom zou wiskunde als eenheid het voor je zou doen?

Voor degenen onder u die er bang voor zijn om naar een stuk papier te kijken dat bedekt is met onzinnige cijfers (hoewel er enkele geweldige websites zijn. De 20 Websites die u nodig heeft om Math te leren Stap voor stap De 20 Websites die u moet leren Math Stap voor Stap We hebben de beste sites voor elk niveau, zodat je systematisch kunt leren, wiskundig een niveau beter begrijpt en plezier hebt! Lees Meer dat je kan helpen met het leren van wiskunde), wees niet bang. We hebben een manier nodig om onze potentiometerwaarden overeen te laten komen met de X-positie van onze bol. Gelukkig kunnen we een uitbreidingsmethode gebruiken .

Een uitbreidingsmethode is een script dat een specifieke taak voor ons doet. In dit geval geven we het de waarden die we hebben, en retourneren ze ze aan elkaar, klaar om te worden gebruikt in ons sphereMover- script. Klik boven aan het deelvenster Project op Maken> C # Script en noem dit 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 onze game. Onder waar we zojuist de potValue-variabele hebben toegewezen, typt u het volgende:

Remap-functie

De prompt laat ons zien dat onze Remap twee reeksen van From and To-waarden gebruikt en ze samen toewijst. We kunnen onze waarden hierin opnemen.

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

Sla je script op, ga terug naar de Unity-editor en klik op de afspeelknop. Je zou nu moeten zien dat de variabele Mapped Pot verandert wanneer je de potentiometer verplaatst, om te corresponderen met de waarden die we hebben bepaald voor onze Linker en Rechter Randen. Neem even de tijd om achterover te leunen en bedank het ExtensionMethods-script. Geen rekenmachine in zicht.

Mapped Pot

Opmerking: als je merkt dat je waarden zijn omgekeerd, dus als je potentiometer helemaal naar rechts is, krijg je een negatieve waarde voor je Mapped Pot-variabele, misschien heb je je potentiometer verkeerd ingesteld. Gelukkig kun je dit oplossen zonder opnieuw te hoeven bedraden. U kunt eenvoudig de waarden schakelen wanneer u ze opnieuw toewijst:

Schakel Remap in

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

 //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 kunnen bewegen met je potentiometer!

De knop laten werken

Nu we onze sfeer in beweging hebben, zou het niet fijn zijn om een ​​manier te hebben om de zaken wat te vertragen als we ons in een krappe positie bevinden? We gaan onze knop gebruiken om de tijd in onze game 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 onze game, laten we wat obstakels toevoegen! We gaan de natuurlijke vijand van de bol, de kubus, gebruiken. Klik in de hiërarchie op Maken> 3d Object> Kubus . Voer in de infovenster van de kubus Component> Physics> Rigidbody in . Stel de Drag-waarde van de rigide tekst in op 5. Selecteer onder de component Box Collider in het infovenster ook Is Trigger. Hierdoor kunnen we botsingen met onze bol detecteren.

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

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

OnTriggerEnter verzendt een bericht wanneer de trigger-collider een andere collider raakt. In dit geval vertellen we het om alles te vernietigen wat het aanraakt. Sla het script op en ga terug naar de Unity-editor. Sleep de kubus van de hiërarchie naar het paneel Project. U zult merken 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 je kubus nu uit de hiërarchie.

Alles wat we nu nodig hebben is een script om de kubussen te spawnen. Klik in de hiërarchie op Maken> Maak leeg en wijzig de naam in Spelmanager in het infovenster 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< 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 () { } } 

Sla het script op. Terug in de editor, selecteert u de Game Manager in de hiërarchie en sleept u uw kubus prefab van het projectvenster naar de kubusvariabele 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 spawn hoog genoeg te laten zijn om Uniduino te laten initialiseren - het verliezen van het spel voordat je in staat bent om te bewegen kan frustrerend zijn!

Game Manager

Het voltooide project

Wanneer u nu op play drukt, zullen de kubussen boven u uitkomen en vallen. Je kunt je potentiometer gebruiken om ze te vermijden, en je knop om de tijd te vertragen.

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

Met Arduino en Unity kun je van bijna alles een eigen controller maken. Heb je een hi-fi gemaakt die een ruimtevaartuig bestuurt? Een broodrooster dat een platformspel bestuurt?

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

In this article