Ako vytvoriť vlastný herný ovládač s Arduino a Unity

Ako vytvoriť vlastný herný ovládač s Arduino a Unity

Už ste niekedy chceli navrhnúť svoj vlastný herný ovládač? Je to jednoduchšie, ako si myslíte!





V tomto krátkom projekte vytvoríme jednoduchý vlastný herný ovládač, ktorý použijete v hernom engine Unity. Tento ovládač bude poháňať Arduino Uno, aj keď aj pre tento projekt môžete použiť jednu z mnohých alternatív. Vytvoríme tiež základnú hru, kde budete pomocou ovládača vyhýbať padajúcim predmetom a spomaľovať čas.





Na tento projekt budete potrebovať

  • Arduino alebo podobný mikrokontrolér
  • Rezistor 1 x 10 kOhm
  • 1 x Momentový spínač
  • 1 x potenciometer
  • Pripojovacie vodiče
  • Chlebník
  • Herný engine Unity
  • Doplnok Uniduino z Unity Asset Store (30 dolárov)
  • Kompletný kód projektu, v prípade, že ho nechcete zapísať (neobsahuje doplnok Uniduino)

Väčšina týchto vecí je k dispozícii v štartovacej súprave Arduino. Ak nemáte štartovaciu sadu, prečítajte si nášho sprievodcu, ktorý vám pomôže vybrať si tú najlepšiu.





Ovládač si môžete ľubovoľne komplikovať, aj keď v tomto prípade nastavíme potenciometer a tlačidlo - ideálne na ovládanie jednoduchej arkádovej hry.

Zostavenie ovládača

Nastavte svoj breadboard a Arduino tak, ako je to znázornené na obrázku nižšie. Toto budeme používať ako náš herný ovládač, aj keď by ste mohli použiť takmer úplne rovnaké nastavenie ako DIY midi ovládač tiež!



Príprava vášho Arduina

Akonáhle budete mať všetko zapojené, pripojte svoje Arduino cez USB. V softvéri Arduino IDE prejdite na Nástroje> Doska a Nástroje> Port vyberte, ktorý mikrokontrolér a port používate. Arduino IDE je dodávaný s náčrtkom, ktorý potrebujeme, a nájdete ho pod Súbor> Príklady> Firmata> StandardFirmata . Kliknite na položku Nahrať a budete pripravení ísť.

Ak ste v Arduine noví a vaša hlava sa mierne topí, pozrite sa na náš Príručka pre začiatočníkov aby ste sa s ním dobre porozprávali s počítačom.





Nastavenie vášho projektu Unity

V Unity otvorte Okno> Obchod s majetkom na prístup do obchodu s majetkom Unity z editora Unity. V obchode Asset Store vyhľadajte doplnok Uniduino. Tento doplnok vám umožní prijímať a odosielať údaje do a z vašich pinov Arduino v rámci Unity. Doplnok v čase písania článku stojí 30 dolárov. To je možné vykonať tento projekt bez zakúpenia doplnku, aj keď je to oveľa komplikovanejšie a doplnok sa vám môže zdať pohodlnejší.

Toto video od tvorcov doplnku vás prevedie testovaním, či všetko funguje, ako aj prvým nastavením. Upozorňujeme, že možno budete musieť resetovať aj editor Unity v systéme Windows.





Ten istý testovací panel môžeme použiť na testovanie nášho ovládača. Nastavte pin D2 na INPUT a Digital. Ďalej nadol nastavte kolík A5 na ANALOG. Váš potenciometer a tlačidlo by teraz mali zobrazovať hodnoty na obrazovke vedľa ich čísel PIN. Pokrok!

Teraz urobme niečo, čo môžeme ovládať

Máme teda ovládač, ale čo budeme ovládať? Možnosti sú nekonečné, ale dnes vytvoríme veľmi jednoduchú uhýbajúcu hru, aby sme vyskúšali náš nový riadiaci systém. Celkom rýchlo prejdeme herným nastavením, takže ak ste v engine Unity úplní nováčikovia, možno nájdete ten náš Príručka začiatočníka pre programovanie hier Unity užitočné zorientovať sa.

Postavíme úplne základnú hru, v ktorej sa budete snažiť vyhnúť svojej sfére vľavo a vpravo, aby ste zabránili padaniu kociek, a ktorá bude využívať váš novo vyrobený vlastný ovládač.

Vytvorte novú scénu a presuňte z nej panelák Uniduino Majetok> Uniduino> Montované stavby do svojej hierarchie a pretiahnite montovaný panel Uniduino do hierarchie. Potrebujeme to tam, aby sme mohli hovoriť medzi našou hrou a ovládačom.

V hierarchii Jednota kliknite na Vytvoriť> Sféra a pomocou karty Transform v inšpektorovi ju presuňte do spodnej časti hernej obrazovky.

Je čas na kódovanie

Teraz pridajte k tejto párty nejaký kód. Sférou vybranou v hierarchii kliknite na Pridať komponent> Nový skript v spodnej časti okna inšpektora. Pomenujte to guľaPohyb a vyberte C Sharp z rozbaľovacej ponuky. Kliknite Vytvoriť a pridať a skript bude pridaný do GameObject. Dvakrát naň kliknite a otvorte skript a zadajte tento kód:

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

Nájdite si chvíľu na prečítanie komentárov k kódu. Zatiaľ sme deklarovali niekoľko premenných pre naše Arduino, jeho piny a našu sféru. Tiež sme použili

Metódy Štart a ConfigurePins na inicializáciu nášho Arduina za behu. Uložme si skript a vráťte sa do editora Unity a zistite, čo sa zmenilo.

V okne Inšpektor teraz môžeme vidieť naše verejné premenné. Pozrime sa, čo môžeme v tejto fáze zadať, aby nám to pomohlo neskôr. Z našej zostavy vieme, aké piny používame na Arduine, môžeme ich zadať. Z nášho experimentu tiež vieme, ako ďaleko chceme, aby naša sféra mohla cestovať vľavo a vpravo, aby nespadla z obrazovky. Teraz zadáme tieto hodnoty.

Prvé známky života

Je načase skutočne vidieť hodnoty z nášho Arduina v editore Unity. Zatiaľ môžeme do funkcie Aktualizácia skriptu sphereMover pridať jeden riadok kódu a skript znova uložiť.

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

Teraz, keď máme premennú potValue aktualizovanú v každom rámci, môžeme v nástroji Unity Inspector vidieť jej hodnotu v reálnom čase. Predtým, ako to vyskúšame, by bolo vhodné skontrolovať, či plug -in Uniduino počúva na správnom porte. V Heirarchii kliknite na Uniduino a v inšpektorovi skontrolujte názov portu. Ak je prázdne, zadajte správne číslo portu pre vaše Arduino. V tomto prípade to bol COM4, ​​aj keď to môže byť pre vás iné. Ak si nie ste istí, skontrolujte to pomocou Arduino IDE.

Vyberte svoju sféru v hierarchii a kliknite na tlačidlo Prehrať v hornej časti obrazovky. Systém potrebuje niekoľko sekúnd na inicializáciu, potom by ste pri pohybe potenciometra mali začať v inšpektorovi vidieť zmenu premennej Pot Value.

Teraz hovoríme! Stručne povedané, Unity a Arduino hovoria, ale kto počíta? Ak ste sa dostali až sem a nevidíte zmenu hodnoty v inšpektorovi, skontrolujte kroky nastavenia a uistite sa, že ste pre svoj Arduino vybrali správny port.

Presuňme túto sféru

Teraz, keď máme aktualizovanú premennú potValue, chceme túto hodnotu použiť na pohyb našej sféry. Keď je potenciometer úplne vľavo, chceme, aby bola guľa na ľavej strane obrazovky a naopak. Objekty v jednote sú umiestnené v bode vo vektorovom priestore určenom jeho hodnotami Transformácia.pozícia . Na nasledujúcom obrázku, kde je guľa v najvzdialenejšom bode vľavo, by sme ju chceli vidieť, vidíte, že jej polohový vektor je 9,5, -4, 0.

Chceme ovplyvniť polohu X sféry. Bohužiaľ, použitie hodnôt z nášho potenciometra priamo nebude fungovať, pretože keď je potenciometer úplne vľavo, dáva hodnotu 0 -, čo by našu sféru dostalo priamo do stredu obrazovky. V opačnom prípade by najvyššia hodnota potenciometra 1023 umiestnila kocku vpravo od našej obrazovky. Nepoužiteľné. Potrebujeme tu matematiku.

Prečo robiť matematiku, keď to za vás urobí jednota?

Pre tých z vás, ktorí sa tam obávajú, hľadia na kus papiera pokrytý nezmyselnými číslami (aj keď existuje niekoľko skvelé webové stránky ktorý vám môže pomôcť naučiť sa matematiku), nebojte sa. Potrebujeme spôsob, ako dosiahnuť, aby hodnoty našich potenciometrov zodpovedali pozícii X našej gule. Našťastie môžeme použiť príponu Metóda rozšírenia .

Metóda rozšírenia je skript, ktorý pre nás vykonáva konkrétnu prácu. V tomto prípade mu dáme hodnoty, ktoré máme, a vráti ich navzájom mapované, pripravené na použitie v našom guľaPohyb skript. V hornej časti panelu Projekt kliknite na Vytvoriť> C# skript a pomenujte ho ExtensionMethods. Do skriptu zadajte nasledujúci kód:

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

Uložte skript a vráťte sa k skriptu sphereMover. Túto funkciu Remap teraz môžeme použiť v skripte ExtensionMethods v našej aktualizačnej funkcii na konverziu hodnôt našich potenciometrov na použiteľné hodnoty v našej hre. Tam, kde sme práve priradili premennú potValue, zadajte nasledujúci príkaz:

Výzva nám ukazuje, že náš Remap obsahuje dve sady hodnôt Od a Do a mapuje ich dohromady. Do toho môžeme zadať svoje hodnoty.

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

Uložte svoj skript, vráťte sa do editora Unity a kliknite na tlačidlo Prehrať. Teraz by ste mali vidieť, že premenná Mapped Pot sa mení, keď pohybujete potenciometrom, aby zodpovedala hodnotám, ktoré sme určili pre náš ľavý a pravý okraj. Chvíľu sa posaďte a poďakujte svojmu skriptu ExtensionMethods. Nie je v dohľade kalkulačka.

Poznámka: Ak si všimnete, že sú vaše hodnoty obrátené, takže keď je váš potenciometer úplne vpravo, pre svoju premennú Mapped Pot dostanete zápornú hodnotu, pravdepodobne budete mať potenciometer nastavený nesprávne. Našťastie to môžete opraviť bez akéhokoľvek prepájania. Hodnoty môžete jednoducho prepnúť, keď ich premapujete:

Teraz máme konečne použiteľné hodnoty. Teraz už len zostáva priradiť tieto hodnoty k polohe X našej sféry:

bezplatná televízia online bez registrácie
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Uložte svoj skript, vráťte sa do editora Unity a stlačte tlačidlo Prehrať. Teraz by ste mali byť schopní presúvať svoju sféru doľava a doprava pomocou potenciometra!

Uvedenie tlačidla do činnosti

Teraz, keď sa naša sféra pohybuje, nebolo by pekné mať spôsob, ako trochu spomaliť veci, keď sa dostaneme do úzkych? Použijeme svoje tlačidlo na spomalenie času v našej hre. Otvorte skript sphereMover a pridajte tento kód do funkcie Aktualizácia

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

Teraz máme mechaniku našej hry, pridajme niekoľko prekážok! Budeme používať prirodzeného nepriateľa sféry, kocku. V hierarchii kliknite na Vytvoriť> 3D objekt> Kocka . V inšpektorovi kocky Pridajte komponent> fyzika> pevné telo . Nastavte hodnotu Drag tuhého telesa na 5. Tiež v rámci komponentu Box Collider v inšpektorovi zvoľte Is Trigger. To nám umožní odhaliť kolízie s našou sférou.

Vytvorte skript na kocke a zavolajte ho collideWithSphere , otvorte skript a odstráňte funkcie Štart a Aktualizácia, pretože ich tentokrát nebudeme potrebovať. Zadajte tento kód:

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

OnTriggerEnter odošle správu vždy, keď spúšťač zrážok narazí na iný urýchľovač. V tomto prípade mu hovoríme, aby zničil čokoľvek, čoho sa dotkne. Uložte skript a vráťte sa do editora Unity. Presuňte kocku z hierarchie na panel Projekt. Všimnete si, že text kocky v hierarchii zmodral. Dôvodom je, že sme vytvorili montovaný dom a uložili ho do nášho projektu. Teraz odstráňte svoju kocku z hierarchie.

Všetko, čo teraz potrebujeme, je skript na rozmnožovanie kociek. V hierarchii kliknite na Vytvoriť> Vytvoriť prázdne , a premenujte ho na Game Manager v inšpektorovi a pridajte k nemu skript s názvom gameManager. Otvorte skript a pridajte tento kód:

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

}
}

Uložte skript. Späť v editore vyberte v hierarchii Game Manager a presuňte svoj panelák z kocky na panel projektu do premennej kocky v inšpektorovi. Aj tu vyplňte hodnoty pre svoje trenie. Môžete si s ním pohrávať, aby bol taký ťažký alebo ľahký, ako sa vám páči. Všimnite si toho, že stojí za to dať svoje najnižšie kocky dostatočne vysoko, aby sa Uniduino mohol inicializovať - ​​prehrať hru skôr, ako sa budete môcť pohybovať, môže byť frustrujúce!

Hotový projekt

Keď teraz stlačíte tlačidlo hrať, kocky sa nad vami vytvoria a spadnú. Aby ste sa im vyhli, môžete použiť potenciometer a pomocou tlačidla spomaliť čas.

V tomto projekte sme vytvorili vlastný ovládač s Arduinom, nakonfigurovali sme Unity a Uniduino na komunikáciu s ním a vytvorili sme jednoduchú hru na testovanie. Tu uvedené koncepty je možné použiť na takmer akýkoľvek projekt a existujú dokonca herné zápchy, ktoré sa špecializujú na vlastné ovládače .

S Arduino a Unity si môžete vytvoriť vlastný ovládač takmer z čohokoľvek. Vytvorili ste hi-fi, ktoré ovláda vesmírnu loď? Opekačka, ktorá ovláda plošinovú hru?

Ak ste urobili takýto projekt, rád by som ho videl! Napíšte to do komentárov nižšie!

zdieľam zdieľam Tweet E -mail 6 zvukových alternatív: najlepšie bezplatné alebo lacné aplikácie pre zvukové knihy

Ak nechcete platiť za audioknihy, tu je niekoľko skvelých aplikácií, ktoré vám umožnia počúvať ich bezplatne a legálne.

Čítajte ďalej
Súvisiace témy
  • DIY
  • Programovanie
  • Arduino
  • Herný ovládač
  • Vývoj hry
O autorovi Ian Buckley(216 publikovaných článkov)

Ian Buckley je nezávislý novinár, hudobník, performer a producent videa žijúci v Berlíne v Nemecku. Keď nepíše, alebo nie je na javisku, pohráva si s elektronikou alebo kódom pre domácich majstrov v nádeji, že sa stane šialeným vedcom.

Viac od Iana Buckleyho

prihlásiť sa ku odberu noviniek

Pripojte sa k nášmu bulletinu a získajte technické tipy, recenzie, bezplatné elektronické knihy a exkluzívne ponuky!

Kliknutím sem sa prihlásite na odber
Kategórie Diy