Obsah:
2025 Autor: John Day | [email protected]. Naposledy změněno: 2025-01-13 06:57
Přemýšleli jste někdy o tom, jak vývojáři her vytvářejí úžasné hry, které si lidé na celém světě užívají? Dnes vám k tomu dám jen malou nápovědu tím, že vytvořím malou hru pro více hráčů, která bude ovládána buď ovladačem Arduino, který také vytvoříte. Pojďme tedy začít.
Zásoby
Budete potřebovat:
- Notebook
- Unity Engine
- ID C#, které funguje s Unity, jako je Visual Studio nebo Atom. (Budu používat kód Visual Studio)
- 2X Arduino Nano
- 2X Big Bread Board
- 2X Malé pečivo
- Přepínač 4X (tlačítko)
- 4x odpor 200 ohmů
- 12X propojovací vodiče pro muže a muže
- Arduino IDE
Bude to užitečné, pokud máte základní znalosti o používání Unity, ale nebude to mít vliv na váš postup, protože se s ním seznámíte během vytváření hry.
Odkaz na stažení Unity Engine:
store.unity.com/download-nuo
Odkaz pro stažení IDE Visual Studio Code:
code.visualstudio.com/download
Odkaz pro stažení Arduino IDE:
www.arduino.cc/en/Main/Software
Krok 1: Nastavení hranic hry
Nejprve si musíte stáhnout jednotu
Až to budete mít hotové, můžete začít nastavovat zobrazení hry.
Otevřete nový projekt Unity, pojmenujte jej a vyberte 2D hru.
Když se projekt otevře, všimněte si, že existují 3 hlavní sekce s názvem
- Hierarchie (zde budou přidány všechny vaše herní objekty a detaily).
- Scéna (kde si nastavíte pohled na hru).
- Hra (kde si můžete vyzkoušet, jak bude vypadat skutečná hra).
Všimněte si, že v hierarchii je vaše scéna a pod scénou je „hlavní kamera“. Když vyberete kameru z hierarchie, bude vybrána ve scéně
(Cokoli v hranicích této kamery se ukáže ve skutečné hře).
Podívejte se na obrázek 1
Naše hra se skládá ze dvou desek, koule, která se pohybuje kolem, a hranic, které omezují pohyb desek a míče.
Začněme vytvořením hranic.
- Chcete -li vytvořit nový herní objekt, vyberte Aktiva> Vytvořit> Skřítci> čtverec (pojmenujte jej „pravé a levé ohraničení“) Podívejte se na obrázek 2
- Přetáhněte pravé a levé ohraničení do hierarchie a ve scéně se objeví čtverec.
- Upravte polohu jeho osy x na (5) „pravé a levé ohraničení“> inspektor> transformace> poloha> X. Podívejte se na obrázek 3
- Poté upravte jeho měřítko tak, aby pokrylo okraje fotoaparátu (přetažením horního a dolního okraje čtverce jej roztáhnete).
- Upravte jeho barvu „z pravého a levého okraje“> inspektor> vykreslení spritu> barva. Podívejte se na obrázek 3
- Přejděte dolů v inspektoru a vyberte přidat komponentu, poté zadejte Rigidbody2D a stiskněte klávesu Enter, což v podstatě přidá fyziku vašemu hernímu objektu, protože mu dává hmotnost, gravitaci a detekci kolizí. V naší hře však gravitaci nepotřebujeme, takže místo ní vytvořte gravitaci 0. Budete také muset zmrazit polohu a rotaci, aby se ohraničení při srážce nepohybovalo. Podívejte se na obrázek 4
- vyberte přidat komponentu, poté zadejte Box Collider 2D a stiskněte Enter. Tím se přidá oblast kolem objektu hry, kde lze detekovat kolize. Podívejte se na obrázek 4
- Nyní vyberte pravé a levé ohraničení a stisknutím (ctrl+d) jej duplikujte.
- Přejmenujte jej na „levé ohraničení“a přejmenujte první („pravé ohraničení“).
- Vyberte levé ohraničení a stejným způsobem upravte jeho polohu osy x na (-5) v kroku 3. Nyní máte pravé a levé ohraničení.
Opakujte předchozích 10 kroků s okraji nahoru a dolů a změňte pozici y čtverce namísto polohy x. Konečný náhled by měl být něco podobného jako na obrázku.
Podívejte se na obrázek 5
Krok 2: Přidání desek a výroba ovladačů
Přidávání desek
Vytvořte nový herní objekt a pojmenujte jej hráč 1.
Upravit:
- Měřítko: X (1,2), Y (0,15), Z (1)
- Pozice: X (0), Y (-3,6), z (0)
- Přidejte BoxCollider2D
- Přidejte Rigidbody 2D a zmrazte osy y a z.
Duplikujte (ctrl+d) a přejmenujte přehrávač kopií 2.
Upravit:
- Měřítko: X (1,2), Y (0,15), Z (1)
- Pozice: X (0), Y (3,6), z (0)
- BoxCollider už tam bude.
- Už tu bude Rigidbody 2D a osy y a z již zamrznou.
Podívejte se na obrázek 1
Výroba ovladačů
Budete potřebovat:
- 2X Arduino Nano
- 2X Big Bread Board
- 2X Malé pečivo
- Přepínač 4X (tlačítko)
- 4X odpor
- 12X propojovací vodiče pro muže a muže
Nyní se podívejte na fotografie a mapování chlebových desek a sestavte joysticky.
- Připojte jeden čip Arduino Nano pomocí malé desky na chléb.
- připojte 2 přepínače na velké desce chleba, jak je znázorněno na obrázku. Zkuste zachovat pravou stranu desky na chleba symetrickou k levé, protože díky tomu bude joystick vypadat lépe (jako symetrii můžete použít 30. sloupec čára)
- Propojte levý horní kolík levého tlačítka s 5V kolíkem v Arduinu na malém chlebovém prkénku (věci, které jsou propojeny se stejným sloupcem v prkénku, jsou navzájem propojeny).
- Propojte pravý horní kolík pravého tlačítka s 5V kolíkem v Arduinu.
- Pomocí rezistoru spojte pravý dolní kolík levého tlačítka s bodem na 31. sloupci.
- Pomocí rezistoru spojte levý dolní kolík pravého tlačítka s bodem na 29. sloupci.
- Připojte odpory pomocí kolíku GND v Arduinu.
- Propojte pravý horní kolík levého tlačítka s kolíkem D3 v Arduinu.
- Propojte levý horní kolík pravého tlačítka s kolíkem D9 v Arduinu.
- Nyní zopakujte tyto kroky a vytvořte druhý ovladač.
Krok 3: Připojení Arduina k sériovému portu
Nejprve budete muset nainstalovat Arduino IDE.
Jakmile jsou nainstalovány, můžete začít vytvořením programu Arduino, který přijímá vstupy z tlačítek a ukládá je do sériového portu (COM port). Když je deska Arduino připojena k vašemu notebooku, operační systém automaticky rozpozná desku jako sériový port, do kterého lze nahrávat programy. Hodnoty uložené v sériovém portu lze použít v dalším kroku, když připojíme Unity Engine k sériovému portu.
Nyní připojíme Arduino k sériovému portu.
Podívat se na obrázky
- Připojte Arduino k notebooku
- Nástroje> Deska> Arduino Nano
- Pokud je váš čip Arduino nejnovější (2018-2020) Nástroje> Procesor> ATmega328P (Old Bootloader).
- Pokud váš čip Arduino není aktuální (před rokem 2018) Nástroje> Procesor> ATmega328P
- Nástroje> Port> COM (jakékoli číslo se objeví, v mém případě je 10). * Toto je sériový port, kam budou uloženy hodnoty.
- Zkopírujte kód a vložte jej do Arduino IDE a stisknutím ctrl+u nahrajte program.
- Opakujte s druhým Arduinem. (při kroku 5 nezapomeňte zvolit jiný port COM, aby oba ovladače nebyly připojeny ke stejnému sériovému portu).
Kód:
neplatné nastavení () {
Serial.begin (9600); pinMode (3, VSTUP); // Řízení Arduinu, aby přijímal vstup z pinu D3 pinMode (9, INPUT); // Řízení Arduinu, aby přijímalo vstup z pinu D9} void loop () {if (digitalRead (3) == 1) { /* Pokud Arduino přijme vstup 1 Serial.write (1); z pinu 3 Výstup hodnoty 1 na sériový port Serial.flush (); */ zpoždění (2); } if (digitalRead (9) == 1) { /* Pokud Arduino přijme vstup 1 Serial.write (2); z pinu 9 Výstup hodnoty 2 na sériový port Serial.flush (); */ zpoždění (2); }}
Vysvětlení programu:
Tento kód jednoduše přebírá vstup z pinu D3 a pinu D9 v Arduinu, které jsou připojeny k tlačítkům. Tlačítka jsou buď stisknutá nebo nestlačená, což znamená, že hodnoty, které jsou z nich převzaty, jsou buď 1 (stisknuto), nebo 0 (nestisknuto). Pokud je vstup z pravého tlačítka (z D9) 1 (stisknuto), uložte hodnotu 1 do sériového portu. Pokud je vstup z levého tlačítka (z D3) 1 (stisknuto), uložte do sériového portu hodnotu 2.
Krok 4: Propojení jednotky pomocí sériového portu
V tomto kroku identifikujeme sériový port v Unity, aby mohl přijímat vstupy z Arduina po stisknutí tlačítek. Nainstalujte si na svůj notebook Visual Studio Code. Poté přejděte na Unity, vyberte hráče 1 z hierarchie, přejděte dolů, vyberte přidat komponentu a zadejte player1_motion a poté stiskněte Enter. Podívejte se na obrázek 1
V inspektoru se vytvoří skript C#, klikněte na něj pravým tlačítkem a vyberte upravit skript, měl by se otevřít kód vizuálního studia a zobrazí výchozí kód, který vypadá jako obrázek 2.
Zkopírujte následující kód a poté změňte „SerialPort sp = new SerialPort (" COM10 ", 9600);" s SerialPort sp = nový SerialPort („COM port, ke kterému je připojeno vaše Arduino“, 9600); jeho najdete tak, že se vrátíte ke svému kódu Arduino a vyberete Nástroje> Port> COM (jakékoli číslo se objeví).
Kód:
pomocí System. Collections;
pomocí System. Collections. Generic; pomocí UnityEngine; pomocí System. IO. Ports; public class player1_motion: MonoBehaviour {float speed = 8; soukromý pohyblivý pohyb množství; SerialPort sp = nový SerialPort ("COM10", 9600); // Start je volán před první aktualizací rámce void Start () {sp. Open (); sp. ReadTimeout = 1; } // Aktualizace je volána jednou za snímek neplatná Update () {amounttomove = speed*0,01f; if (sp. IsOpen) {try {moveObject (sp. ReadByte ()); print (sp. ReadByte ()); } catch (System. Exception) {}}} void moveObject (int Direction) {if (Direction == 1) {transform. Translate (Vector3.left*amounttomove, Space. World); } if (Direction == 2) {transform. Translate (Vector3.right*amounttomove, Space. World); }}}
Vysvětlení kódu:
Tento kód říká jednotě přijímat vstupy ze sériového portu (COM 10). Po stisknutí levého tlačítka odešle Arduino na sériový port hodnotu 1, pokud jednota přijme 1 ze sériového portu, přidá se rychlost do herního objektu „hráč 1“v levém směru. Po stisknutí pravého tlačítka odešle Arduino na sériový port hodnotu 2, pokud jednota přijme 2 ze sériového portu, přidá se rychlost k objektu hry „hráč 1“správným směrem. pokud sériový port neobdrží hodnotu ze sériového portu, nepřidá se žádná rychlost v obou směrech, deska zůstane nehybná.
Po zkopírování kódu sestavte a spusťte kód stisknutím klávesy F5. Vraťte se zpět k jednotě a stiskněte tlačítko Přehrát, hráč 1 by se měl pohybovat doprava, když stisknete doprava a doleva, když stisknete doleva.
Nyní proveďte stejné kroky ještě jednou, ale s přehrávačem 2 a nezapomeňte napsat „Přidat komponentu“player2_motion místo player1_motion a identifikovat druhý port COM, ke kterému je připojen druhý řadič, nikoli stejný sériový port.
V samotném kódu budete také muset změnit „public class player1_motion: MonoBehaviour“na „public class player2_motion: MonoBehaviour“.
Krok 5: Přidání míče
- Přidejte nový herní objekt, ale tentokrát zvolte místo čtverce kruh.
- Přejmenujte jej na „míč“.
- Přetahujte v hierarchii.
- Upravte měřítko (X: 0,2 - Y: 0,2 - Z: 0,2).
- Přidejte Rigidbody 2D a zmrazte pouze osu Z.
- Změňte hmotnost na 0,0001
- Změňte gravitační stupnici na 0.
- Přidejte Box Collider 2D.
- Přejděte na Aktiva> Vytvořit> Fyzikální materiál 2D Podívejte se na obrázek 1
- změnit jeho název na „odrazit“
- Změňte tření na nulu od inspektora
- Změňte odskočení na 1 od inspektora
- Přetáhněte "odraz" do Rigidbody 2D> Materiál Podívejte se na obrázek 2
- Z hierarchie znovu vyberte „míč“a přejděte na přidání komponenty a zadejte Ball_movement a poté stiskněte Enter.
- Klikněte pravým tlačítkem na skript a vyberte Upravit skript.
- Zkopírujte níže uvedený kód a stisknutím klávesy F5 jej sestavte a spusťte.
Kód:
pomocí System. Collections;
pomocí System. Collections. Generic; pomocí UnityEngine; public class Ball_movement: MonoBehaviour {// Start je volán před aktualizací prvního rámce private float force = 2; void Start () {StartCoroutine (move ()); } IEnumerator move () {yield return new WaitForSeconds (2); GetComponent (). AddForce (nový Vector2 (1f, 0,5f)*0,02f*síla); }}
Vysvětlení kódu
Tento kód udává míči rychlost v obou směrech ve směru X a Y se stejnou velikostí, díky které se míč pohybuje pod úhlem 45 °. V kroku 8 jsme do míče přidali fyzikální materiál a změnili jeho skákací schopnost, což udržuje pohyb míče v celé hře.
Krok 6: Dokončení hry
Nyní musíme umožnit prohru, pokud spustíte hru, všimnete si, že když míč projde hráče 1 nebo hráče 2, jen se odrazí od hranice a to není přesně to, co v naší hře potřebujeme. Místo toho chceme vytvořit počítadlo skóre, které počítá skóre pokaždé, když se míč dotkne ohraničení nahoru nebo dolů, a resetuje polohu míče.
- Přetáhněte míč z hierarchie do projektu, vyrobili jste si panelák, abyste jej mohli použít později.
- Klikněte pravým tlačítkem na Hierarchii a vyberte Vytvořit prázdné. zobrazí se prázdný předmět, přejmenujte jej na respawn koule a změňte jeho polohu tak, aby byla stejná jako poloha míče.
- Klikněte pravým tlačítkem na hierarchii a vyberte UI >> Text. Všimněte si, že text doprovází plátno, poloha textu ve hře závisí na poloze textu na plátně, nikoli na hranicích naší hry. (Podívejte se na obrázek 1).
- Změňte polohu textu na libovolné místo.
- Kroky 3 a 4 opakujte znovu pro skóre druhého hráče.
- Zadejte první text „Skóre hráče 1: 0“a zadejte druhý text „Skóre hráče 2: 0“. (Podívejte se na obrázek 2).
- Vytvořte skript v horním okraji s názvem p1wins a zkopírujte následující kód.
Kód:
pomocí System. Collections;
pomocí System. Collections. Generic; pomocí UnityEngine; pomocí UnityEngine. SceneManagement; pomocí UnityEngine. UI; public class p1wins: MonoBehaviour {public Text score; veřejné Transformovat ball_respawn; veřejný míč GameObject; soukromé int p1 = 0; // Start je volán před zrušením první aktualizace rámce Start () {} // Aktualizace je volána jednou za neplatný snímek Update () {score.text = "Skóre hráče 1:" + p1; } void OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Destroy (other.gameObject); p1 ++; Instantiate (ball, ball_respawn.position, ball_respawn.rotation); }}}
8. Přetáhněte a pusťte prefabrikovaný míč z projektu v kroku 1 do parametru Ball. (Podívejte se na obrázek 3)
9. Přetáhněte míč respawn z hierarchie na parametr Ball-rerspawn. (Podívejte se na obrázek 3)
10. přetáhněte skóre 1 hráče z hierarchie do parametru Score. (Podívejte se na obrázek 3)
Vysvětlení kódu:
Když se míč srazí s horním okrajem, zničí se a znovu se respawnuje v pozici ball_respawn, kterou jsme přiřadili v kroku 2. cílem udělat z míče prefabrikát je jeho schopnost respawnu se všemi jeho vlastnostmi, v opačném případě, pokud jsme míč použili z hierarchie se bude respawnovat, ale nebude se hýbat. Také když se míč srazí s horním okrajem, hodnota, která se původně rovná 0, se nazývá p1, zvýší se o 1. Tato hodnota se zobrazí jako text, takže když se míč srazí s horním okrajem, skóre pro hráče 1 se zvýší o 1.
Nyní proveďte kroky 7, 8, 9 a 10 pro dolní hranici
pro krok 7 vytvořte skript s názvem p2wins a místo toho zkopírujte následující kód.
pro krok 10 přetáhněte skóre hráče 2 z hierarchie do parametru Score.
Kód:
pomocí System. Collections;
pomocí System. Collections. Generic; pomocí UnityEngine; pomocí UnityEngine. SceneManagement; pomocí UnityEngine. UI; public class p2wins: MonoBehaviour {public Text score; veřejné Transformovat ball_respawn; veřejný míč GameObject; soukromé int p2 = 0; // Start je volán před zrušením první aktualizace rámce Start () {} // Aktualizace je volána jednou za neplatný snímek Update () {score.text = "Skóre hráče 2:" + p2; } void OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Destroy (other.gameObject); p2 ++; Instantiate (ball, ball_respawn.position, ball_respawn.rotation); }}}