Jak vytvořit vlastní herní ovladač s Arduino a Unity

Jak vytvořit vlastní herní ovladač s Arduino a Unity

Přáli jste si někdy navrhnout vlastní herní ovladač? Je to jednodušší, než si myslíte!





V tomto krátkém projektu postavíme jednoduchý vlastní herní ovladač pro použití s ​​herním enginem Unity. Tento ovladač bude poháněn Arduino Uno, i když pro tento projekt můžete použít jednu z mnoha alternativ. Vytvoříme také základní hru, kde budete pomocí ovladače vyhýbat padajícím předmětům a zpomalovat čas.





Pro tento projekt budete potřebovat

  • Arduino nebo podobný mikrokontrolér
  • 1 x 10k Ohm odpor
  • 1 x Momentový spínač
  • 1 x potenciometr
  • Propojovací dráty
  • Prkénko
  • Unity herní engine
  • Plugin Uniduino z Unity Asset Store (30 $)
  • Dokončete kód projektu v případě, že jej nechcete napsat (neobsahuje plugin Uniduino)

Většina z těchto věcí je k dispozici ve startovací sadě Arduino. Pokud nemáte startovací sadu, podívejte se do našeho průvodce výběrem toho nejlepšího pro vás.





Ovladač si můžete libovolně komplikovat, i když v tomto případě nastavíme potenciometr a tlačítko - ideální pro ovládání jednoduché arkádové hry.

Sestavení ovladače

Nastavte svůj prkénko a Arduino podle obrázku níže. To je to, co budeme používat jako náš herní ovladač, i když můžete použít téměř úplně stejné nastavení jako DIY midi ovladač také!



Příprava Arduina

Jakmile budete mít vše zapojené, připojte své Arduino přes USB. V Arduino Software IDE přejděte na Nástroje> Deska a Nástroje> Port vyberte, který mikrokontrolér a port používáte. Arduino IDE je dodáváno s náčrtem, který potřebujeme, a najdete ho pod Soubor> Příklady> Firmata> StandardFirmata . Klikněte na Nahrát a budete připraveni jít.

Pokud jste v Arduinu noví a vaše hlava se mírně taví, podívejte se na naši Průvodce pro začátečníky aby vám to pomohlo hezky mluvit s počítačem.





Nastavení vašeho projektu Unity

V Unity otevřete Okno> Sklad majetku pro přístup do úložiště majetku Unity z editoru Unity. Vyhledejte v obchodě Asset plugin Uniduino. Tento plugin vám umožní přijímat a odesílat data do az vašich pinů Arduino uvnitř Unity. Plugin v době psaní článku stojí 30 $. To je možné provést tento projekt bez zakoupení pluginu, i když je to poněkud komplikovanější a plugin vám může připadat pohodlnější po všech stránkách.

Toto video od tvůrců pluginu vás provede procesem testování, zda vše funguje, spolu s prvním nastavením. Všimněte si, že budete muset také resetovat editor Unity v systému Windows.





Stejný testovací panel můžeme použít k otestování našeho ovladače. Nastavte pin D2 na INPUT a Digital. Dále dolů nastavte Pin A5 na ANALOG. Váš potenciometr a tlačítko by nyní měly zobrazovat hodnoty na obrazovce vedle čísel pinů. Pokrok!

Nyní vytvořte něco, co můžeme ovládat

Máme tedy ovladač, ale co budeme ovládat? Možnosti jsou nekonečné, ale pro dnešek vytvoříme velmi jednoduchou uhýbající hru, abychom vyzkoušeli náš nový řídicí systém. Poměrně rychle se přesuneme přes nastavení hry, takže pokud jste v enginu Unity úplně noví, můžete najít ten náš Průvodce začátečníka pro programování her Unity užitečné zorientovat se.

Postavíme velmi základní hru, ve které je vaším cílem uhnout vaší sféře doleva a doprava, abyste se vyhnuli padajícím kostkám, což bude využívat váš nově vyrobený vlastní ovladač.

Vytvořte novou scénu a přetáhněte z ní panel Uniduino Majetek> Uniduino> Montované stavby do své hierarchie a přetáhněte panelák Uniduino do hierarchie. Potřebujeme to, abychom mohli mluvit mezi naší hrou a ovladačem.

V hierarchii Unity klikněte na Vytvořit> Koule a pomocí karty Transform v inspektoru ji přesuňte do spodní části herní obrazovky.

Je čas na kódování

Nyní přidejte do této party nějaký kód. S sférou vybranou v hierarchii klikněte Přidat komponentu> Nový skript ve spodní části okna inspektora. Pojmenuj to koule a vyberte Cis z rozbalovací nabídky. Klikněte Vytvořit a přidat a skript bude přidán do GameObject. Poklepáním na něj otevřete skript a zadejte 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);
}
}

Najděte si chvilku na přečtení komentářů ke kódu. Zatím jsme deklarovali některé proměnné pro naše Arduino, jeho piny a naši sféru. Také jsme použili

Metody Start a ConfigurePins k inicializaci našeho Arduina za běhu. Uložíme náš skript a vrátíme se do editoru Unity a uvidíme, co se změnilo.

Nyní můžeme naše veřejné proměnné vidět v okně Inspector. Podívejme se, co můžeme v této fázi zadat, aby nám to pomohlo později. Z naší sestavy víme, jaké piny používáme na Arduinu, můžeme je zadat. Z našeho experimentu také dříve víme, jak daleko chceme, aby naše koule mohla cestovat vlevo a vpravo, aby nespadla z obrazovky. Pojďme nyní zadat tyto hodnoty.

První známky života

Je načase skutečně vidět hodnoty z našeho Arduina v editoru Unity. Prozatím můžeme do funkce Aktualizace skriptu sphereMover přidat jeden řádek kódu a skript znovu uložit.

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

Nyní, když se naše proměnná potValue aktualizuje v každém snímku, vidíme její hodnotu v reálném čase v Unity Inspector. Než to vyzkoušíme, nyní by bylo vhodné zkontrolovat, zda zásuvný modul Uniduino naslouchá na správném portu. Klikněte na Uniduino v Heirarchy a zkontrolujte, zda je to název portu v inspektoru. Pokud je prázdné, zadejte správné číslo portu pro vaše Arduino. V tomto případě to byl COM4, ​​i když to pro vás může být jiné. Pokud si nejste jisti, zkontrolujte pomocí IDE Arduino.

Vyberte svou sféru v hierarchii a klikněte na tlačítko Přehrát v horní části obrazovky. Systém potřebuje několik sekund k inicializaci, poté byste měli vidět změnu proměnné Pot Value v inspektoru při pohybu potenciometru.

Teď mluvíme! Přesně řečeno, Unity a Arduino mluví, ale kdo to počítá? Pokud jste se dostali tak daleko a nevidíte změnu hodnoty v inspektoru, zkontrolujte kroky nastavení a ujistěte se, že jste pro svůj Arduino vybrali správný port.

Přesuňme tuto sféru

Nyní, když jsme aktualizovali proměnnou potValue, chceme tuto hodnotu použít k přesunu naší sféry. Když je potenciometr úplně doleva, chceme, aby byla koule na levé straně obrazovky a naopak. Objekty v jednotě jsou umístěny v bodě ve vektorovém prostoru určeném jeho hodnotami Transformace. Pozice . Na obrázku níže, kde je koule v nejvzdálenějším bodě vlevo, kterou bychom chtěli, můžete vidět, že její polohový vektor je 9,5, -4, 0.

Chceme ovlivnit polohu X koule. Přímé použití hodnot z našeho potenciometru bohužel nebude fungovat, protože když je potenciometr úplně vlevo, dává hodnotu 0 - což by naši kouli dostalo přímo doprostřed obrazovky. V opačném případě by nejvyšší hodnota potenciometru, 1023, umístila kostku zcela vpravo od naší obrazovky. Neužitečný. Co zde potřebujeme, je nějaká matematika.

Proč dělat matematiku, když to za vás udělá jednota?

Pro ty z vás, kteří se děsí, hledí na papír pokrytý nesmyslnými čísly (i když existují skvělé webové stránky To vám může pomoci naučit se matematiku), nebojte se. Potřebujeme způsob, jak zajistit, aby hodnoty našich potenciometrů odpovídaly poloze X naší koule. Naštěstí můžeme použít Metoda rozšíření .

Metoda rozšíření je skript, který pro nás provádí konkrétní práci. V tomto případě mu dáme hodnoty, které máme, a vrátí je navzájem mapované, připravené k použití v našem koule skript. V horní části panelu Projekt klikněte na Vytvořit> C# skript a pojmenujte ho ExtensionMethods. Do skriptu zadejte níže uvedený 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 vraťte se do skriptu sphereMover. Tuto funkci Remap nyní můžeme použít v našem skriptu ExtensionMethods ve funkci Update k převodu hodnot našich potenciometrů na použitelné hodnoty v naší hře. V části, kde jsme právě přiřadili proměnnou potValue, zadejte následující:

Výzva nám ukazuje, že náš Remap přebírá dvě sady hodnot Od a Do a mapuje je dohromady. Můžeme do toho zadat své hodnoty.

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

Uložte skript, vraťte se do editoru Unity a stiskněte tlačítko Přehrát. Nyní byste měli vidět, že se proměnná Mapped Pot mění při pohybu potenciometrem, aby odpovídala hodnotám, které jsme určili pro naše levé a pravé hrany. Udělejte si chvilku času na posezení a poděkujte skriptu ExtensionMethods. Není v dohledu kalkulačka.

Poznámka: Pokud si všimnete, že jsou vaše hodnoty obrácené, takže když je váš potenciometr zcela vpravo, dostanete pro svoji proměnnou Mapped Pot zápornou hodnotu, může být váš potenciometr nastaven nesprávně. Naštěstí to můžete opravit, aniž byste museli přepojovat. Hodnoty můžete jednoduše přepnout, když je přemapujete:

Nyní konečně máme použitelné hodnoty. Nyní zbývá jen přiřadit tyto hodnoty k pozici X naší sféry:

malina pi 3b vs 3b+
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Uložte skript, vraťte se zpět do editoru Unity a stiskněte Play. Nyní byste měli být schopni přesunout svou sféru doleva a doprava pomocí potenciometru!

Uvedení tlačítka do provozu

Nyní, když se naše sféra pohybuje, nebylo by hezké mít způsob, jak věci trochu zpomalit, když se dostaneme do úzkých? Pomocí tlačítka zpomalíme čas ve hře. Otevřete skript sphereMover a přidejte tento kód do funkce Aktualizace

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

Nyní máme mechaniku naší hry, přidejme nějaké překážky! Použijeme přirozeného nepřítele sféry, krychle. V hierarchii klikněte na Vytvořit> 3D objekt> Kostka . V inspektoru kostky Přidejte komponentu> fyzika> tuhé tělo . Nastavte hodnotu Drag tuhého těla na 5. Také v komponentě Box Collider v inspektoru vyberte Is Trigger. To nám umožní detekovat kolize s naší sférou.

Vytvořte skript na krychli a zavolejte jej CollideWithSphere , otevřete skript a odstraňte funkce Start a Update, protože je tentokrát nebudeme potřebovat. Zadejte tento kód:

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

OnTriggerEnter odešle zprávu, kdykoli spouštěč spouštěče zasáhne jiný sběrač. V tomto případě říkáme, aby zničila vše, čeho se dotkne. Uložte skript a vraťte se zpět do editoru Unity. Přetáhněte krychli z hierarchie na panel Projekt. Všimnete si, že text krychle v hierarchii zmodral. Důvodem je, že jsme vytvořili prefabrikát a uložili jej do našeho projektu. Odstraňte svou krychli z hierarchie.

Vše, co nyní potřebujeme, je skript k rozmnožování kostek. V hierarchii klikněte na Vytvořit> Vytvořit prázdné , a přejmenujte jej na Game Manager v Inspektoru a přidejte do něj skript s názvem gameManager. Otevřete skript a přidejte 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. Zpět do editoru vyberte v hierarchii Game Manager a přetáhněte prefabriku krychle z panelu projektu do proměnné Cube v Inspektoru. Zde také vyplňte hodnoty pro své tření. Můžete si s tím pohrávat, aby to bylo tak těžké nebo snadné, jak se vám líbí. Mějte na paměti, že stojí za to, aby se vaše nejnižší kostky objevily dostatečně vysoko, aby Uniduino mohlo inicializovat - prohrát hru dříve, než se budete moci hýbat, může být frustrující!

Dokončený projekt

Když nyní stisknete tlačítko play, kostky se nad vámi objeví a spadnou. Pomocí potenciometru se jim můžete vyhnout a tlačítkem zpomalit čas.

V tomto projektu jsme vytvořili vlastní ovladač s Arduinem, nakonfigurovali jsme Unity a Uniduino tak, aby s ním komunikovaly, a vytvořili jsme jednoduchou hru, která to vyzkouší. Zde uvedené koncepty lze aplikovat na téměř jakýkoli projekt a existují dokonce herní zácpy, které se specializují na vlastní ovladače .

S Arduino a Unity můžete vytvořit vlastní ovladač téměř z čehokoli. Vytvořili jste hi-fi, které ovládá vesmírnou loď? Toustovač, který ovládá plošinovou hru?

Pokud jste vytvořili takový projekt, rád bych ho viděl! Napište to do komentářů níže!

Podíl Podíl tweet E-mailem 6 zvukových alternativ: Nejlepší bezplatné nebo levné aplikace pro audioknihy

Pokud vás nebaví platit za audioknihy, zde je několik skvělých aplikací, které vám umožní poslouchat je zdarma a legálně.

Číst dále
Související témata
  • DIY
  • Programování
  • Arduino
  • Herní ovladač
  • Vývoj hry
O autorovi Ian Buckley(216 publikovaných článků)

Ian Buckley je nezávislý novinář, hudebník, performer a video producent žijící v Berlíně v Německu. Když nepíše nebo není na jevišti, pohrává si s elektronikou nebo kódem pro kutily v naději, že se stane šíleným vědcem.

Více od Iana Buckleyho

Přihlaste se k odběru našeho zpravodaje

Připojte se k našemu zpravodaji a získejte technické tipy, recenze, bezplatné elektronické knihy a exkluzivní nabídky!

Kliknutím sem se přihlásíte k odběru
Kategorie Diy