Een aangepaste spelbesturing maken met Arduino en Unity
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 voorkomen 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.
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!
Voorbereiding van uw Arduino
Zodra je alles bedraad hebt, verbind je je Arduino via USB. In Arduino Software IDE ga naar Hulpmiddelen> 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> 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
In Unity, open Venster> Activum Winkel om Unity's Asset Store te openen 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.
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!
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 de 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 Activa> Uniduino> Prefabs in 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 hiërarchie Unity Creëer> Sphere en gebruik het tabblad Transformeren in het infovenster om het naar de onderkant van het spelscherm te verplaatsen.
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 het Inspector-venster. Noem maar op sphereMover en selecteer C Sharp in het vervolgkeuzemenu. Klik Maken en toevoegen en het script zal worden toegevoegd aan het GameObject. Dubbelklik erop om het script te openen en voer deze code in:
gebruikmakend van UnityEngine; met behulp van System.Collections; met behulp van Uniduino; public class sphereMover: MonoBehaviour // Headers zijn niet strikt noodzakelijk, maar ze maken het leven gemakkelijker in de Inspector. [Header ("Arduino Variables")] // we moeten de Arduino als een variabele openbare Arduino arduino declareren; // we moeten een integer voor het pennummer van onze potentiometer declareren, // door deze variabelen openbaar te maken, kunnen we deze later in de editor wijzigen // als we de lay-out van ons arduino public int potPinNumber wijzigen; // een vlottervariabele om de potentiometerwaarde (0 - 1023) openbare zwevende potwaarde vast te houden; // we zullen later die potWaarde opnieuw toewijzen aan de y-positie van onze capsule en deze vasthouden in deze variabele openbare zwevende kaartPot; // public int voor onze button pin public int buttonPinNumber; [Header ("Bolvariabelen")] // variabelen om de waarden vast te houden die we eerder hebben genoteerd voor de zijkanten van ons scherm public float leftEdge; public float rightEdge; // Gebruik dit voor initialisatie ongeldig Start () // en initialiseren zullen we, te beginnen met de Arduino Variable. // we gebruiken slechts één Arduino, dus we kunnen Arduino.global gebruiken om het te pakken. arduino = Arduino.global; arduino.Setup (ConfigurePins); void ConfigurePins () // configureer de Arduino-pin als analoog voor onze potentiometer arduino.pinMode (potPinNumber, PinMode.ANALOG); // Breng de Arduino op de hoogte van eventuele wijzigingen in de waarde van onze potentiometer arduino.reportAnalog (5, 1); // configureer onze 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.
We kunnen nu onze openbare variabelen bekijken in het Inspector-venster. 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.
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 wijzen de waarde die de Arduino aan het lezen is van onze potentiometer toe aan onze potValue variabele 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.
Selecteer uw bol in de hiërarchie en klik op de knop Afspelen aan de bovenkant van het scherm. Het systeem heeft een paar seconden nodig om te initialiseren, waarna u de verandering van de Pot Value-variabele in het infovenster gaat zien wanneer u de potentiometer verplaatst.
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 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 zich helemaal links van ons 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 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 doe je wiskunde als eenheid het voor je zal 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.
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 onze sphereMover script. Klik boven aan het Project-paneel op Maak> C # Script aan en noem het ExtensionMethods. Voer de onderstaande code in het script in:
gebruikmakend van UnityEngine; met behulp van System.Collections; public static class ExtensionMethods // onze handige dandy Remapper-functie public static float Remap (deze floatwaarde, zweven van1, zweven naar1, zweven van2, zweven naar2) return (waarde - vanaf1) / (naar1 - vanaf1) * (naar2 - 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:
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. U zou nu moeten zien dat de variabele Mapped Pot verandert wanneer u de potentiometer verplaatst, om te corresponderen met de waarden die we hebben bepaald voor onze linker- en rechterrand. Neem even de tijd om achterover te leunen en bedank het ExtensionMethods-script. Geen rekenmachine in zicht.
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:
Nu hebben we eindelijk bruikbare waarden. Nu hoeft u alleen nog maar die waarden toe te wijzen aan de X-positie van onze bol:
// Wijs de toegewezen potwaarde toe aan de x-positie van de bol 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 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
// als Unity detecteert dat de knop wordt ingedrukt, vertraagt de tijdschaal als (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 Maak> 3d Object> Kubus. In de inspecteur van de kubus, Component toevoegen> Fysica> Rigidbody. 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:
gebruikmakend van UnityEngine; met behulp van 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 Maak> Maak leeg, en hernoem het in Game Manager in de Inspector en voeg er een script aan toe met de naam gameManager. Open het script en voeg deze code toe:
gebruikmakend van UnityEngine; met behulp van System.Collections; public class gameManager: MonoBehaviour // een variabele om de prefab te houden we willen openbare GameObject-kubus uitbrengen; // we willen een aantal variabelen om te beslissen hoe kubussen om te spawnen // en hoe hoog boven ons we willen dat ze publiek int-nummerToSpwan spawnen; publiek zweeft het minstSpawnheight; publiek zweeft het hoogstSpawnheight; // Gebruik dit voor initialisatie ongeldig Start () voor (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 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!
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!
Ontdek meer over: Arduino, Game Controller, Game Development, Programming.