Hogyan készítsünk egyedi játékvezérlőt az Arduino és az Unity segítségével

Hogyan készítsünk egyedi játékvezérlőt az Arduino és az Unity segítségével

Gondolt már arra, hogy saját játékvezérlőt tervezzen? Könnyebb, mint gondolnád!





Ebben a rövid projektben egy egyszerű, egyedi játékvezérlőt fogunk építeni, amelyet a Unity játékmotorral használhatunk. Ezt a vezérlőt egy Arduino Uno fogja táplálni, bár ehhez a projekthez a sok alternatíva egyikét is használhatja. Létrehozunk egy alapjátékot is, ahol a vezérlőjét használva elkerülheti az eső tárgyakat és lelassíthatja az időt.





Ehhez a projekthez szüksége lesz

  • Arduino vagy hasonló mikrovezérlő
  • 1 x 10 k ohmos ellenállás
  • 1 x pillanatnyi kapcsoló
  • 1 x potenciométer
  • Csatlakoztatható vezetékek
  • Egy kenyértábla
  • Unity játék motor
  • Az Uniduino bővítmény az Unity Asset Store -ból (30 USD)
  • Teljes projektkód, ha nem szeretné kiírni (nem tartalmazza az Uniduino bővítményt)

A legtöbb ilyen dolog Arduino kezdő készletben érhető el. Ha nem rendelkezik kezdő készlettel, nézze meg útmutatónkat, hogy kiválassza az Önnek legmegfelelőbbet.





A vezérlőt tetszés szerint bonyolíthatja, bár ebben a példában beállítunk egy potenciométert és egy gombot - tökéletes egy egyszerű arcade játék vezérléséhez.

A vezérlő összeszerelése

Állítsa be a kenyeretáblát és az Arduino -t az alábbi képen látható módon. Ezt fogjuk játékvezérlőként használni, bár szinte ugyanazt a beállítást használhatja, mint a DIY midi vezérlő is!



Az Arduino előkészítése

Miután mindent bekötött, csatlakoztassa Arduino -ját USB -n keresztül. Az Arduino Software IDE -ben lépjen a Eszközök> Tábla és Eszközök> Port kiválaszthatja, hogy melyik mikrokontrollert és portot használja. Az Arduino IDE -t a szükséges vázlathoz mellékeljük, és megtalálja Fájl> Példák> Firmata> StandardFirmata . Kattintson a Feltöltés gombra, és készen áll az indulásra.

Ha új vagy az Arduino -ban, és kissé olvad a fejed, nézd meg a mi oldalunkat Kezdő útmutató hogy könnyebben beszélhessen a számítógéppel.





Az Unity projekt beállítása

Nyissa meg az Unity -ben Ablak> Eszközbolt hogy hozzáférjen az Unity Eszközboltjához a Unity Editorban. Keresse meg az eszközboltban az Uniduino bővítményt. Ez a beépülő modul lehetővé teszi, hogy adatokat fogadjon és küldjön az Unity -n belüli Arduino csapjaiba és onnan. A bővítmény az írás idején 30 dollárba kerül. Lehetséges hogy ezt a projektet a plugin megvásárlása nélkül hajtsa végre, bár ez sokkal bonyolultabb, és a beépülő modult kényelmesebbnek találhatja.

Ez a videó a beépülő modul készítőitől végigvezeti a tesztelés folyamatán, hogy minden működik, valamint az első beállítással együtt. Vegye figyelembe, hogy előfordulhat, hogy vissza kell állítania a Unity szerkesztőt a Windows rendszeren.





Ugyanezzel a tesztpanellel tesztelhetjük a vezérlőnket. Állítsa a D2 tűt INPUT és Digital állásba. Lejjebb állítsa az A5 tűt ANALÓGUS állásba. A potenciométernek és a gombnak most az értékeket kell megjelenítenie a képernyőn a pin -számok mellett. Előrehalad!

Most készítsünk valamit, amit irányíthatunk

Tehát van vezérlőnk, de mit irányítsunk? Nos, a lehetőségek végtelenek, de ma egy nagyon egyszerű kitérő játékot készítünk, hogy kipróbáljuk új vezérlőrendszerünket. Elég gyorsan haladunk a játék beállításaival, így ha teljesen új vagy a Unity motorban, megtalálhatja a miénk Unity Game Programming Kezdő útmutató hasznos a csapágyak megszerzéséhez.

Egy nagyon egyszerű játékot fogunk felépíteni, amelyben az a célod, hogy balról jobbra kerüld a gömbödet, hogy elkerüld a leeső kockákat, ami az újonnan készített egyedi vezérlődet fogja használni.

Hozzon létre egy új jelenetet, és húzza ki az Uniduino előregyártott elemet Eszközök> Uniduino> Előregyártott elemek a hierachiába, és húzza az Uniduino előregyártott elemet a hierarchiába. Szükségünk van rá, hogy beszélgessünk a játék és a kontroller között.

Az Unity hierarchiában kattintson Létrehozás> Gömb és használja az Átformálás fület az Inspectorban, hogy áthelyezze a játék képernyőjének aljára.

Itt az ideje a kódolásnak

Most hozzá kell adni egy kódot ehhez a párthoz. Ha a gömb a Hierarchiában van kiválasztva, kattintson a gombra Komponens hozzáadása> Új szkript az Inspector ablak alján. Nevezd meg sphereMover és válassza ki C Éles a legördülő menüből. Kattintson Létrehozás és hozzáadás és a szkript hozzáadódik a GameObject -hez. Kattintson duplán a szkript megnyitásához, és írja be ezt a kódot:

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

Szánjon rá egy percet, és olvassa el a kóddal kapcsolatos megjegyzéseket. Eddig néhány változót jelentettünk be az Arduino -ra, a csapjaira és a gömbünkre. Mi is használtuk a

Indítsa el és konfigurálja a Pins módszereket az Arduino inicializálásához futási időben. Mentsük el a szkriptünket, és menjünk vissza a Unity szerkesztőbe, és nézzük meg, mi változott.

Most láthatjuk nyilvános változóinkat az Inspector ablakban. Lássuk, mit léphetünk be ebben a szakaszban, hogy később segítsünk. A korábbi konstrukciónkból tudjuk, hogy milyen csapokat használunk az Arduino -n, és beírhatjuk őket. Korábbi kísérletünkből is tudjuk, hogy milyen messzire szeretnénk, ha gömbünk képes lenne jobbra -balra haladni, hogy ne essen le a képernyőről. Most írja be ezeket az értékeket.

Az élet első jelei

Itt az ideje, hogy valóban lássuk az Arduino értékeit az Unity Editorban. Egyelőre hozzáadhatunk egy sor kódot a sphereMover szkriptünk Frissítés funkciójához, és újra elmenthetjük a szkriptet.

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

Most, hogy a potValue változónkat minden keretben frissítjük, láthatjuk annak értékét valós időben az Unity Inspectorban. Mielőtt tesztelnénk, most jó alkalom lenne ellenőrizni, hogy az Uniduino csatlakozó a megfelelő porton hallgat -e. Kattintson az Uniduino elemre a Heirarchy -ban, és ellenőrizze a port nevét az Inspectorban. Ha üres, töltse ki az Arduino megfelelő portszámát. Ebben az esetben ez a COM4 volt, bár az Ön számára más lehet. Ellenőrizze az Arduino IDE használatával, ha nem biztos benne.

Válassza ki a körét a hierarchiában, és kattintson a képernyő tetején található Lejátszás gombra. A rendszernek néhány másodpercre van szüksége az inicializáláshoz, ezután látni kell, hogy a potenciométer változása megváltozik az ellenőrben, amikor a potenciométert mozgatja.

Most beszélünk! Nos, szigorúan véve az Unity és az Arduino beszél, de ki számol? Ha idáig eljutott, és nem látja az értékváltozást az ellenőrben, ellenőrizze a beállítási lépéseket, és győződjön meg arról, hogy a megfelelő port van kiválasztva az Arduino számára.

Mozdítsuk el ezt a szférát

Most, hogy a potValue változót frissítjük, ezt az értéket szeretnénk használni a szféránk mozgatásához. Amikor a potenciométer teljesen balra van, azt akarjuk, hogy a gömb a képernyő bal oldalán legyen, és fordítva. Az Unity -ben lévő objektumok a vektor tér egy pontján vannak elhelyezve, annak értékei határozzák meg Átalakítás.pozíció . Az alábbi képen, ahol a gömb a legtávolabbi ponton van balra, amit szeretnénk, láthatja, hogy a pozícióvektor 9,5, -4, 0.

Szeretnénk befolyásolni a gömb X helyzetét. Sajnos a potenciométerünkből származó értékek közvetlen használata nem fog működni, mivel amikor a potenciométer teljesen balra van, 0 értéket ad - ami a gömbünket a képernyő közepére helyezi. A másik végletben a potenciométer felső értéke, 1023, a kockát a képernyő jobb oldalán helyezné el. Nem hasznos. Amire itt szükségünk van, az egy kis matematika.

Miért teszi a matek, ha az egység megteszi helyetted?

Azoknak, akik rettegnek attól, hogy értelmetlen számokkal borított papírlapot bámulnak (bár vannak nagyszerű weboldalak ez segíthet a matematika tanulásában), ne félj. Szükségünk van arra, hogy a potenciométer értékeink megfeleljenek gömbünk X helyzetének. Szerencsére használhatunk egy Bővítési módszer .

A kiterjesztési módszer egy olyan szkript, amely meghatározott feladatot lát el számunkra. Ebben az esetben megadjuk neki a meglévő értékeket, és visszaadja őket egymáshoz leképezve, készen arra, hogy sphereMover forgatókönyv. A Projekt panel tetején kattintson a gombra Létrehozás> C# szkript és nevezze ExtensionMethods. Írja be az alábbi kódot a szkriptbe:

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

Mentse el a szkriptet, és térjen vissza a sphereMover szkripthez. Ezt a Remap funkciót használhatjuk az ExtensionMethods szkriptünkben a Frissítés funkcióban, hogy a potenciométereink értékeit felhasználható értékekké alakítsuk a játékunkban. Írja be a következőt a potValue változóhoz:

A felszólítás azt mutatja, hogy a Remapunk két Feladó és Cél értékkészletet vesz fel, és együtt képezi le őket. Ebbe beleírhatjuk értékeinket.

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

Mentse el a szkriptet, menjen vissza az Unity szerkesztőbe, és nyomja meg a lejátszás gombot. Most látnia kell, hogy a Mapped Pot változó megváltozik, amikor a potenciométert mozgatja, hogy megfeleljen a bal és jobb oldalunkra meghatározott értékeknek. Szánjon egy percet hátra, és köszönje meg ExtensionMethods szkriptjét. Nincs számológép a láthatáron.

Megjegyzés: ha észreveszi, hogy az értékek megfordulnak, tehát amikor a potenciométer egészen jobbra van, negatív értéket kap a Mapped Pot változóhoz, előfordulhat, hogy rosszul állította be a potenciométert. Szerencsére ezt az újbóli bekötés nélkül kijavíthatja. Egyszerűen átválthatja az értékeket, amikor újratelepíti őket:

Most végre használható értékeink vannak. Most már nincs más hátra, mint hozzárendelni ezeket az értékeket szféránk X pozíciójához:

ingyenes filmek regisztráció vagy letöltés nélkül
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Mentse el a szkriptet, menjen vissza az Unity szerkesztőbe, és nyomja meg a play gombot. Most már képesnek kell lennie a gömb balra és jobbra mozgatására a potenciométer segítségével!

A gomb működtetése

Most, hogy a szféránk mozog, nem lenne jó, ha módunk lenne egy kicsit lelassítani a dolgokat, amikor szűk helyzetbe kerülünk? A gombbal fogjuk lassítani az időt a játékunkban. Nyissa meg a sphereMover parancsfájlt, és adja hozzá ezt a kódot a Frissítés funkcióhoz

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

Most megvan a játékunk mechanikája, adjunk hozzá néhány akadályt! A gömb természetes ellenségét, a kockát fogjuk használni. A hierarchiában kattintson a gombra Létrehozás> 3D objektum> Kocka . A kocka ellenőrében, Komponens> Fizika> Rigidbody hozzáadása . Állítsa a merevtest húzási értékét 5 -re. Ezenkívül az ellenőr Box -ütköző összetevője alatt válassza az Is Trigger lehetőséget. Ez lehetővé teszi számunkra, hogy észleljük a gömbünkkel való ütközést.

Hozzon létre egy szkriptet a kockán, és hívja fel ütközikWithSphere , nyissa meg a szkriptet, és törölje a Start és frissítés funkciókat, mivel ezúttal nem lesz rájuk szükség. Írja be ezt a kódot:

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

Az OnTriggerEnter üzenetet küld, amikor a trigger ütköző elüt egy másik ütközőt. Ebben az esetben azt mondjuk neki, hogy pusztítson el mindent, amit érint. Mentse el a szkriptet, és menjen vissza a Unity szerkesztőbe. Húzza a kockát a hierarchiából a Projekt panelre. Észre fogja venni, hogy a kocka szövege kékre vált a hierarchiában. Ez azért van, mert létrehoztunk egy előregyártott elemet, és elmentettük a projektünkbe. Most törölje a kockát a hierarchiából.

Most már csak egy forgatókönyvre van szükségünk a kockák létrehozásához. A hierarchiában kattintson Létrehozás> Üres létrehozása , és nevezze át Game Manager -be az Inspectorban, és adjon hozzá egy scriptet gameManager néven. Nyissa meg a szkriptet, és adja hozzá ezt a kódot:

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

}
}

Mentse el a szkriptet. Visszatérve a szerkesztőbe, válassza ki a Game Manager -t a hierarchiában, és húzza a kocka előlapját a projektpanelről az Inspector Cube változójába. Itt is töltse ki az ívás értékeit. Fikázhat vele, hogy olyan kemény vagy könnyű legyen, amennyire csak akarja. Ne feledje, hogy érdemes a legalacsonyabb kockákat olyan magasra ívni, hogy az Uniduino képes legyen inicializálni - a játék elvesztése a mozgás előtt frusztráló lehet!

A kész projekt

Most, amikor megnyomja a play gombot, a kockák fölötted ívnak és leesnek. Használhatja a potenciométert, hogy elkerülje őket, és a gombjával lassíthatja az időt.

Ebben a projektben létrehoztunk egy egyéni vezérlőt egy Arduino -val, konfiguráltuk a Unityot és az Uniduino -t, hogy kommunikáljon vele, és egy egyszerű játékot készítettünk annak tesztelésére. Az itt található fogalmak szinte minden projektre alkalmazhatók, sőt vannak játéklekvárok, amelyek az egyéni vezérlőkre specializálódtak .

Az Arduino és a Unity segítségével szinte bármiből létrehozhat egyéni vezérlőt. Létrehoztál egy hifit, amely egy űrhajót irányít? Kenyérpirító, amely egy platformjátékot irányít?

Ha csináltál ilyen projektet, szívesen megnézném! Tedd közzé az alábbi megjegyzésekben!

Részvény Részvény Csipog Email 6 hallható alternatíva: A legjobb ingyenes vagy olcsó hangoskönyv -alkalmazások

Ha nem szeretne fizetni a hangoskönyvekért, íme néhány nagyszerű alkalmazás, amelyek segítségével ingyen és legálisan hallgathatja azokat.

Olvassa tovább
Kapcsolódó témák
  • DIY
  • Programozás
  • Arduino
  • Játékvezérlő
  • Játékfejlesztés
A szerzőről Ian Buckley(216 megjelent cikk)

Ian Buckley szabadúszó újságíró, zenész, előadó és videó producer, Berlinben, Németországban él. Amikor éppen nem ír vagy a színpadon, barkácsol elektronikával vagy kóddal, abban a reményben, hogy őrült tudós lesz.

Bővebben: Ian Buckley

Iratkozzon fel hírlevelünkre

Csatlakozz hírlevelünkhöz, ahol technikai tippeket, értékeléseket, ingyenes e -könyveket és exkluzív ajánlatokat találsz!

Feliratkozáshoz kattintson ide
Kategória Diy